protobuf-array-stream
Version:
Stream and decode Protocol Buffer arrays without memory issues - perfect for processing large datasets
2 lines (1 loc) • 5.94 kB
JavaScript
"use strict";var v=Object.create;var I=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var M=(s,e)=>{for(var t in e)I(s,t,{get:e[t],enumerable:!0})},m=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of B(e))!x.call(s,o)&&o!==t&&I(s,o,{get:()=>e[o],enumerable:!(i=k(e,o))||i.enumerable});return s};var G=(s,e,t)=>(t=s!=null?v(L(s)):{},m(e||!s||!s.__esModule?I(t,"default",{value:s,enumerable:!0}):t,s)),Y=s=>m(I({},"__esModule",{value:!0}),s);var X={};M(X,{RepeatedFieldStream:()=>g});module.exports=Y(X);var _=require("stream"),E=G(require("protobufjs"));var r={INT_32:"int32",INT_64:"int64",UINT_32:"uint32",UINT_64:"uint64",SINT_32:"sint32",SINT_64:"sint64",BOOL:"bool",ENUM:"enum",FIXED_64:"fixed64",SFIXED_64:"sfixed64",DOUBLE:"double",STRING:"string",BYTES:"bytes",FIXED_32:"fixed32",SFIXED_32:"sfixed32",FLOAT:"float"},f={VARINT:0,I64:1,LEN:2,I32:5},c={TAG:0,LENGTH:1,PAYLOAD:3},P={MSB:127,WIRE_TYPE:7},h={MESSAGE:{NOT_EXISTS:s=>`Invalid message: '${s}' does not exist in the proto file.`,EMPTY_FIELD:s=>`Invalid message: '${s}' does not have any fields.`,MORE_FIELDS:(s,e)=>`Invalid message: '${s}' should only have one field, but has ${e} fields.`,NOT_REPEATED:(s,e)=>`Invalid message: The field '${e}' in '${s}' must be 'repeated'.`},TAG:(s,e)=>`Expected array-like structure: Tag should repeat as ${s}, but encountered a different tag: ${e}.`,PAYLOAD:s=>`Failed to decode protobuf payload: ${s instanceof Error?s.message:String(s)}`};var S=class extends Error{constructor(t,i){super(t);this.cause=i;this.name="RepeatedFieldStreamError"}},T=S;var a=class a extends _.Transform{constructor(e){super({readableObjectMode:!0,writableObjectMode:!1});let{root:t,messageName:i}=e;a.validateMessage(t,i),this.repeatedField=a.getRepeatedFieldDetails(t,i),this.currentPayloadSize=a.getPayloadSizeInBytes(this.repeatedField.wireType),this.buffer=Buffer.alloc(0),this.tag=null,this.readOffset=0,this.nextToken=c.TAG}decodePayload(e){try{return this.repeatedField.decode(e)}catch(t){throw new T(h.PAYLOAD(t))}}cleanup(){this.repeatedField={name:"",wireType:0,isPacked:!1,decode:()=>({})},this.buffer=Buffer.alloc(0)}detectVarint(){let e=!0;for(;e&&this.readOffset<this.buffer.length;){let t=this.buffer.at(this.readOffset);this.readOffset+=1,t>>7===0&&(e=!1)}return!e}detectPayload(){for(;this.readOffset<this.currentPayloadSize&&this.readOffset<this.buffer.length;)this.readOffset+=1;return this.readOffset===this.currentPayloadSize}decode(){if(this.nextToken===c.TAG&&this.detectVarint()){let e=this.buffer.subarray(0,this.readOffset),t=a.decodeVarint(e);if(!this.tag)this.tag=t;else if(t!==this.tag)throw new T(h.TAG(this.tag,t));this.buffer=this.buffer.subarray(this.readOffset),this.readOffset=0,this.nextToken=this.repeatedField.wireType===f.LEN||this.repeatedField.isPacked?c.LENGTH:c.PAYLOAD}if(this.nextToken===c.LENGTH&&this.detectVarint()){let e=this.buffer.subarray(0,this.readOffset);this.repeatedField.isPacked||(this.currentPayloadSize=a.decodeVarint(e)),this.buffer=this.buffer.subarray(this.readOffset),this.readOffset=0,this.nextToken=c.PAYLOAD}if(this.nextToken===c.PAYLOAD&&(this.repeatedField.wireType===f.VARINT?this.detectVarint():this.detectPayload())){let e=this.buffer.subarray(0,this.readOffset),t=this.decodePayload(e);this.push(t),this.buffer=this.buffer.subarray(this.readOffset),this.readOffset=0,this.repeatedField.isPacked?this.nextToken=c.PAYLOAD:(this.currentPayloadSize=0,this.nextToken=c.TAG)}}_transform(e,t,i){try{for(this.buffer=Buffer.concat([this.buffer,e]);this.readOffset<this.buffer.length;)this.decode();i()}catch(o){i(o)}}_final(e){this.cleanup(),e()}_flush(e){try{for(;this.readOffset<this.buffer.length;)this.decode();e()}catch(t){e(t)}}};a.loadRootFromFileSync=E.default.loadSync,a.loadRootFromFile=E.default.load,a.loadRootFromJSON=E.default.Root.fromJSON,a.loadRootFromSource=(e,t)=>E.default.parse(e,t).root,a.validateMessage=(e,t)=>{var p,b;let i;try{i=e.lookupType(t)}catch(A){throw new T(h.MESSAGE.NOT_EXISTS(t))}let o=((p=i==null?void 0:i.fieldsArray)==null?void 0:p.length)||0,d=(b=i==null?void 0:i.fieldsArray)==null?void 0:b.at(0);if(!d)throw new T(h.MESSAGE.EMPTY_FIELD(t));if(o>1)throw new T(h.MESSAGE.MORE_FIELDS(t,o));if(!(d!=null&&d.repeated))throw new T(h.MESSAGE.NOT_REPEATED(t,d.name))},a.getRepeatedFieldDetails=(e,t)=>{let i=l=>{switch(l){case r.INT_32:case r.INT_64:case r.UINT_32:case r.UINT_64:case r.SINT_32:case r.SINT_64:case r.BOOL:case r.ENUM:return f.VARINT;case r.FIXED_64:case r.SFIXED_64:case r.DOUBLE:return f.I64;case r.FIXED_32:case r.SFIXED_32:case r.FLOAT:return f.I32;case r.STRING:case r.BYTES:default:return f.LEN}},o=(l,O)=>{let u=l;return Object.values(r).includes(l)||O.lookupTypeOrEnum(l)instanceof E.default.Enum&&(u=r.INT_32),u},d=(l,O)=>{if(!Object.values(r).includes(l)){let u=O.lookupType(l);return n=>{let R=u.decode(n);return u.toObject(R)}}return u=>{let n=E.default.Reader.create(u);switch(y){case r.INT_32:return n.int32();case r.INT_64:return n.int64();case r.UINT_32:return n.uint32();case r.UINT_64:return n.uint64();case r.SINT_32:return n.sint32();case r.SINT_64:return n.sint64();case r.BOOL:return n.bool();case r.FIXED_64:return n.fixed64();case r.SFIXED_64:return n.sfixed64();case r.DOUBLE:return n.double();case r.FIXED_32:return n.fixed32();case r.SFIXED_32:return n.sfixed32();case r.FLOAT:return n.float();case r.STRING:return u.toString("utf8");case r.BYTES:default:return u}}},b=e.lookupType(t).fieldsArray.at(0),{name:A,packed:D}=b,y=o(b.type,e),N=i(y),F=[f.VARINT,f.I64,f.I32].includes(N)&&D!==!1,w=d(y,e);return{name:A,wireType:N,isPacked:F,decode:w}},a.getPayloadSizeInBytes=e=>{switch(e){case f.I32:return 4;case f.I64:return 8;default:return 0}},a.decodeVarint=e=>{let t=0;for(let i=0;i<e.length;i++){let d=e[i]&P.MSB,p=i*7;t=t|d<<p}return t};var g=a;0&&(module.exports={RepeatedFieldStream});