{"version":3,"file":"RawStreamSSRPlugin.cjs","names":[],"sources":["../../../../src/ssr/serializer/RawStreamSSRPlugin.ts"],"sourcesContent":["import { createPlugin } from 'seroval'\nimport { RawStream } from './RawStream'\nimport { encodeText, pumpEncodedStream, toBase64 } from './rawStreamCodec'\nimport type { PluginInfo, SerovalNode } from 'seroval'\n\n// This module is server-only. Node's Buffer encodes base64 ~25x faster than\n// the web fallback; the view avoids copying the chunk first.\nconst nodeBuffer: typeof Buffer | undefined = (globalThis as any).Buffer\nconst toBase64Fast = nodeBuffer\n  ? (bytes: Uint8Array) =>\n      nodeBuffer\n        .from(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n        .toString('base64')\n  : toBase64\n\nconst BINARY_FACTORY = () => {}\nconst TEXT_FACTORY = () => {}\ntype RawStreamFactory = typeof BINARY_FACTORY\n\n// These factories are injected into HTML and must be self-contained. Clearing\n// both captured values on terminal events releases Seroval's encoded buffer.\nconst FACTORY_BINARY = `((s,u=1)=>new ReadableStream({start(c,f){f=s.on({next(b){const d=atob(b),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)},throw(e){s=u=0;c.error(e)},return(){s=u=0;c.close()}});u=u&&f},cancel(){u&&u()}}))`\n\nconst FACTORY_TEXT = `((s,u=1,e=new TextEncoder)=>new ReadableStream({start(c,f){f=s.on({next(v){const x=v.slice(1);if(v[0]==='t')c.enqueue(e.encode(x));else{const d=atob(x),a=new Uint8Array(d.length);for(let i=0;i<d.length;i++)a[i]=d.charCodeAt(i);c.enqueue(a)}},throw(x){s=u=0;c.error(x)},return(){s=u=0;c.close()}});u=u&&f},cancel(){u&&u()}}))`\n\nfunction makeFactoryPlugin(\n  tag: string,\n  sentinel: RawStreamFactory,\n  source: string,\n) {\n  return createPlugin<RawStreamFactory, PluginInfo>({\n    tag,\n    test(value) {\n      return value === sentinel\n    },\n    parse: {\n      stream() {\n        return {}\n      },\n    },\n    serialize() {\n      return source\n    },\n    deserialize: undefined as never,\n  })\n}\n\nconst RawStreamFactoryBinaryPlugin = /* @__PURE__ */ makeFactoryPlugin(\n  'tss/RawStreamFactory',\n  BINARY_FACTORY,\n  FACTORY_BINARY,\n)\n\nconst RawStreamFactoryTextPlugin = /* @__PURE__ */ makeFactoryPlugin(\n  'tss/RawStreamFactoryText',\n  TEXT_FACTORY,\n  FACTORY_TEXT,\n)\n\ninterface RawStreamSSRNode extends PluginInfo {\n  factory: SerovalNode\n  stream: SerovalNode\n}\n\n/** SSR-only RawStream plugin for streaming JavaScript into HTML. */\nexport const RawStreamSSRPlugin = /* @__PURE__ */ createPlugin<\n  RawStream,\n  RawStreamSSRNode\n>({\n  tag: 'tss/RawStream',\n  extends: [RawStreamFactoryBinaryPlugin, RawStreamFactoryTextPlugin],\n  test(value: unknown) {\n    return value instanceof RawStream\n  },\n  parse: {\n    stream(value, ctx) {\n      const text = value.hint === 'text'\n      const factory = ctx.parse(text ? TEXT_FACTORY : BINARY_FACTORY)\n      const [stream, stop] = pumpEncodedStream(\n        value.stream,\n        text ? encodeText : toBase64Fast,\n      )\n      ctx.addCleanup(stop)\n      return { factory, stream: ctx.parse(stream) }\n    },\n  },\n  serialize(node, ctx) {\n    return (\n      '(' +\n      ctx.serialize(node.factory) +\n      ')(' +\n      ctx.serialize(node.stream) +\n      ')'\n    )\n  },\n  deserialize: undefined as never,\n})\n"],"mappings":";;;;AAOA,MAAM,aAAyC,WAAmB;AAClE,MAAM,eAAe,cAChB,UACC,WACG,KAAK,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU,EACrD,SAAS,QAAQ,IACtB,uBAAA;AAEJ,MAAM,uBAAuB,CAAC;AAC9B,MAAM,qBAAqB,CAAC;AAK5B,MAAM,iBAAiB;AAEvB,MAAM,eAAe;AAErB,SAAS,kBACP,KACA,UACA,QACA;CACA,QAAA,GAAA,QAAA,cAAkD;EAChD;EACA,KAAK,OAAO;GACV,OAAO,UAAU;EACnB;EACA,OAAO,EACL,SAAS;GACP,OAAO,CAAC;EACV,EACF;EACA,YAAY;GACV,OAAO;EACT;EACA,aAAa,KAAA;CACf,CAAC;AACH;AAEA,MAAM,+BAA+C,kCACnD,wBACA,gBACA,cACF;AAEA,MAAM,6BAA6C,kCACjD,4BACA,cACA,YACF;;AAQA,MAAa,qBAAqC,iBAAA,GAAA,QAAA,cAGhD;CACA,KAAK;CACL,SAAS,CAAC,8BAA8B,0BAA0B;CAClE,KAAK,OAAgB;EACnB,OAAO,iBAAiB,kBAAA;CAC1B;CACA,OAAO,EACL,OAAO,OAAO,KAAK;EACjB,MAAM,OAAO,MAAM,SAAS;EAC5B,MAAM,UAAU,IAAI,MAAM,OAAO,eAAe,cAAc;EAC9D,MAAM,CAAC,QAAQ,QAAQ,uBAAA,kBACrB,MAAM,QACN,OAAO,uBAAA,aAAa,YACtB;EACA,IAAI,WAAW,IAAI;EACnB,OAAO;GAAE;GAAS,QAAQ,IAAI,MAAM,MAAM;EAAE;CAC9C,EACF;CACA,UAAU,MAAM,KAAK;EACnB,OACE,MACA,IAAI,UAAU,KAAK,OAAO,IAC1B,OACA,IAAI,UAAU,KAAK,MAAM,IACzB;CAEJ;CACA,aAAa,KAAA;AACf,CAAC"}