tupleson
Version:
A hackable JSON serializer/deserializer
1 lines • 3.05 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/async/handlers/tsonAsyncIterable.ts"],"sourcesContent":["import {\n\tTsonAbortError,\n\tTsonPromiseRejectionError,\n\tTsonStreamInterruptedError,\n} from \"../asyncErrors.js\";\nimport { TsonAsyncType } from \"../asyncTypes.js\";\n\nconst ITERATOR_VALUE = 0;\nconst ITERATOR_ERROR = 1;\nconst ITERATOR_DONE = 2;\ntype SerializedIterableResult =\n\t| [typeof ITERATOR_DONE]\n\t| [typeof ITERATOR_ERROR, unknown]\n\t| [typeof ITERATOR_VALUE, unknown];\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n\treturn (\n\t\t!!value &&\n\t\ttypeof value === \"object\" &&\n\t\ttypeof (value as any)[Symbol.asyncIterator] === \"function\"\n\t);\n}\n\nexport const tsonAsyncIterable: TsonAsyncType<\n\tAsyncIterable<unknown>,\n\tSerializedIterableResult\n> = {\n\tasync: true,\n\tdeserialize: (opts) => {\n\t\treturn (async function* generator() {\n\t\t\tlet next: Awaited<ReturnType<(typeof opts.reader)[\"read\"]>>;\n\n\t\t\twhile (((next = await opts.reader.read()), !next.done)) {\n\t\t\t\tconst { value } = next;\n\t\t\t\tif (value instanceof TsonStreamInterruptedError) {\n\t\t\t\t\tif (value.cause instanceof TsonAbortError) {\n\t\t\t\t\t\topts.close();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow value;\n\t\t\t\t}\n\n\t\t\t\tswitch (value[0]) {\n\t\t\t\t\tcase ITERATOR_DONE: {\n\t\t\t\t\t\topts.close();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase ITERATOR_ERROR: {\n\t\t\t\t\t\topts.close();\n\t\t\t\t\t\tthrow TsonPromiseRejectionError.from(value[1]);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase ITERATOR_VALUE: {\n\t\t\t\t\t\tyield value[1];\n\t\t\t\t\t\tbreak; // <-- breaks the switch, not the loop\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t},\n\tkey: \"AsyncIterable\",\n\tserializeIterator: async function* serialize(opts) {\n\t\ttry {\n\t\t\tfor await (const value of opts.value) {\n\t\t\t\tyield [ITERATOR_VALUE, value];\n\t\t\t}\n\n\t\t\tyield [ITERATOR_DONE];\n\t\t} catch (err) {\n\t\t\tyield [ITERATOR_ERROR, err];\n\t\t}\n\t},\n\ttest: isAsyncIterable,\n};\n"],"mappings":"AAAA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAGP,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AAKtB,SAAS,gBAAgB,OAAiD;AACzE,SACC,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,OAAQ,MAAc,OAAO,aAAa,MAAM;AAElD;AAEO,MAAM,oBAGT;AAAA,EACH,OAAO;AAAA,EACP,aAAa,CAAC,SAAS;AACtB,WAAQ,gBAAgB,YAAY;AACnC,UAAI;AAEJ,aAAS,OAAO,MAAM,KAAK,OAAO,KAAK,GAAI,CAAC,KAAK,MAAO;AACvD,cAAM,EAAE,MAAM,IAAI;AAClB,YAAI,iBAAiB,4BAA4B;AAChD,cAAI,MAAM,iBAAiB,gBAAgB;AAC1C,iBAAK,MAAM;AACX;AAAA,UACD;AAEA,gBAAM;AAAA,QACP;AAEA,gBAAQ,MAAM,CAAC,GAAG;AAAA,UACjB,KAAK,eAAe;AACnB,iBAAK,MAAM;AACX;AAAA,UACD;AAAA,UAEA,KAAK,gBAAgB;AACpB,iBAAK,MAAM;AACX,kBAAM,0BAA0B,KAAK,MAAM,CAAC,CAAC;AAAA,UAC9C;AAAA,UAEA,KAAK,gBAAgB;AACpB,kBAAM,MAAM,CAAC;AACb;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,EAAG;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,EACL,mBAAmB,gBAAgB,UAAU,MAAM;AAClD,QAAI;AACH,uBAAiB,SAAS,KAAK,OAAO;AACrC,cAAM,CAAC,gBAAgB,KAAK;AAAA,MAC7B;AAEA,YAAM,CAAC,aAAa;AAAA,IACrB,SAAS,KAAK;AACb,YAAM,CAAC,gBAAgB,GAAG;AAAA,IAC3B;AAAA,EACD;AAAA,EACA,MAAM;AACP;","names":[]}