1 line
11 KiB
Plaintext
1 line
11 KiB
Plaintext
{"version":3,"sources":["HistoryBuffer.coffee"],"names":[],"mappings":"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","file":"HistoryBuffer.js","sourceRoot":"/source/","sourcesContent":["\n#\n# @nodoc\n# An object that holds all applied operations.\n#\n# @note The HistoryBuffer is commonly abbreviated to HB.\n#\nclass HistoryBuffer\n\n #\n # Creates an empty HB.\n # @param {Object} user_id Creator of the HB.\n #\n constructor: (@user_id)->\n @operation_counter = {}\n @buffer = {}\n @change_listeners = []\n @garbage = [] # Will be cleaned on next call of garbageCollector\n @trash = [] # Is deleted. Wait until it is not used anymore.\n @performGarbageCollection = true\n @garbageCollectTimeout = 1000\n @reserved_identifier_counter = 0\n setTimeout @emptyGarbage, @garbageCollectTimeout\n\n emptyGarbage: ()=>\n for o in @garbage\n #if @getOperationCounter(o.uid.creator) > o.uid.op_number\n o.cleanup?()\n\n @garbage = @trash\n @trash = []\n if @garbageCollectTimeout isnt -1\n @garbageCollectTimeoutId = setTimeout @emptyGarbage, @garbageCollectTimeout\n undefined\n\n #\n # Get the user id with wich the History Buffer was initialized.\n #\n getUserId: ()->\n @user_id\n\n addToGarbageCollector: ()->\n if @performGarbageCollection\n for o in arguments\n if o?\n @garbage.push o\n\n stopGarbageCollection: ()->\n @performGarbageCollection = false\n @setManualGarbageCollect()\n @garbage = []\n @trash = []\n\n setManualGarbageCollect: ()->\n @garbageCollectTimeout = -1\n clearTimeout @garbageCollectTimeoutId\n @garbageCollectTimeoutId = undefined\n\n setGarbageCollectTimeout: (@garbageCollectTimeout)->\n\n #\n # I propose to use it in your Framework, to create something like a root element.\n # An operation with this identifier is not propagated to other clients.\n # This is why everybode must create the same operation with this uid.\n #\n getReservedUniqueIdentifier: ()->\n {\n creator : '_'\n op_number : \"_#{@reserved_identifier_counter++}\"\n doSync: false\n }\n\n #\n # Get the operation counter that describes the current state of the document.\n #\n getOperationCounter: (user_id)->\n if not user_id?\n res = {}\n for user,ctn of @operation_counter\n res[user] = ctn\n res\n else\n @operation_counter[user_id]\n\n #\n # Encode this operation in such a way that it can be parsed by remote peers.\n # TODO: Make this more efficient!\n _encode: (state_vector={})->\n json = []\n unknown = (user, o_number)->\n if (not user?) or (not o_number?)\n throw new Error \"dah!\"\n not state_vector[user]? or state_vector[user] <= o_number\n\n for u_name,user of @buffer\n # TODO next, if @state_vector[user] <= state_vector[user]\n for o_number,o of user\n if o.uid.doSync and unknown(u_name, o_number)\n # its necessary to send it, and not known in state_vector\n o_json = o._encode()\n if o.next_cl? # applies for all ops but the most right delimiter!\n # search for the next _known_ operation. (When state_vector is {} then this is the Delimiter)\n o_next = o.next_cl\n while o_next.next_cl? and unknown(o_next.uid.creator, o_next.uid.op_number)\n o_next = o_next.next_cl\n o_json.next = o_next.getUid()\n else if o.prev_cl? # most right delimiter only!\n # same as the above with prev.\n o_prev = o.prev_cl\n while o_prev.prev_cl? and unknown(o_prev.uid.creator, o_prev.uid.op_number)\n o_prev = o_prev.prev_cl\n o_json.prev = o_prev.getUid()\n json.push o_json\n\n json\n\n #\n # Get the number of operations that were created by a user.\n # Accordingly you will get the next operation number that is expected from that user.\n # This will increment the operation counter.\n #\n getNextOperationIdentifier: (user_id)->\n if not user_id?\n user_id = @user_id\n if not @operation_counter[user_id]?\n @operation_counter[user_id] = 0\n uid =\n 'creator' : user_id\n 'op_number' : @operation_counter[user_id]\n 'doSync' : true\n @operation_counter[user_id]++\n uid\n\n #\n # Retrieve an operation from a unique id.\n #\n getOperation: (uid)->\n if uid.uid?\n uid = uid.uid\n @buffer[uid.creator]?[uid.op_number]\n\n #\n # Add an operation to the HB. Note that this will not link it against\n # other operations (it wont executed)\n #\n addOperation: (o)->\n if not @buffer[o.uid.creator]?\n @buffer[o.uid.creator] = {}\n if @buffer[o.uid.creator][o.uid.op_number]?\n throw new Error \"You must not overwrite operations!\"\n @buffer[o.uid.creator][o.uid.op_number] = o\n @number_of_operations_added_to_HB ?= 0 # TODO: Debug, remove this\n @number_of_operations_added_to_HB++\n o\n\n removeOperation: (o)->\n delete @buffer[o.uid.creator]?[o.uid.op_number]\n\n #\n # Increment the operation_counter that defines the current state of the Engine.\n #\n addToCounter: (o)->\n if not @operation_counter[o.uid.creator]?\n @operation_counter[o.uid.creator] = 0\n if typeof o.uid.op_number is 'number' and o.uid.creator isnt @getUserId()\n # TODO: fix this issue better.\n # Operations should income in order\n # Then you don't have to do this..\n if o.uid.op_number is @operation_counter[o.uid.creator]\n @operation_counter[o.uid.creator]++\n while @getOperation({creator:o.uid.creator, op_number: @operation_counter[o.uid.creator]})?\n @operation_counter[o.uid.creator]++\n\n #if @operation_counter[o.uid.creator] isnt (o.uid.op_number + 1)\n #console.log (@operation_counter[o.uid.creator] - (o.uid.op_number + 1))\n #console.log o\n #throw new Error \"You don't receive operations in the proper order. Try counting like this 0,1,2,3,4,.. ;)\"\n\nmodule.exports = HistoryBuffer\n"]} |