|  |  |  | /* global dcodeIO, window, textsecure */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function ProtoParser(arrayBuffer, protobuf) { | 
					
						
							|  |  |  |   this.protobuf = protobuf; | 
					
						
							|  |  |  |   this.buffer = new dcodeIO.ByteBuffer(); | 
					
						
							|  |  |  |   this.buffer.append(arrayBuffer); | 
					
						
							|  |  |  |   this.buffer.offset = 0; | 
					
						
							|  |  |  |   this.buffer.limit = arrayBuffer.byteLength; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ProtoParser.prototype = { | 
					
						
							|  |  |  |   constructor: ProtoParser, | 
					
						
							|  |  |  |   next() { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       if (this.buffer.limit === this.buffer.offset) { | 
					
						
							|  |  |  |         return undefined; // eof
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       const len = this.buffer.readVarint32(); | 
					
						
							|  |  |  |       const nextBuffer = this.buffer | 
					
						
							|  |  |  |         .slice(this.buffer.offset, this.buffer.offset + len) | 
					
						
							|  |  |  |         .toArrayBuffer(); | 
					
						
							|  |  |  |       // TODO: de-dupe ByteBuffer.js includes in libaxo/libts
 | 
					
						
							|  |  |  |       // then remove this toArrayBuffer call.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const proto = this.protobuf.decode(nextBuffer); | 
					
						
							|  |  |  |       this.buffer.skip(len); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (proto.avatar) { | 
					
						
							|  |  |  |         const attachmentLen = proto.avatar.length; | 
					
						
							|  |  |  |         proto.avatar.data = this.buffer | 
					
						
							|  |  |  |           .slice(this.buffer.offset, this.buffer.offset + attachmentLen) | 
					
						
							|  |  |  |           .toArrayBuffer(); | 
					
						
							|  |  |  |         this.buffer.skip(attachmentLen); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (proto.profileKey) { | 
					
						
							|  |  |  |         proto.profileKey = proto.profileKey.toArrayBuffer(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return proto; | 
					
						
							|  |  |  |     } catch (error) { | 
					
						
							|  |  |  |       window.log.error( | 
					
						
							|  |  |  |         'ProtoParser.next error:', | 
					
						
							|  |  |  |         error && error.stack ? error.stack : error | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | const GroupBuffer = function Constructor(arrayBuffer) { | 
					
						
							|  |  |  |   ProtoParser.call(this, arrayBuffer, textsecure.protobuf.GroupDetails); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | GroupBuffer.prototype = Object.create(ProtoParser.prototype); | 
					
						
							|  |  |  | GroupBuffer.prototype.constructor = GroupBuffer; | 
					
						
							|  |  |  | const ContactBuffer = function Constructor(arrayBuffer) { | 
					
						
							|  |  |  |   ProtoParser.call(this, arrayBuffer, textsecure.protobuf.ContactDetails); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | ContactBuffer.prototype = Object.create(ProtoParser.prototype); | 
					
						
							|  |  |  | ContactBuffer.prototype.constructor = ContactBuffer; |