write #263 append logic
This commit is contained in:
		
							parent
							
								
									2c708b647d
								
							
						
					
					
						commit
						783c4d8209
					
				| @ -92,24 +92,31 @@ export class LazyStructReader { | ||||
| 
 | ||||
| export class LazyStructWriter { | ||||
|   /** | ||||
|    * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} YEncoder | ||||
|    * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder | ||||
|    */ | ||||
|   constructor (YEncoder) { | ||||
|   constructor (encoder) { | ||||
|     this.fresh = true | ||||
|     this.currClient = 0 | ||||
|     this.startClock = 0 | ||||
|     this.written = 0 | ||||
|     this.encoder = new YEncoder() | ||||
|     this.encoder = encoder | ||||
|     /** | ||||
|      * @type {Array<{ client: number, clock: number, written: number, encoder: UpdateEncoderV1 | UpdateEncoderV2 }>} | ||||
|      * We want to write operations lazily, but also we need to know beforehand how many operations we want to write for each client. | ||||
|      * | ||||
|      * This kind of meta-information (#clients, #structs-per-client-written) is written to the restEncoder. | ||||
|      * | ||||
|      * We fragment the restEncoder and store a slice of it per-client until we know how many clients there are. | ||||
|      * When we flush (toUint8Array) we write the restEncoder using the fragments and the meta-information. | ||||
|      * | ||||
|      * @type {Array<{ written: number, restEncoder: Uint8Array }>} | ||||
|      */ | ||||
|     this.clientStructs = [] | ||||
|     this.YEncoder = YEncoder | ||||
|   } | ||||
| 
 | ||||
|   flushCurr () { | ||||
|     if (!this.fresh) { | ||||
|       this.clientStructs.push({ client: this.currClient, clock: this.startClock, written: this.written, encoder: this.encoder }) | ||||
|       this.clientStructs.push({ written: this.written, restEncoder: encoding.toUint8Array(this.encoder.restEncoder) }) | ||||
|       this.encoder.restEncoder = encoding.createEncoder() | ||||
|       this.fresh = true | ||||
|     } | ||||
|   } | ||||
| @ -123,21 +130,28 @@ export class LazyStructWriter { | ||||
|     if (!this.fresh && this.currClient !== struct.id.client) { | ||||
|       this.flushCurr() | ||||
|       this.currClient = struct.id.client | ||||
|       this.startClock = struct.id.clock | ||||
|       // write next client
 | ||||
|       this.encoder.writeClient(struct.id.client) | ||||
|       // write startClock
 | ||||
|       encoding.writeVarUint(this.encoder.restEncoder, struct.id.clock) | ||||
|     } | ||||
|     struct.write(this.encoder, offset) | ||||
|     this.written++ | ||||
|   } | ||||
| 
 | ||||
|   toUint8Array () { | ||||
|     const encoder = new this.YEncoder() | ||||
|     this.flushCurr() | ||||
| 
 | ||||
|     // this is a fresh encoder because we called flushCurr
 | ||||
|     const restEncoder = this.encoder.restEncoder | ||||
| 
 | ||||
|     /** | ||||
|      * Works similarly to `writeClientsStructs` | ||||
|      * Now we put all the fragments together. | ||||
|      * This works similarly to `writeClientsStructs` | ||||
|      */ | ||||
| 
 | ||||
|     // write # states that were updated - i.e. the clients
 | ||||
|     encoding.writeVarUint(encoder.restEncoder, this.clientStructs.length) | ||||
|     encoding.writeVarUint(restEncoder, this.clientStructs.length) | ||||
| 
 | ||||
|     for (let i = 0; i < this.clientStructs.length; i++) { | ||||
|       const partStructs = this.clientStructs[i] | ||||
| @ -145,12 +159,10 @@ export class LazyStructWriter { | ||||
|        * Works similarly to `writeStructs` | ||||
|        */ | ||||
|       // write # encoded structs
 | ||||
|       encoding.writeVarUint(encoder.restEncoder, partStructs.written) | ||||
|       encoder.writeClient(partStructs.client) | ||||
|       encoding.writeVarUint(encoder.restEncoder, partStructs.clock) | ||||
|       // append what we have been written so far
 | ||||
|       encoder.append(partStructs.encoder) | ||||
|       encoding.writeVarUint(restEncoder, partStructs.written) | ||||
|       // write the rest of the fragment
 | ||||
|       encoding.writeUint8Array(restEncoder, partStructs.restEncoder) | ||||
|     } | ||||
|     return encoder.toUint8Array() | ||||
|     return this.encoder.toUint8Array() | ||||
|   } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user