kkrpc 0.6.4 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +6 -5
  2. package/README.zh.md +5 -5
  3. package/dist/browser-mod.cjs +1 -1
  4. package/dist/browser-mod.d.ts +5 -5
  5. package/dist/browser-mod.js +1 -1
  6. package/dist/browser-mod.js.map +1 -1
  7. package/dist/channel-C4KXiIq_.d.cts.map +1 -1
  8. package/dist/channel-CeSgoHz4.js +5 -0
  9. package/dist/channel-CeSgoHz4.js.map +1 -0
  10. package/dist/channel-DpFB1k-f.cjs +4 -0
  11. package/dist/{channel-CLazgI0u.d.ts → channel-DwZvQkc4.d.ts} +2 -2
  12. package/dist/channel-DwZvQkc4.d.ts.map +1 -0
  13. package/dist/chrome-extension.cjs +1 -1
  14. package/dist/chrome-extension.d.ts +3 -3
  15. package/dist/chrome-extension.js +1 -1
  16. package/dist/chrome-extension.js.map +1 -1
  17. package/dist/{deno-DLEehrMZ.d.ts → deno-Cic3fWXs.d.ts} +2 -2
  18. package/dist/{deno-DLEehrMZ.d.ts.map → deno-Cic3fWXs.d.ts.map} +1 -1
  19. package/dist/{deno-B319Kxci.js → deno-D_tKQ75F.js} +1 -1
  20. package/dist/{deno-B319Kxci.js.map → deno-D_tKQ75F.js.map} +1 -1
  21. package/dist/deno-mod.cjs +1 -1
  22. package/dist/deno-mod.d.ts +4 -4
  23. package/dist/deno-mod.js +1 -1
  24. package/dist/electron-ipc.cjs +1 -1
  25. package/dist/electron-ipc.d.ts +3 -3
  26. package/dist/electron-ipc.js +1 -1
  27. package/dist/electron-ipc.js.map +1 -1
  28. package/dist/electron.cjs +1 -1
  29. package/dist/electron.d.ts +3 -3
  30. package/dist/electron.js +1 -1
  31. package/dist/electron.js.map +1 -1
  32. package/dist/http-BXn39Czz.d.cts.map +1 -1
  33. package/dist/{http-DMg5ci8E.d.ts → http-CRSeVmFG.d.ts} +2 -2
  34. package/dist/{http-DMg5ci8E.d.ts.map → http-CRSeVmFG.d.ts.map} +1 -1
  35. package/dist/{http-BEp3rEW8.js → http-CyZkKCub.js} +1 -1
  36. package/dist/{http-BEp3rEW8.js.map → http-CyZkKCub.js.map} +1 -1
  37. package/dist/http.cjs +1 -1
  38. package/dist/http.d.ts +3 -3
  39. package/dist/http.js +1 -1
  40. package/dist/http.js.map +1 -1
  41. package/dist/inspector.cjs +3 -0
  42. package/dist/inspector.d.cts +197 -0
  43. package/dist/inspector.d.cts.map +1 -0
  44. package/dist/inspector.d.ts +197 -0
  45. package/dist/inspector.d.ts.map +1 -0
  46. package/dist/inspector.js +4 -0
  47. package/dist/inspector.js.map +1 -0
  48. package/dist/{interface-Cdp6K7Dz.d.ts → interface-ezOcBCNE.d.ts} +1 -1
  49. package/dist/{interface-Cdp6K7Dz.d.ts.map → interface-ezOcBCNE.d.ts.map} +1 -1
  50. package/dist/kafka.cjs +1 -1
  51. package/dist/kafka.d.cts +98 -3
  52. package/dist/kafka.d.cts.map +1 -0
  53. package/dist/kafka.d.ts +98 -3
  54. package/dist/kafka.d.ts.map +1 -0
  55. package/dist/kafka.js +2 -1
  56. package/dist/kafka.js.map +1 -0
  57. package/dist/mod.cjs +2 -2
  58. package/dist/mod.d.cts +1 -5
  59. package/dist/mod.d.cts.map +1 -1
  60. package/dist/mod.d.ts +8 -12
  61. package/dist/mod.d.ts.map +1 -1
  62. package/dist/mod.js +2 -2
  63. package/dist/mod.js.map +1 -1
  64. package/dist/nats.cjs +1 -1
  65. package/dist/nats.d.cts +78 -3
  66. package/dist/nats.d.cts.map +1 -0
  67. package/dist/nats.d.ts +78 -3
  68. package/dist/nats.d.ts.map +1 -0
  69. package/dist/nats.js +2 -1
  70. package/dist/nats.js.map +1 -0
  71. package/dist/rabbitmq.cjs +1 -1
  72. package/dist/rabbitmq.d.cts +60 -2
  73. package/dist/rabbitmq.d.cts.map +1 -0
  74. package/dist/rabbitmq.d.ts +63 -5
  75. package/dist/rabbitmq.d.ts.map +1 -0
  76. package/dist/rabbitmq.js +2 -1
  77. package/dist/rabbitmq.js.map +1 -0
  78. package/dist/redis-streams.cjs +1 -1
  79. package/dist/redis-streams.d.cts +97 -3
  80. package/dist/redis-streams.d.cts.map +1 -0
  81. package/dist/redis-streams.d.ts +97 -3
  82. package/dist/redis-streams.d.ts.map +1 -0
  83. package/dist/redis-streams.js +2 -1
  84. package/dist/redis-streams.js.map +1 -0
  85. package/dist/serialization-DdbbW0af.cjs +3 -0
  86. package/dist/serialization-uE-XobTA.js +4 -0
  87. package/dist/serialization-uE-XobTA.js.map +1 -0
  88. package/dist/socketio.d.ts +1 -1
  89. package/dist/{tauri-CSGFwEY6.d.ts → tauri-BykS4PBm.d.ts} +2 -2
  90. package/dist/{tauri-CSGFwEY6.d.ts.map → tauri-BykS4PBm.d.ts.map} +1 -1
  91. package/dist/{transfer-handlers-3wBZpi5F.d.ts → transfer-handlers-Cw7K7oL9.d.ts} +1 -1
  92. package/dist/{transfer-handlers-3wBZpi5F.d.ts.map → transfer-handlers-Cw7K7oL9.d.ts.map} +1 -1
  93. package/dist/{utils-BEgiHk89.d.ts → utils-BE41nAwR.d.ts} +1 -1
  94. package/dist/utils-BE41nAwR.d.ts.map +1 -0
  95. package/package.json +85 -62
  96. package/dist/channel-B-xw0r_-.cjs +0 -6
  97. package/dist/channel-CLazgI0u.d.ts.map +0 -1
  98. package/dist/channel-Dl81iz1-.js +0 -7
  99. package/dist/channel-Dl81iz1-.js.map +0 -1
  100. package/dist/kafka-CEnBN-7e.d.cts +0 -98
  101. package/dist/kafka-CEnBN-7e.d.cts.map +0 -1
  102. package/dist/kafka-DrhWN0Wx.js +0 -2
  103. package/dist/kafka-DrhWN0Wx.js.map +0 -1
  104. package/dist/kafka-j0MF9lik.d.ts +0 -98
  105. package/dist/kafka-j0MF9lik.d.ts.map +0 -1
  106. package/dist/kafka-x0zuIRyy.cjs +0 -1
  107. package/dist/nats-Ba4bXoY5.js +0 -2
  108. package/dist/nats-Ba4bXoY5.js.map +0 -1
  109. package/dist/nats-C1aVwb8x.d.ts +0 -78
  110. package/dist/nats-C1aVwb8x.d.ts.map +0 -1
  111. package/dist/nats-CMglzmZn.cjs +0 -1
  112. package/dist/nats-c0XYE-Ao.d.cts +0 -78
  113. package/dist/nats-c0XYE-Ao.d.cts.map +0 -1
  114. package/dist/rabbitmq-B5NVNJ3X.cjs +0 -1
  115. package/dist/rabbitmq-DWEE5gve.d.ts +0 -61
  116. package/dist/rabbitmq-DWEE5gve.d.ts.map +0 -1
  117. package/dist/rabbitmq-DbxfLKQj.js +0 -2
  118. package/dist/rabbitmq-DbxfLKQj.js.map +0 -1
  119. package/dist/rabbitmq-OGWQJkUQ.d.cts +0 -61
  120. package/dist/rabbitmq-OGWQJkUQ.d.cts.map +0 -1
  121. package/dist/redis-streams-BV472jY5.js +0 -2
  122. package/dist/redis-streams-BV472jY5.js.map +0 -1
  123. package/dist/redis-streams-CGnDQYMH.cjs +0 -1
  124. package/dist/redis-streams-DeCCm9lZ.d.cts +0 -97
  125. package/dist/redis-streams-DeCCm9lZ.d.cts.map +0 -1
  126. package/dist/redis-streams-RKCo8Gip.d.ts +0 -97
  127. package/dist/redis-streams-RKCo8Gip.d.ts.map +0 -1
  128. package/dist/utils-BEgiHk89.d.ts.map +0 -1
  129. /package/dist/{deno-Cl_O9sLW.cjs → deno-D-TAp-9L.cjs} +0 -0
  130. /package/dist/{http-DoUu8nzZ.cjs → http-DQgamPvI.cjs} +0 -0
package/README.md CHANGED
@@ -661,21 +661,21 @@ try {
661
661
  ### Web Worker Example
662
662
 
663
663
  ```ts
664
- import { RPCChannel, WorkerChildIO, type DestroyableIoInterface } from "kkrpc"
664
+ import { RPCChannel, WorkerChildIO, type IoInterface } from "kkrpc"
665
665
 
666
666
  const worker = new Worker(new URL("./scripts/worker.ts", import.meta.url).href, { type: "module" })
667
667
  const io = new WorkerChildIO(worker)
668
- const rpc = new RPCChannel<API, API, DestroyableIoInterface>(io, { expose: apiMethods })
668
+ const rpc = new RPCChannel<API, API, IoInterface>(io, { expose: apiMethods })
669
669
  const api = rpc.getAPI()
670
670
 
671
671
  expect(await api.add(1, 2)).toBe(3)
672
672
  ```
673
673
 
674
674
  ```ts
675
- import { RPCChannel, WorkerParentIO, type DestroyableIoInterface } from "kkrpc"
675
+ import { RPCChannel, WorkerParentIO, type IoInterface } from "kkrpc"
676
676
 
677
- const io: DestroyableIoInterface = new WorkerChildIO()
678
- const rpc = new RPCChannel<API, API, DestroyableIoInterface>(io, { expose: apiMethods })
677
+ const io: IoInterface = new WorkerChildIO()
678
+ const rpc = new RPCChannel<API, API, IoInterface>(io, { expose: apiMethods })
679
679
  const api = rpc.getAPI()
680
680
 
681
681
  const sum = await api.add(1, 2)
@@ -1610,6 +1610,7 @@ bun test
1610
1610
  The benchmarks are designed to measure two key aspects of RPC performance:
1611
1611
 
1612
1612
  1. **Call Throughput** (`stdio-benchmark.test.ts`, `websocket-benchmark.test.ts`)
1613
+
1613
1614
  - **Sequential Operations**: Measures latency per call when making blocking calls one after another
1614
1615
  - **Concurrent Operations**: Measures throughput when making many calls in parallel using `Promise.all`
1615
1616
  - **Batch Operations**: Tests batching multiple operations into a single RPC call
package/README.zh.md CHANGED
@@ -538,21 +538,21 @@ try {
538
538
  ### Web Worker 示例
539
539
 
540
540
  ```ts
541
- import { RPCChannel, WorkerChildIO, type DestroyableIoInterface } from "kkrpc"
541
+ import { RPCChannel, WorkerChildIO, type IoInterface } from "kkrpc"
542
542
 
543
543
  const worker = new Worker(new URL("./scripts/worker.ts", import.meta.url).href, { type: "module" })
544
544
  const io = new WorkerChildIO(worker)
545
- const rpc = new RPCChannel<API, API, DestroyableIoInterface>(io, { expose: apiMethods })
545
+ const rpc = new RPCChannel<API, API, IoInterface>(io, { expose: apiMethods })
546
546
  const api = rpc.getAPI()
547
547
 
548
548
  expect(await api.add(1, 2)).toBe(3)
549
549
  ```
550
550
 
551
551
  ```ts
552
- import { RPCChannel, WorkerParentIO, type DestroyableIoInterface } from "kkrpc"
552
+ import { RPCChannel, WorkerParentIO, type IoInterface } from "kkrpc"
553
553
 
554
- const io: DestroyableIoInterface = new WorkerChildIO()
555
- const rpc = new RPCChannel<API, API, DestroyableIoInterface>(io, { expose: apiMethods })
554
+ const io: IoInterface = new WorkerChildIO()
555
+ const rpc = new RPCChannel<API, API, IoInterface>(io, { expose: apiMethods })
556
556
  const api = rpc.getAPI()
557
557
 
558
558
  const sum = await api.add(1, 2)
@@ -1 +1 @@
1
- const e=require(`./tauri-DRz52iou.cjs`),t=require(`./channel-B-xw0r_-.cjs`),n=`__DESTROY__`,r=`__PORT_INIT__`;var i=class{name=`iframe-parent-io`;messageQueue=[];resolveRead=null;port=null;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.targetWindow=e,this.port=null,window.addEventListener(`message`,e=>{if(e.source===this.targetWindow&&e.data===r&&e.ports.length>0)for(this.port=e.ports[0],this.port.onmessage=this.handleMessage;this.messageQueue.length>0;){let e=this.messageQueue.shift();e&&(typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data))}})}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===n){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){if(!this.port){this.messageQueue.push(e);return}typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data)}destroy(){this.port&&(this.port.postMessage(n),this.port.close())}signalDestroy(){this.port&&this.port.postMessage(n)}},a=class{name=`iframe-child-io`;messageQueue=[];resolveRead=null;port=null;pendingMessages=[];initialized;channel;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(){this.channel=new MessageChannel,this.port=this.channel.port1,this.port.onmessage=this.handleMessage,window.parent.postMessage(r,`*`,[this.channel.port2]),this.initialized=Promise.resolve()}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===n){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return await this.initialized,this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){await this.initialized,this.port?typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data):this.pendingMessages.push(e)}destroy(){this.port&&(this.port.postMessage(n),this.port.close())}signalDestroy(){this.port?this.port.postMessage(n):this.pendingMessages.push(n)}};exports.IframeChildIO=a,exports.IframeParentIO=i,exports.RPCChannel=t.t,exports.RPCTimeoutError=t.n,exports.RPCValidationError=t.i,exports.TRANSFER_SLOT_PREFIX=t.p,exports.TauriShellStdio=e.t,exports.WebSocketClientIO=e.n,exports.WebSocketServerIO=e.r,exports.WorkerChildIO=e.i,exports.WorkerParentIO=e.a,exports.decodeMessage=t.m,exports.defineAPI=t.a,exports.defineMethod=t.o,exports.deserializeError=t.h,exports.deserializeMessage=t.g,exports.encodeMessage=t._,exports.extractValidators=t.s,exports.generateUUID=t.f,exports.hasTransferDescriptor=t.S,exports.isRPCTimeoutError=t.r,exports.isRPCValidationError=t.c,exports.lookupValidator=t.l,exports.processValueForTransfer=t.v,exports.reconstructValueFromTransfer=t.y,exports.registerTransferHandler=t.T,exports.runInterceptors=t.d,exports.runValidation=t.u,exports.serializeError=t.b,exports.serializeMessage=t.x,exports.takeTransferDescriptor=t.C,exports.transfer=t.w,exports.transferHandlers=t.E;
1
+ const e=require(`./tauri-DRz52iou.cjs`),t=require(`./channel-DpFB1k-f.cjs`),n=require(`./serialization-DdbbW0af.cjs`),r=`__DESTROY__`,i=`__PORT_INIT__`;var a=class{name=`iframe-parent-io`;messageQueue=[];resolveRead=null;port=null;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.targetWindow=e,this.port=null,window.addEventListener(`message`,e=>{if(e.source===this.targetWindow&&e.data===i&&e.ports.length>0)for(this.port=e.ports[0],this.port.onmessage=this.handleMessage;this.messageQueue.length>0;){let e=this.messageQueue.shift();e&&(typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data))}})}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===r){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){if(!this.port){this.messageQueue.push(e);return}typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data)}destroy(){this.port&&(this.port.postMessage(r),this.port.close())}signalDestroy(){this.port&&this.port.postMessage(r)}},o=class{name=`iframe-child-io`;messageQueue=[];resolveRead=null;port=null;pendingMessages=[];initialized;channel;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(){this.channel=new MessageChannel,this.port=this.channel.port1,this.port.onmessage=this.handleMessage,window.parent.postMessage(i,`*`,[this.channel.port2]),this.initialized=Promise.resolve()}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===r){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return await this.initialized,this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){await this.initialized,this.port?typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data):this.pendingMessages.push(e)}destroy(){this.port&&(this.port.postMessage(r),this.port.close())}signalDestroy(){this.port?this.port.postMessage(r):this.pendingMessages.push(r)}};exports.IframeChildIO=o,exports.IframeParentIO=a,exports.RPCChannel=t.t,exports.RPCTimeoutError=t.n,exports.RPCValidationError=t.i,exports.TRANSFER_SLOT_PREFIX=n.t,exports.TauriShellStdio=e.t,exports.WebSocketClientIO=e.n,exports.WebSocketServerIO=e.r,exports.WorkerChildIO=e.i,exports.WorkerParentIO=e.a,exports.decodeMessage=n.n,exports.defineAPI=t.a,exports.defineMethod=t.o,exports.deserializeError=n.r,exports.deserializeMessage=n.i,exports.encodeMessage=n.a,exports.extractValidators=t.s,exports.generateUUID=t.d,exports.hasTransferDescriptor=n.u,exports.isRPCTimeoutError=t.r,exports.isRPCValidationError=t.c,exports.lookupValidator=t.l,exports.processValueForTransfer=n.o,exports.reconstructValueFromTransfer=n.s,exports.registerTransferHandler=n.p,exports.runInterceptors=t.f,exports.runValidation=t.u,exports.serializeError=n.c,exports.serializeMessage=n.l,exports.takeTransferDescriptor=n.d,exports.transfer=n.f,exports.transferHandlers=n.m;
@@ -1,8 +1,8 @@
1
- import { _ as encodeMessage, a as EnhancedError, b as serializeError, c as SerializationOptions, d as WireEnvelope, f as WireFormat, g as deserializeMessage, h as deserializeError, i as EncodedMessage, l as TRANSFER_SLOT_PREFIX, m as decodeMessage, n as IoInterface, o as Message, p as WireV1, r as IoMessage, s as Response, t as IoCapabilities, u as TransferSlot, v as processValueForTransfer, x as serializeMessage, y as reconstructValueFromTransfer } from "./interface-Cdp6K7Dz.js";
2
- import { a as WorkerChildIO, i as WebSocketServerIO, n as WebSocketClientIO, o as WorkerParentIO, r as WebSocketLike, t as TauriShellStdio } from "./tauri-CSGFwEY6.js";
3
- import { _ as RPCCallContext, a as InferAPI, c as RPCValidationError, d as defineMethod, f as extractValidators, g as StandardSchemaV1, h as runValidation, i as DefinedMethod, l as RPCValidators, m as lookupValidator, n as RPCTimeoutError, o as MethodSchemaConfig, p as isRPCValidationError, r as isRPCTimeoutError, s as MethodValidators, t as RPCChannel, u as defineAPI, v as RPCInterceptor, y as runInterceptors } from "./channel-CLazgI0u.js";
4
- import { t as generateUUID } from "./utils-BEgiHk89.js";
5
- import { a as hasTransferDescriptor, i as TransferDescriptor, n as registerTransferHandler, o as takeTransferDescriptor, r as transferHandlers, s as transfer, t as TransferHandler } from "./transfer-handlers-3wBZpi5F.js";
1
+ import { _ as encodeMessage, a as EnhancedError, b as serializeError, c as SerializationOptions, d as WireEnvelope, f as WireFormat, g as deserializeMessage, h as deserializeError, i as EncodedMessage, l as TRANSFER_SLOT_PREFIX, m as decodeMessage, n as IoInterface, o as Message, p as WireV1, r as IoMessage, s as Response, t as IoCapabilities, u as TransferSlot, v as processValueForTransfer, x as serializeMessage, y as reconstructValueFromTransfer } from "./interface-ezOcBCNE.js";
2
+ import { a as WorkerChildIO, i as WebSocketServerIO, n as WebSocketClientIO, o as WorkerParentIO, r as WebSocketLike, t as TauriShellStdio } from "./tauri-BykS4PBm.js";
3
+ import { _ as RPCCallContext, a as InferAPI, c as RPCValidationError, d as defineMethod, f as extractValidators, g as StandardSchemaV1, h as runValidation, i as DefinedMethod, l as RPCValidators, m as lookupValidator, n as RPCTimeoutError, o as MethodSchemaConfig, p as isRPCValidationError, r as isRPCTimeoutError, s as MethodValidators, t as RPCChannel, u as defineAPI, v as RPCInterceptor, y as runInterceptors } from "./channel-DwZvQkc4.js";
4
+ import { t as generateUUID } from "./utils-BE41nAwR.js";
5
+ import { a as hasTransferDescriptor, i as TransferDescriptor, n as registerTransferHandler, o as takeTransferDescriptor, r as transferHandlers, s as transfer, t as TransferHandler } from "./transfer-handlers-Cw7K7oL9.js";
6
6
 
7
7
  //#region src/adapters/iframe.d.ts
8
8
 
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,r,t as i}from"./tauri-BAtWibFE.js";import{C as a,E as o,S as s,T as c,_ as l,a as u,b as d,c as f,d as p,f as m,g as h,h as g,i as _,l as v,m as y,n as b,o as x,p as S,r as C,s as w,t as T,u as E,v as D,w as O,x as k,y as A}from"./channel-Dl81iz1-.js";const j=`__DESTROY__`,M=`__PORT_INIT__`;var N=class{name=`iframe-parent-io`;messageQueue=[];resolveRead=null;port=null;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.targetWindow=e,this.port=null,window.addEventListener(`message`,e=>{if(e.source===this.targetWindow&&e.data===M&&e.ports.length>0)for(this.port=e.ports[0],this.port.onmessage=this.handleMessage;this.messageQueue.length>0;){let e=this.messageQueue.shift();e&&(typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data))}})}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===j){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){if(!this.port){this.messageQueue.push(e);return}typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data)}destroy(){this.port&&(this.port.postMessage(j),this.port.close())}signalDestroy(){this.port&&this.port.postMessage(j)}},P=class{name=`iframe-child-io`;messageQueue=[];resolveRead=null;port=null;pendingMessages=[];initialized;channel;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(){this.channel=new MessageChannel,this.port=this.channel.port1,this.port.onmessage=this.handleMessage,window.parent.postMessage(M,`*`,[this.channel.port2]),this.initialized=Promise.resolve()}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===j){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return await this.initialized,this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){await this.initialized,this.port?typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data):this.pendingMessages.push(e)}destroy(){this.port&&(this.port.postMessage(j),this.port.close())}signalDestroy(){this.port?this.port.postMessage(j):this.pendingMessages.push(j)}};export{P as IframeChildIO,N as IframeParentIO,T as RPCChannel,b as RPCTimeoutError,_ as RPCValidationError,S as TRANSFER_SLOT_PREFIX,i as TauriShellStdio,n as WebSocketClientIO,r as WebSocketServerIO,t as WorkerChildIO,e as WorkerParentIO,y as decodeMessage,u as defineAPI,x as defineMethod,g as deserializeError,h as deserializeMessage,l as encodeMessage,w as extractValidators,m as generateUUID,s as hasTransferDescriptor,C as isRPCTimeoutError,f as isRPCValidationError,v as lookupValidator,D as processValueForTransfer,A as reconstructValueFromTransfer,c as registerTransferHandler,p as runInterceptors,E as runValidation,d as serializeError,k as serializeMessage,a as takeTransferDescriptor,O as transfer,o as transferHandlers};
1
+ import{a as e,i as t,n,r,t as i}from"./tauri-BAtWibFE.js";import{a,c as o,d as s,f as c,i as l,l as u,n as d,o as f,r as p,s as m,t as h,u as g}from"./channel-CeSgoHz4.js";import{a as _,c as v,d as y,f as b,i as x,l as S,m as C,n as w,o as T,p as E,r as D,s as O,t as k,u as A}from"./serialization-uE-XobTA.js";const j=`__DESTROY__`,M=`__PORT_INIT__`;var N=class{name=`iframe-parent-io`;messageQueue=[];resolveRead=null;port=null;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.targetWindow=e,this.port=null,window.addEventListener(`message`,e=>{if(e.source===this.targetWindow&&e.data===M&&e.ports.length>0)for(this.port=e.ports[0],this.port.onmessage=this.handleMessage;this.messageQueue.length>0;){let e=this.messageQueue.shift();e&&(typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data))}})}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===j){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){if(!this.port){this.messageQueue.push(e);return}typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data)}destroy(){this.port&&(this.port.postMessage(j),this.port.close())}signalDestroy(){this.port&&this.port.postMessage(j)}},P=class{name=`iframe-child-io`;messageQueue=[];resolveRead=null;port=null;pendingMessages=[];initialized;channel;capabilities={structuredClone:!0,transfer:!0,transferTypes:[`ArrayBuffer`,`MessagePort`]};messageListeners=new Set;on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(){this.channel=new MessageChannel,this.port=this.channel.port1,this.port.onmessage=this.handleMessage,window.parent.postMessage(M,`*`,[this.channel.port2]),this.initialized=Promise.resolve()}handleMessage=e=>{let t=this.normalizeIncoming(e.data);if(t===j){this.destroy();return}this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};normalizeIncoming(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&e.version===2){let t=e;return{data:t,transfers:t.__transferredValues??[]}}return e}async read(){return await this.initialized,this.messageQueue.length>0?this.messageQueue.shift()??null:new Promise(e=>{this.resolveRead=e})}async write(e){await this.initialized,this.port?typeof e==`string`?this.port.postMessage(e):e.transfers&&e.transfers.length>0?this.port.postMessage(e.data,e.transfers):this.port.postMessage(e.data):this.pendingMessages.push(e)}destroy(){this.port&&(this.port.postMessage(j),this.port.close())}signalDestroy(){this.port?this.port.postMessage(j):this.pendingMessages.push(j)}};export{P as IframeChildIO,N as IframeParentIO,h as RPCChannel,d as RPCTimeoutError,l as RPCValidationError,k as TRANSFER_SLOT_PREFIX,i as TauriShellStdio,n as WebSocketClientIO,r as WebSocketServerIO,t as WorkerChildIO,e as WorkerParentIO,w as decodeMessage,a as defineAPI,f as defineMethod,D as deserializeError,x as deserializeMessage,_ as encodeMessage,m as extractValidators,s as generateUUID,A as hasTransferDescriptor,p as isRPCTimeoutError,o as isRPCValidationError,u as lookupValidator,T as processValueForTransfer,O as reconstructValueFromTransfer,E as registerTransferHandler,c as runInterceptors,g as runValidation,v as serializeError,S as serializeMessage,y as takeTransferDescriptor,b as transfer,C as transferHandlers};
2
2
  //# sourceMappingURL=browser-mod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-mod.js","names":["targetWindow: Window"],"sources":["../src/adapters/iframe.ts"],"sourcesContent":["/**\n * This file contains the implementation of the IframeParentIO and IframeChildIO classes.\n * They are used to create a bidirectional communication channel between a parent window and a child iframe.\n */\nimport type { IoCapabilities, IoInterface, IoMessage } from \"../interface.ts\"\nimport type { WireEnvelope } from \"../serialization.ts\"\n\nconst DESTROY_SIGNAL = \"__DESTROY__\"\nconst PORT_INIT_SIGNAL = \"__PORT_INIT__\"\n\n/**\n * This design relies on built-in `MessageChannel`, and requires a pairing process to establish the port.\n * The `PORT_INIT_SIGNAL` is designed to be initiated by the child frame, parent window will wait for the signal and establish the port.\n *\n * If `PORT_INIT_SIGNAL` is started by the parent window, there has to be a delay (with `setTimeout`) to wait for the child frame to listen to the signal.\n * Parent window can easily listen to iframe onload event, but there is no way to know when child JS is ready to listen to the message without\n * letting child `postMessage` a signal first.\n *\n * It's much easier to make sure parent window is ready (listening) before iframe is loaded, so `MessageChannel` is designed to be created from iframe's side.\n *\n * It's a good practice to call `destroy()` on either side of the channel to close `MessageChannel` and release resources.\n */\nexport class IframeParentIO implements IoInterface {\n\tname = \"iframe-parent-io\"\n\tprivate messageQueue: Array<string | IoMessage> = []\n\tprivate resolveRead: ((value: string | IoMessage | null) => void) | null = null\n\tprivate port: MessagePort | null = null\n\tcapabilities: IoCapabilities = {\n\t\tstructuredClone: true,\n\t\ttransfer: true,\n\t\ttransferTypes: [\"ArrayBuffer\", \"MessagePort\"]\n\t}\n\n\tprivate messageListeners: Set<(message: string | IoMessage) => void> = new Set()\n\n\ton(event: \"message\", listener: (message: string | IoMessage) => void): void\n\ton(event: \"error\", listener: (error: Error) => void): void\n\ton(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.add(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\toff(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.delete(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\t/**\n\t * @example\n\t * ```ts\n\t * const io = new IframeParentIO(iframeRef.contentWindow);\n\t * const rpc = new RPCChannel(io, {\n\t * expose: {\n\t * add: (a: number, b: number) => Promise.resolve(a + b),\n\t * },\n\t * });\n\t * ```\n\t */\n\tconstructor(private targetWindow: Window) {\n\t\tthis.port = null as unknown as MessagePort\n\t\twindow.addEventListener(\"message\", (event: MessageEvent) => {\n\t\t\tif (event.source !== this.targetWindow) return\n\t\t\tif (event.data === PORT_INIT_SIGNAL && event.ports.length > 0) {\n\t\t\t\tthis.port = event.ports[0]\n\t\t\t\tthis.port.onmessage = this.handleMessage\n\n\t\t\t\twhile (this.messageQueue.length > 0) {\n\t\t\t\t\tconst message = this.messageQueue.shift()\n\t\t\t\t\tif (!message) continue\n\t\t\t\t\tif (typeof message === \"string\") {\n\t\t\t\t\t\tthis.port.postMessage(message)\n\t\t\t\t\t} else if (message.transfers && message.transfers.length > 0) {\n\t\t\t\t\t\tthis.port.postMessage(message.data, message.transfers as Transferable[])\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.port.postMessage(message.data)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate handleMessage = (event: MessageEvent) => {\n\t\tconst message = this.normalizeIncoming(event.data)\n\n\t\t// Handle destroy signal\n\t\tif (message === DESTROY_SIGNAL) {\n\t\t\tthis.destroy()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.messageListeners.size > 0) {\n\t\t\tthis.messageListeners.forEach((listener) => listener(message))\n\t\t} else if (this.resolveRead) {\n\t\t\tthis.resolveRead(message)\n\t\t\tthis.resolveRead = null\n\t\t} else {\n\t\t\tthis.messageQueue.push(message)\n\t\t}\n\t}\n\n\tprivate normalizeIncoming(message: any): string | IoMessage {\n\t\tif (typeof message === \"string\") {\n\t\t\treturn message\n\t\t}\n\n\t\tif (message && typeof message === \"object\" && message.version === 2) {\n\t\t\tconst envelope = message as WireEnvelope\n\t\t\treturn {\n\t\t\t\tdata: envelope,\n\t\t\t\ttransfers: (envelope.__transferredValues as unknown[] | undefined) ?? []\n\t\t\t}\n\t\t}\n\n\t\treturn message as string\n\t}\n\n\tasync read(): Promise<string | IoMessage | null> {\n\t\t// If there are queued messages, return the first one\n\t\tif (this.messageQueue.length > 0) {\n\t\t\treturn this.messageQueue.shift() ?? null\n\t\t}\n\n\t\t// Otherwise, wait for the next message\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.resolveRead = resolve\n\t\t})\n\t}\n\n\tasync write(message: string | IoMessage): Promise<void> {\n\t\tif (!this.port) {\n\t\t\tthis.messageQueue.push(message)\n\t\t\treturn\n\t\t}\n\t\tif (typeof message === \"string\") {\n\t\t\tthis.port.postMessage(message)\n\t\t} else if (message.transfers && message.transfers.length > 0) {\n\t\t\tthis.port.postMessage(message.data, message.transfers as Transferable[])\n\t\t} else {\n\t\t\tthis.port.postMessage(message.data)\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t\tthis.port.close()\n\t\t}\n\t}\n\n\tsignalDestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t}\n\t}\n}\n\n// Child frame version\nexport class IframeChildIO implements IoInterface {\n\tname = \"iframe-child-io\"\n\tprivate messageQueue: Array<string | IoMessage> = []\n\tprivate resolveRead: ((value: string | IoMessage | null) => void) | null = null\n\tprivate port: MessagePort | null = null\n\tprivate pendingMessages: Array<string | IoMessage> = []\n\tprivate initialized: Promise<void>\n\tprivate channel: MessageChannel\n\tcapabilities: IoCapabilities = {\n\t\tstructuredClone: true,\n\t\ttransfer: true,\n\t\ttransferTypes: [\"ArrayBuffer\", \"MessagePort\"]\n\t}\n\n\tprivate messageListeners: Set<(message: string | IoMessage) => void> = new Set()\n\n\ton(event: \"message\", listener: (message: string | IoMessage) => void): void\n\ton(event: \"error\", listener: (error: Error) => void): void\n\ton(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.add(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\toff(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.delete(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\tconstructor() {\n\t\tthis.channel = new MessageChannel()\n\t\tthis.port = this.channel.port1\n\t\tthis.port.onmessage = this.handleMessage\n\n\t\twindow.parent.postMessage(PORT_INIT_SIGNAL, \"*\", [this.channel.port2])\n\t\tthis.initialized = Promise.resolve()\n\t}\n\n\tprivate handleMessage = (event: MessageEvent) => {\n\t\tconst message = this.normalizeIncoming(event.data)\n\n\t\t// Handle destroy signal\n\t\tif (message === DESTROY_SIGNAL) {\n\t\t\tthis.destroy()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.messageListeners.size > 0) {\n\t\t\tthis.messageListeners.forEach((listener) => listener(message))\n\t\t} else if (this.resolveRead) {\n\t\t\tthis.resolveRead(message)\n\t\t\tthis.resolveRead = null\n\t\t} else {\n\t\t\tthis.messageQueue.push(message)\n\t\t}\n\t}\n\n\tprivate normalizeIncoming(message: any): string | IoMessage {\n\t\tif (typeof message === \"string\") {\n\t\t\treturn message\n\t\t}\n\n\t\tif (message && typeof message === \"object\" && message.version === 2) {\n\t\t\tconst envelope = message as WireEnvelope\n\t\t\treturn {\n\t\t\t\tdata: envelope,\n\t\t\t\ttransfers: (envelope.__transferredValues as unknown[] | undefined) ?? []\n\t\t\t}\n\t\t}\n\n\t\treturn message as string\n\t}\n\n\tasync read(): Promise<string | IoMessage | null> {\n\t\tawait this.initialized\n\n\t\tif (this.messageQueue.length > 0) {\n\t\t\treturn this.messageQueue.shift() ?? null\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.resolveRead = resolve\n\t\t})\n\t}\n\n\tasync write(message: string | IoMessage): Promise<void> {\n\t\tawait this.initialized\n\n\t\tif (this.port) {\n\t\t\tif (typeof message === \"string\") {\n\t\t\t\tthis.port.postMessage(message)\n\t\t\t} else if (message.transfers && message.transfers.length > 0) {\n\t\t\t\tthis.port.postMessage(message.data, message.transfers as Transferable[])\n\t\t\t} else {\n\t\t\t\tthis.port.postMessage(message.data)\n\t\t\t}\n\t\t} else {\n\t\t\tthis.pendingMessages.push(message)\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t\tthis.port.close()\n\t\t}\n\t}\n\n\tsignalDestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t} else {\n\t\t\tthis.pendingMessages.push(DESTROY_SIGNAL)\n\t\t}\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"browser-mod.js","names":["targetWindow: Window"],"sources":["../src/adapters/iframe.ts"],"sourcesContent":["/**\n * This file contains the implementation of the IframeParentIO and IframeChildIO classes.\n * They are used to create a bidirectional communication channel between a parent window and a child iframe.\n */\nimport type { IoCapabilities, IoInterface, IoMessage } from \"../interface.ts\"\nimport type { WireEnvelope } from \"../serialization.ts\"\n\nconst DESTROY_SIGNAL = \"__DESTROY__\"\nconst PORT_INIT_SIGNAL = \"__PORT_INIT__\"\n\n/**\n * This design relies on built-in `MessageChannel`, and requires a pairing process to establish the port.\n * The `PORT_INIT_SIGNAL` is designed to be initiated by the child frame, parent window will wait for the signal and establish the port.\n *\n * If `PORT_INIT_SIGNAL` is started by the parent window, there has to be a delay (with `setTimeout`) to wait for the child frame to listen to the signal.\n * Parent window can easily listen to iframe onload event, but there is no way to know when child JS is ready to listen to the message without\n * letting child `postMessage` a signal first.\n *\n * It's much easier to make sure parent window is ready (listening) before iframe is loaded, so `MessageChannel` is designed to be created from iframe's side.\n *\n * It's a good practice to call `destroy()` on either side of the channel to close `MessageChannel` and release resources.\n */\nexport class IframeParentIO implements IoInterface {\n\tname = \"iframe-parent-io\"\n\tprivate messageQueue: Array<string | IoMessage> = []\n\tprivate resolveRead: ((value: string | IoMessage | null) => void) | null = null\n\tprivate port: MessagePort | null = null\n\tcapabilities: IoCapabilities = {\n\t\tstructuredClone: true,\n\t\ttransfer: true,\n\t\ttransferTypes: [\"ArrayBuffer\", \"MessagePort\"]\n\t}\n\n\tprivate messageListeners: Set<(message: string | IoMessage) => void> = new Set()\n\n\ton(event: \"message\", listener: (message: string | IoMessage) => void): void\n\ton(event: \"error\", listener: (error: Error) => void): void\n\ton(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.add(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\toff(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.delete(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\t/**\n\t * @example\n\t * ```ts\n\t * const io = new IframeParentIO(iframeRef.contentWindow);\n\t * const rpc = new RPCChannel(io, {\n\t * expose: {\n\t * add: (a: number, b: number) => Promise.resolve(a + b),\n\t * },\n\t * });\n\t * ```\n\t */\n\tconstructor(private targetWindow: Window) {\n\t\tthis.port = null as unknown as MessagePort\n\t\twindow.addEventListener(\"message\", (event: MessageEvent) => {\n\t\t\tif (event.source !== this.targetWindow) return\n\t\t\tif (event.data === PORT_INIT_SIGNAL && event.ports.length > 0) {\n\t\t\t\tthis.port = event.ports[0]\n\t\t\t\tthis.port.onmessage = this.handleMessage\n\n\t\t\t\twhile (this.messageQueue.length > 0) {\n\t\t\t\t\tconst message = this.messageQueue.shift()\n\t\t\t\t\tif (!message) continue\n\t\t\t\t\tif (typeof message === \"string\") {\n\t\t\t\t\t\tthis.port.postMessage(message)\n\t\t\t\t\t} else if (message.transfers && message.transfers.length > 0) {\n\t\t\t\t\t\tthis.port.postMessage(message.data, message.transfers as Transferable[])\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.port.postMessage(message.data)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate handleMessage = (event: MessageEvent) => {\n\t\tconst message = this.normalizeIncoming(event.data)\n\n\t\t// Handle destroy signal\n\t\tif (message === DESTROY_SIGNAL) {\n\t\t\tthis.destroy()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.messageListeners.size > 0) {\n\t\t\tthis.messageListeners.forEach((listener) => listener(message))\n\t\t} else if (this.resolveRead) {\n\t\t\tthis.resolveRead(message)\n\t\t\tthis.resolveRead = null\n\t\t} else {\n\t\t\tthis.messageQueue.push(message)\n\t\t}\n\t}\n\n\tprivate normalizeIncoming(message: any): string | IoMessage {\n\t\tif (typeof message === \"string\") {\n\t\t\treturn message\n\t\t}\n\n\t\tif (message && typeof message === \"object\" && message.version === 2) {\n\t\t\tconst envelope = message as WireEnvelope\n\t\t\treturn {\n\t\t\t\tdata: envelope,\n\t\t\t\ttransfers: (envelope.__transferredValues as unknown[] | undefined) ?? []\n\t\t\t}\n\t\t}\n\n\t\treturn message as string\n\t}\n\n\tasync read(): Promise<string | IoMessage | null> {\n\t\t// If there are queued messages, return the first one\n\t\tif (this.messageQueue.length > 0) {\n\t\t\treturn this.messageQueue.shift() ?? null\n\t\t}\n\n\t\t// Otherwise, wait for the next message\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.resolveRead = resolve\n\t\t})\n\t}\n\n\tasync write(message: string | IoMessage): Promise<void> {\n\t\tif (!this.port) {\n\t\t\tthis.messageQueue.push(message)\n\t\t\treturn\n\t\t}\n\t\tif (typeof message === \"string\") {\n\t\t\tthis.port.postMessage(message)\n\t\t} else if (message.transfers && message.transfers.length > 0) {\n\t\t\tthis.port.postMessage(message.data, message.transfers as Transferable[])\n\t\t} else {\n\t\t\tthis.port.postMessage(message.data)\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t\tthis.port.close()\n\t\t}\n\t}\n\n\tsignalDestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t}\n\t}\n}\n\n// Child frame version\nexport class IframeChildIO implements IoInterface {\n\tname = \"iframe-child-io\"\n\tprivate messageQueue: Array<string | IoMessage> = []\n\tprivate resolveRead: ((value: string | IoMessage | null) => void) | null = null\n\tprivate port: MessagePort | null = null\n\tprivate pendingMessages: Array<string | IoMessage> = []\n\tprivate initialized: Promise<void>\n\tprivate channel: MessageChannel\n\tcapabilities: IoCapabilities = {\n\t\tstructuredClone: true,\n\t\ttransfer: true,\n\t\ttransferTypes: [\"ArrayBuffer\", \"MessagePort\"]\n\t}\n\n\tprivate messageListeners: Set<(message: string | IoMessage) => void> = new Set()\n\n\ton(event: \"message\", listener: (message: string | IoMessage) => void): void\n\ton(event: \"error\", listener: (error: Error) => void): void\n\ton(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.add(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\toff(event: \"message\" | \"error\", listener: Function): void {\n\t\tif (event === \"message\") {\n\t\t\tthis.messageListeners.delete(listener as (message: string | IoMessage) => void)\n\t\t}\n\t}\n\n\tconstructor() {\n\t\tthis.channel = new MessageChannel()\n\t\tthis.port = this.channel.port1\n\t\tthis.port.onmessage = this.handleMessage\n\n\t\twindow.parent.postMessage(PORT_INIT_SIGNAL, \"*\", [this.channel.port2])\n\t\tthis.initialized = Promise.resolve()\n\t}\n\n\tprivate handleMessage = (event: MessageEvent) => {\n\t\tconst message = this.normalizeIncoming(event.data)\n\n\t\t// Handle destroy signal\n\t\tif (message === DESTROY_SIGNAL) {\n\t\t\tthis.destroy()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.messageListeners.size > 0) {\n\t\t\tthis.messageListeners.forEach((listener) => listener(message))\n\t\t} else if (this.resolveRead) {\n\t\t\tthis.resolveRead(message)\n\t\t\tthis.resolveRead = null\n\t\t} else {\n\t\t\tthis.messageQueue.push(message)\n\t\t}\n\t}\n\n\tprivate normalizeIncoming(message: any): string | IoMessage {\n\t\tif (typeof message === \"string\") {\n\t\t\treturn message\n\t\t}\n\n\t\tif (message && typeof message === \"object\" && message.version === 2) {\n\t\t\tconst envelope = message as WireEnvelope\n\t\t\treturn {\n\t\t\t\tdata: envelope,\n\t\t\t\ttransfers: (envelope.__transferredValues as unknown[] | undefined) ?? []\n\t\t\t}\n\t\t}\n\n\t\treturn message as string\n\t}\n\n\tasync read(): Promise<string | IoMessage | null> {\n\t\tawait this.initialized\n\n\t\tif (this.messageQueue.length > 0) {\n\t\t\treturn this.messageQueue.shift() ?? null\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.resolveRead = resolve\n\t\t})\n\t}\n\n\tasync write(message: string | IoMessage): Promise<void> {\n\t\tawait this.initialized\n\n\t\tif (this.port) {\n\t\t\tif (typeof message === \"string\") {\n\t\t\t\tthis.port.postMessage(message)\n\t\t\t} else if (message.transfers && message.transfers.length > 0) {\n\t\t\t\tthis.port.postMessage(message.data, message.transfers as Transferable[])\n\t\t\t} else {\n\t\t\t\tthis.port.postMessage(message.data)\n\t\t\t}\n\t\t} else {\n\t\t\tthis.pendingMessages.push(message)\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t\tthis.port.close()\n\t\t}\n\t}\n\n\tsignalDestroy(): void {\n\t\tif (this.port) {\n\t\t\tthis.port.postMessage(DESTROY_SIGNAL)\n\t\t} else {\n\t\t\tthis.pendingMessages.push(DESTROY_SIGNAL)\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"channel-C4KXiIq_.d.cts","names":[],"sources":["../src/middleware.ts","../src/standard-schema.ts","../src/validation.ts","../src/channel.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"channel-C4KXiIq_.d.cts","names":[],"sources":["../src/middleware.ts","../src/standard-schema.ts","../src/validation.ts","../src/channel.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import{a as e,c as t,n,o as r,r as i,s as a}from"./serialization-uE-XobTA.js";function o(e,t,n){let r=0,i=()=>{if(r>=e.length)return n();let a=e[r++];return a(t,i)};return i()}function s(){return[,,,,].fill(0).map(()=>Math.floor(Math.random()*(2**53-1)).toString(16)).join(`-`)}var c=class extends Error{phase;method;issues;constructor(e,t,n){let r=n.map(e=>e.message).join(`; `);super(`RPC ${e} validation failed for "${t}": ${r}`),this.name=`RPCValidationError`,this.phase=e,this.method=t,this.issues=n}};function l(e){return e instanceof Error&&e.name===`RPCValidationError`}function u(e,t){if(!e)return;let n=t.split(`.`),r=e;for(let e of n){if(!r||typeof r!=`object`)return;r=r[e]}if(r&&typeof r==`object`&&(`input`in r||`output`in r))return r}async function d(e,t){if(!e)return{success:!0,value:t};try{let n=await e[`~standard`].validate(t);return n.issues?{success:!1,issues:n.issues}:{success:!0,value:n.value}}catch(e){return{success:!1,issues:[{message:`Validator threw: ${e}`}]}}}const f=`~validators`;function p(e,t){return Object.defineProperty(t,f,{value:{input:e.input,output:e.output},enumerable:!1,writable:!1}),t}function m(e){return e}function h(e){let t={};for(let n of Object.keys(e)){let r=e[n];if(typeof r==`function`&&f in r)t[n]=r[f];else if(typeof r==`object`&&r&&!(`~standard`in r)){let e=h(r);Object.keys(e).length>0&&(t[n]=e)}}return t}var g=class extends Error{method;timeoutMs;constructor(e,t){super(`RPC call to "${e}" timed out after ${t}ms`),this.name=`RPCTimeoutError`,this.method=e,this.timeoutMs=t}};function _(e){return e instanceof Error&&e.name===`RPCTimeoutError`}function v(e){return typeof e==`object`&&!!e&&Symbol.asyncIterator in e}var y=class{pendingRequests={};pendingTimers={};callbacks={};callbackCache=new Map;activeStreams=new Map;streamConsumers=new Map;count=0;messageStr=``;apiImplementation;validators;interceptors;serializationOptions;supportsTransfer=!1;structuredClone=!1;timeout;constructor(e,t){this.io=e,this.apiImplementation=t?.expose,this.validators=t?.validators,this.interceptors=t?.interceptors??[],this.timeout=t?.timeout??0,this.serializationOptions=t?.serialization||{},this.structuredClone=e.capabilities?.structuredClone===!0,this.structuredClone&&e.capabilities?.transfer===!0&&t?.enableTransfer!==!1&&(this.supportsTransfer=!0),this.listen()}expose(e,t){this.apiImplementation=e,t&&(this.validators=t)}getIO(){return this.io}async listen(){for(;!(`isDestroyed`in this.io&&this.io.isDestroyed);)try{let e=await this.io.read();if(e==null)continue;await this.handleIncomingMessage(e)}catch(e){if(e instanceof Error&&e.message.includes(`destroyed`))break;console.error(`kkrpc: failed to handle incoming message`,e)}}async handleIncomingMessage(e){if(typeof e==`string`){if(e.trim().length===0)return;this.bufferString(e);return}let t=e.data;if(typeof t==`string`){await this.handleIncomingMessage(t);return}if(!t||typeof t!=`object`)return;!t.__transferredValues&&e.transfers&&e.transfers.length>0&&(t.__transferredValues=e.transfers);let r=await n(t);await this.processDecodedMessage(r)}bufferString(e){this.messageStr+=e;let t=this.messageStr[this.messageStr.length-1],n=this.messageStr.split(`
2
+ `),r=t===`
3
+ `?n:n.slice(0,-1);this.messageStr=t===`
4
+ `?``:n.at(-1)??``;for(let e of r.map(e=>e.trim()).filter(Boolean))e.startsWith(`{`)?this.handleMessageStr(e):console.log(`(kkrpc stdout passthrough):`,e)}async handleMessageStr(e){this.count++;try{let t=await n(e);await this.processDecodedMessage(t)}catch(t){console.error(`failed to parse message`,typeof e,e,t)}}async processDecodedMessage(e){e.type===`response`?this.handleResponse(e):e.type===`request`?this.handleRequest(e):e.type===`callback`?this.handleCallback(e):e.type===`get`?this.handleGet(e):e.type===`set`?this.handleSet(e):e.type===`construct`?this.handleConstruct(e):e.type===`stream-chunk`?this.handleStreamChunk(e):e.type===`stream-end`?this.handleStreamEnd(e):e.type===`stream-error`?this.handleStreamError(e):e.type===`stream-cancel`?this.handleStreamCancel(e):console.error(`received unknown message type`,e,typeof e)}callMethod(e,t){return new Promise((n,i)=>{let a=s();this.pendingRequests[a]={resolve:n,reject:i},this.startTimeout(a,e);let o=[],c=t.map(e=>{if(typeof e==`function`){let t=this.callbackCache.get(e);return t||(t=s(),this.callbacks[t]=e,this.callbackCache.set(e,t)),o.push(t),`__callback__${t}`}return e}),l=c,u=[],d=[],f=[];this.supportsTransfer&&(l=c.map(e=>r(e,u,d,f)));let p={id:a,method:e,args:l,type:`request`,callbackIds:o.length>0?o:void 0,transferSlots:d.length>0?d:void 0};this.sendMessage(p,u,f)})}getProperty(e){return new Promise((t,n)=>{let r=s();this.pendingRequests[r]={resolve:t,reject:n};let i=Array.isArray(e)?e:e.split(`.`);this.startTimeout(r,`get:${i.join(`.`)}`);let a={id:r,method:``,args:{},type:`get`,path:i};this.sendMessage(a)})}setProperty(e,t){return new Promise((n,i)=>{let a=s();this.pendingRequests[a]={resolve:n,reject:i};let o=Array.isArray(e)?e:e.split(`.`);this.startTimeout(a,`set:${o.join(`.`)}`);let c=t,l=[],u=[],d=[];this.supportsTransfer&&(c=r(t,l,u,d));let f={id:a,method:``,args:{},type:`set`,path:o,value:c,transferSlots:u.length>0?u:void 0};this.sendMessage(f,l,d)})}callConstructor(e,t){return new Promise((n,i)=>{let a=s();this.pendingRequests[a]={resolve:n,reject:i},this.startTimeout(a,e);let o=[],c=t.map(e=>{if(typeof e==`function`){let t=this.callbackCache.get(e);return t||(t=s(),this.callbacks[t]=e,this.callbackCache.set(e,t)),o.push(t),`__callback__${t}`}return e}),l=c,u=[],d=[],f=[];this.supportsTransfer&&(l=c.map(e=>r(e,u,d,f)));let p={id:a,method:e,args:l,type:`construct`,callbackIds:o.length>0?o:void 0,transferSlots:d.length>0?d:void 0};this.sendMessage(p,u,f)})}handleResponse(e){let{id:t}=e,{result:n,error:r}=e.args;if(this.pendingRequests[t])if(this.clearTimeout(t),r)typeof r==`object`&&r.name&&r.message?this.pendingRequests[t].reject(i(r)):this.pendingRequests[t].reject(Error(r)),delete this.pendingRequests[t];else if(n&&typeof n==`object`&&n.__stream===!0){let e=this.createStreamIterable(t);this.pendingRequests[t].resolve(e),delete this.pendingRequests[t]}else{let r=n;if(e.transferSlots&&e.transferSlots.length>0){let t=e.__transferredValues||[];r=a(n,e.transferSlots,t)}this.pendingRequests[t].resolve(r),delete this.pendingRequests[t]}}async handleRequest(e){let{id:t,method:n}=e,r=Array.isArray(e.args)?e.args:[];if(e.transferSlots&&e.transferSlots.length>0){let t=e.__transferredValues||[];r=r.map(n=>a(n,e.transferSlots,t))}let i=n.split(`.`);if(!this.apiImplementation)return;let s=this.apiImplementation;for(let e=0;e<i.length-1;e++)if(s=s[i[e]],!s){this.sendError(t,`Method path ${n} not found at ${i[e]}`);return}let l=i[i.length-1],f=s[l];if(typeof f!=`function`){this.sendError(t,`Method ${n} is not a function`);return}let p=r.map(e=>{if(typeof e==`string`&&e.startsWith(`__callback__`)){let t=e.slice(12);return(...e)=>{this.invokeCallback(t,e)}}return e}),m=u(this.validators,n);if(m?.input){let e=p.filter(e=>typeof e!=`function`),r=await d(m.input,e);if(r.success===!1){this.sendError(t,new c(`input`,n,r.issues));return}}try{let e=()=>f.apply(s,p),r=this.interceptors.length>0?await o(this.interceptors,{method:n,args:p,state:{}},e):await e();if(v(r)){this.sendResponse(t,{__stream:!0}),this.streamResult(t,r,n,m);return}if(m?.output){let e=await d(m.output,r);if(e.success===!1){this.sendError(t,new c(`output`,n,e.issues));return}this.sendResponse(t,e.value);return}this.sendResponse(t,r)}catch(e){this.sendError(t,e instanceof Error?e:Error(String(e)))}}invokeCallback(e,t){let n=t,i=[],a=[],o=[];this.supportsTransfer&&(n=t.map(e=>r(e,i,a,o)));let c={id:s(),method:e,args:n,type:`callback`,transferSlots:a.length>0?a:void 0};this.sendMessage(c,i,o)}handleCallback(e){let{method:t}=e,n=this.callbacks[t];if(n){let t=Array.isArray(e.args)?e.args:[];if(e.transferSlots&&e.transferSlots.length>0){let n=e.__transferredValues||[];t=t.map(t=>a(t,e.transferSlots,n))}n(...t)}else console.error(`Callback with id ${t} not found`)}handleGet(e){let{id:t,path:n}=e;if(!n||!this.apiImplementation){this.sendError(t,`Invalid get request: missing path or API implementation`);return}try{let e=this.apiImplementation;for(let r of n)if(e=e[r],e===void 0){this.sendError(t,`Property path ${n.join(`.`)} not found at ${r}`);return}this.sendResponse(t,e)}catch(e){this.sendError(t,e instanceof Error?e:Error(String(e)))}}handleSet(e){let{id:t,path:n}=e;if(!n||!this.apiImplementation){this.sendError(t,`Invalid set request: missing path or API implementation`);return}let r=e.value;if(e.transferSlots&&e.transferSlots.length>0){let t=e.__transferredValues||[];r=a(e.value,e.transferSlots,t)}try{let e=this.apiImplementation;for(let r=0;r<n.length-1;r++)if(e=e[n[r]],!e){this.sendError(t,`Property path ${n.join(`.`)} not found at ${n[r]}`);return}let i=n[n.length-1];e[i]=r,this.sendResponse(t,!0)}catch(e){this.sendError(t,e instanceof Error?e:Error(String(e)))}}handleConstruct(e){let{id:t,method:n}=e,r=Array.isArray(e.args)?e.args:[];if(e.transferSlots&&e.transferSlots.length>0){let t=e.__transferredValues||[];r=r.map(n=>a(n,e.transferSlots,t))}let i=n.split(`.`);if(!this.apiImplementation){this.sendError(t,`No API implementation available`);return}let o=this.apiImplementation;for(let e=0;e<i.length-1;e++)if(o=o[i[e]],!o){this.sendError(t,`Constructor path ${n} not found at ${i[e]}`);return}let s=i[i.length-1],c=o[s];if(typeof c!=`function`){this.sendError(t,`${n} is not a constructor function`);return}let l=r.map(e=>{if(typeof e==`string`&&e.startsWith(`__callback__`)){let t=e.slice(12);return(...e)=>{this.invokeCallback(t,e)}}return e});try{let e=new c(...l);this.sendResponse(t,e)}catch(e){this.sendError(t,e instanceof Error?e:Error(String(e)))}}async streamResult(e,t,n,r){let i=new AbortController;this.activeStreams.set(e,{abortController:i});try{for await(let a of t){if(i.signal.aborted)break;let t=a;if(r?.output){let i=await d(r.output,t);if(i.success===!1){this.sendStreamError(e,new c(`output`,n,i.issues));return}t=i.value}this.sendMessage({id:e,method:``,args:{value:t},type:`stream-chunk`})}i.signal.aborted||this.sendMessage({id:e,method:``,args:{},type:`stream-end`})}catch(t){i.signal.aborted||this.sendStreamError(e,t instanceof Error?t:Error(String(t)))}finally{this.activeStreams.delete(e)}}sendStreamError(e,n){this.sendMessage({id:e,method:``,args:{error:t(n)},type:`stream-error`})}handleStreamCancel(e){let t=this.activeStreams.get(e.id);t&&(t.abortController.abort(),this.activeStreams.delete(e.id))}createStreamIterable(e){let t={buffer:[],done:!1,waiters:[]};this.streamConsumers.set(e,t);let n=this;return{[Symbol.asyncIterator](){return{next(){return t.buffer.length>0?Promise.resolve(t.buffer.shift()):t.done?t.error?Promise.reject(t.error):Promise.resolve({done:!0,value:void 0}):new Promise((e,n)=>{t.waiters.push({resolve:e,reject:n})})},return(){return n.sendMessage({id:e,method:``,args:{},type:`stream-cancel`}),t.done=!0,n.streamConsumers.delete(e),Promise.resolve({done:!0,value:void 0})}}}}}handleStreamChunk(e){let t=this.streamConsumers.get(e.id);if(!t)return;let n={done:!1,value:e.args.value};t.waiters.length>0?t.waiters.shift().resolve(n):t.buffer.push(n)}handleStreamEnd(e){let t=this.streamConsumers.get(e.id);if(t)if(t.done=!0,this.streamConsumers.delete(e.id),t.waiters.length>0){for(let e of t.waiters)e.resolve({done:!0,value:void 0});t.waiters.length=0}else t.buffer.push({done:!0,value:void 0})}handleStreamError(e){let t=this.streamConsumers.get(e.id);if(!t)return;let n=e.args.error,r=typeof n==`object`&&n.name&&n.message?i(n):Error(typeof n==`string`?n:`Stream error`);if(t.done=!0,t.error=r,this.streamConsumers.delete(e.id),t.waiters.length>0){for(let e of t.waiters)e.reject(r);t.waiters.length=0}}sendResponse(e,t){let n=t,i=[],a=[],o=[];this.supportsTransfer&&(n=r(t,i,a,o));let s={id:e,method:``,args:{result:n},type:`response`,transferSlots:a.length>0?a:void 0};this.sendMessage(s,i,o)}sendError(e,n){let r={id:e,method:``,args:{error:n instanceof Error?t(n):n},type:`response`};this.sendMessage(r)}sendMessage(t,n=[],r=[]){let i=e(t,this.serializationOptions,this.supportsTransfer&&n.length>0,r);i.mode===`string`?this.io.write(i.data):this.io.write({data:i.data,transfers:n})}startTimeout(e,t){!this.timeout||this.timeout===1/0||(this.pendingTimers[e]=setTimeout(()=>{let n=this.pendingRequests[e];n&&(n.reject(new g(t,this.timeout)),delete this.pendingRequests[e],delete this.pendingTimers[e])},this.timeout))}clearTimeout(e){this.pendingTimers[e]&&(clearTimeout(this.pendingTimers[e]),delete this.pendingTimers[e])}createNestedProxy(e=[]){return new Proxy(()=>{},{get:(t,n)=>{if(typeof n==`string`){if(n!==`then`)return this.createNestedProxy([...e,n]);if(n===`then`&&e.length>0){let t=this.getProperty(e);return t.then.bind(t)}}},set:(t,n,r)=>{if(typeof n==`string`){let t=[...e,n];return this.setProperty(t,r),!0}return!1},apply:(t,n,r)=>{let i=e.join(`.`);return this.callMethod(i,r)},construct:(t,n)=>this.callConstructor(e.join(`.`),n)})}getAPI(){return this.createNestedProxy()}destroy(){for(let[e,t]of Object.entries(this.pendingRequests))t.reject(Error(`RPC channel destroyed`)),this.clearTimeout(e);this.pendingRequests={},this.pendingTimers={};for(let[,e]of this.activeStreams)e.abortController.abort();this.activeStreams.clear();for(let[,e]of this.streamConsumers){e.done=!0;let t=Error(`RPC channel destroyed`);for(let n of e.waiters)n.reject(t);e.waiters.length=0}this.streamConsumers.clear(),this.freeCallbacks(),this.io&&this.io.destroy&&this.io.destroy()}freeCallbacks(){this.callbacks={},this.callbackCache.clear()}};export{m as a,l as c,s as d,o as f,c as i,u as l,g as n,p as o,_ as r,h as s,y as t,d as u};
5
+ //# sourceMappingURL=channel-CeSgoHz4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-CeSgoHz4.js","names":["current: unknown","validators: Record<string, unknown>","io: Io","error: unknown","callbackIds: string[]","transferables: Transferable[]","transferSlots: TransferSlot[]","transferredValues: unknown[]","message: Message","target: any","consumer: StreamConsumerState","result: IteratorResult<unknown>","response: Message<Response<T>>","response: Message<Response<null>>"],"sources":["../src/middleware.ts","../src/utils.ts","../src/validation.ts","../src/channel.ts"],"sourcesContent":["/**\n * Middleware / interceptor system for kkrpc.\n *\n * Interceptors wrap handler invocation on the receiving side (inside\n * `handleRequest`). They run **after** input validation and **before**\n * output validation, so they always see clean, validated data.\n *\n * Uses the standard onion model: each interceptor calls `next()` to\n * proceed to the next interceptor (or the actual handler at the end).\n * Interceptors can inspect/modify args, transform return values, measure\n * timing, enforce auth, or throw to abort the call.\n */\n\n/**\n * Context passed to each interceptor.\n */\nexport interface RPCCallContext {\n\t/** Dotted method path, e.g. \"math.grade1.add\". */\n\tmethod: string\n\t/** Arguments after callback restoration and input validation. */\n\targs: unknown[]\n\t/** Extensible state bag — interceptors can attach data for downstream interceptors. */\n\tstate: Record<string, unknown>\n}\n\n/**\n * An interceptor function.\n *\n * Call `next()` to proceed to the next interceptor (or the handler).\n * Return the result — you can transform it before returning.\n * Throw to abort the call (the error propagates to the caller).\n */\nexport type RPCInterceptor = (ctx: RPCCallContext, next: () => Promise<unknown>) => Promise<unknown>\n\n/**\n * Run an interceptor chain using the onion model.\n *\n * Builds a nested call chain: interceptor[0] → interceptor[1] → ... → handler.\n * Each interceptor's `next()` invokes the next one in the chain. The final\n * `next()` invokes `handler`.\n *\n * @param interceptors - Array of interceptor functions (executed in order)\n * @param ctx - The call context (shared across all interceptors)\n * @param handler - The actual method handler to invoke at the end of the chain\n */\nexport function runInterceptors(\n\tinterceptors: ReadonlyArray<RPCInterceptor>,\n\tctx: RPCCallContext,\n\thandler: () => Promise<unknown>\n): Promise<unknown> {\n\tlet index = 0\n\tconst next = (): Promise<unknown> => {\n\t\tif (index >= interceptors.length) {\n\t\t\treturn handler()\n\t\t}\n\t\tconst interceptor = interceptors[index++]\n\t\treturn interceptor(ctx, next)\n\t}\n\treturn next()\n}\n","/**\n * Generate a random UUID\n * @returns A random UUID\n */\nexport function generateUUID(): string {\n\treturn new Array(4)\n\t\t.fill(0)\n\t\t.map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n\t\t.join(\"-\")\n}\n","/**\n * Optional runtime validation for kkrpc.\n *\n * Uses the Standard Schema interface (https://standardschema.dev) so any\n * compatible library works: Zod (v3.24+), Valibot (v1+), ArkType (v2+), etc.\n * kkrpc embeds the ~40-line Standard Schema TypeScript interface directly —\n * no `@standard-schema/spec` dependency is needed.\n *\n * Two usage patterns:\n *\n * 1. **Type-first** — define your API type and implementation as usual, then\n * pass a `validators` map to RPCChannel that mirrors the API shape.\n *\n * 2. **Schema-first** — use `defineMethod()` / `defineAPI()` to define handlers\n * with schemas inline. Types are inferred from the schemas. Use\n * `extractValidators()` to collect the schemas for RPCChannel.\n */\nimport type { StandardSchemaV1 } from \"./standard-schema.ts\"\n\n// Re-export for convenience so users can import from \"kkrpc\" directly\nexport type { StandardSchemaV1 } from \"./standard-schema.ts\"\n\n// ---------------------------------------------------------------------------\n// Type utilities for mapping API types → validator types\n// ---------------------------------------------------------------------------\n\n/**\n * Filter callback (function) arguments out of a parameter tuple type.\n *\n * kkrpc supports passing callback functions as RPC arguments — they are\n * serialized as `\"__callback__<id>\"` strings on the wire and restored to\n * real functions on the receiving side. These callbacks cannot be validated\n * by a schema, so we strip them from the expected input tuple.\n *\n * Example: `[string, number, (x: number) => void]` → `[string, number]`\n *\n * This type is used by `MethodValidators` to derive the correct schema type\n * for `input`. At runtime, `channel.ts` does the equivalent filtering with\n * `processedArgs.filter(a => typeof a !== \"function\")`.\n */\ntype FilterCallbacks<T extends any[]> = T extends [infer Head, ...infer Tail]\n\t? Head extends (...args: any[]) => any\n\t\t? FilterCallbacks<Tail>\n\t\t: [Head, ...FilterCallbacks<Tail>]\n\t: []\n\n/** Unwrap `Promise<T>` to `T`; pass through non-Promise types unchanged. */\ntype UnwrapPromise<T> = T extends Promise<infer U> ? U : T\n\n/**\n * Validator definition for a single RPC method.\n *\n * - `input` — a Standard Schema that validates the arguments tuple.\n * Callbacks are excluded (see `FilterCallbacks`), so for a method like\n * `add(a: number, b: number)` the schema would be `z.tuple([z.number(), z.number()])`.\n *\n * - `output` — a Standard Schema that validates the return value\n * (unwrapped from Promise), e.g. `z.number()` for `Promise<number>`.\n *\n * Both are optional — you can validate only inputs, only outputs, or both.\n */\nexport interface MethodValidators<Args extends any[] = any[], Return = any> {\n\tinput?: StandardSchemaV1<FilterCallbacks<Args>, FilterCallbacks<Args>>\n\toutput?: StandardSchemaV1<UnwrapPromise<Return>, UnwrapPromise<Return>>\n}\n\n/**\n * Recursively map an API type to its validator shape.\n *\n * Given an API like:\n * ```ts\n * type API = {\n * add(a: number, b: number): Promise<number>\n * math: { multiply(a: number, b: number): Promise<number> }\n * }\n * ```\n * This produces:\n * ```ts\n * {\n * add?: { input?: StandardSchemaV1<[number, number]>, output?: StandardSchemaV1<number> }\n * math?: { multiply?: { input?: ..., output?: ... } }\n * }\n * ```\n *\n * - Functions → `MethodValidators<Parameters, ReturnType>`\n * - Nested objects → recurse into `RPCValidators<NestedAPI>`\n * - Primitive properties / constructors → excluded (`never`)\n *\n * Every key is optional at every level, so you only validate what you want.\n */\nexport type RPCValidators<API> = {\n\t[K in keyof API]?: API[K] extends (...args: infer A) => infer R\n\t\t? MethodValidators<A, R>\n\t\t: API[K] extends Record<string, unknown>\n\t\t\t? RPCValidators<API[K]>\n\t\t\t: never\n}\n\n// ---------------------------------------------------------------------------\n// RPCValidationError\n// ---------------------------------------------------------------------------\n\n/**\n * Error thrown when RPC validation fails.\n *\n * Custom properties (`phase`, `method`, `issues`) survive kkrpc's existing\n * `serializeError()` / `deserializeError()` round-trip because that code\n * copies all enumerable properties via `for (const key in error)`.\n *\n * On the caller side, use `isRPCValidationError()` to detect and narrow.\n */\nexport class RPCValidationError extends Error {\n\t/** Whether the input arguments or return value failed validation. */\n\tpublic readonly phase: \"input\" | \"output\"\n\t/** Dotted method path, e.g. \"math.divide\". */\n\tpublic readonly method: string\n\t/** Structured validation issues from the schema library. */\n\tpublic readonly issues: ReadonlyArray<StandardSchemaV1.Issue>\n\n\tconstructor(\n\t\tphase: \"input\" | \"output\",\n\t\tmethod: string,\n\t\tissues: ReadonlyArray<StandardSchemaV1.Issue>\n\t) {\n\t\tconst issueMessages = issues.map((i) => i.message).join(\"; \")\n\t\tsuper(`RPC ${phase} validation failed for \"${method}\": ${issueMessages}`)\n\t\tthis.name = \"RPCValidationError\"\n\t\tthis.phase = phase\n\t\tthis.method = method\n\t\tthis.issues = issues\n\t}\n}\n\n/**\n * Type guard for RPCValidationError.\n *\n * Checks `error.name` rather than `instanceof` because after serialization\n * over the wire, the error is reconstructed as a plain Error with custom\n * properties — not an actual RPCValidationError instance. Checking `.name`\n * works in both cases.\n */\nexport function isRPCValidationError(error: unknown): error is RPCValidationError {\n\treturn error instanceof Error && error.name === \"RPCValidationError\"\n}\n\n// ---------------------------------------------------------------------------\n// Runtime helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Look up the `MethodValidators` for a dotted method path (e.g. \"math.grade1.add\")\n * from a validators object that mirrors the API shape.\n *\n * The validators object has the same nesting as the API:\n * ```\n * { math: { grade1: { add: { input: ..., output: ... } } } }\n * ```\n * This function walks down the path segments and returns the leaf node\n * if it looks like a `MethodValidators` (has `input` or `output` key).\n * Returns `undefined` if the path doesn't exist or lands on a namespace\n * node (not a leaf with schemas).\n *\n * @param validators - The validators map (same shape as the API), or undefined\n * @param methodPath - Dotted method path, e.g. \"add\" or \"math.grade1.add\"\n */\nexport function lookupValidator(\n\tvalidators: Record<string, unknown> | undefined,\n\tmethodPath: string\n): MethodValidators | undefined {\n\tif (!validators) return undefined\n\tconst parts = methodPath.split(\".\")\n\tlet current: unknown = validators\n\tfor (const part of parts) {\n\t\tif (!current || typeof current !== \"object\") return undefined\n\t\tcurrent = (current as Record<string, unknown>)[part]\n\t}\n\t// A leaf MethodValidators node has `input` and/or `output` keys.\n\t// A namespace node (e.g. \"math\") is just a nested object without these keys.\n\tif (current && typeof current === \"object\" && (\"input\" in current || \"output\" in current)) {\n\t\treturn current as MethodValidators\n\t}\n\treturn undefined\n}\n\n/**\n * Execute a Standard Schema validator against a value.\n *\n * Calls `schema[\"~standard\"].validate(value)` per the Standard Schema spec.\n * The spec requires `validate()` to return a `Result` object (never throw),\n * but we wrap in try-catch defensively in case a non-conforming validator\n * throws unexpectedly.\n *\n * @param schema - A Standard Schema instance (e.g. a Zod schema), or undefined to skip\n * @param value - The value to validate (args tuple for input, return value for output)\n * @returns `{ success: true, value }` if valid (value may be transformed/coerced by the schema),\n * or `{ success: false, issues }` with structured validation issues\n */\nexport async function runValidation(\n\tschema: StandardSchemaV1 | undefined,\n\tvalue: unknown\n): Promise<\n\t| { success: true; value: unknown }\n\t| { success: false; issues: ReadonlyArray<StandardSchemaV1.Issue> }\n> {\n\tif (!schema) return { success: true, value }\n\ttry {\n\t\tconst result = await schema[\"~standard\"].validate(value)\n\t\tif (result.issues) {\n\t\t\treturn { success: false, issues: result.issues }\n\t\t}\n\t\treturn { success: true, value: result.value }\n\t} catch (error) {\n\t\t// Standard Schema spec says validate() should never throw, but we handle\n\t\t// it gracefully in case of a non-conforming validator implementation.\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tissues: [{ message: `Validator threw: ${error}` }]\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Schema-first helpers: defineMethod / defineAPI / extractValidators\n// ---------------------------------------------------------------------------\n\n/** Schema pair accepted by `defineMethod`. Both input and output are required. */\nexport interface MethodSchemaConfig<\n\tInputSchema extends StandardSchemaV1<any, any>,\n\tOutputSchema extends StandardSchemaV1<any, any>\n> {\n\tinput: InputSchema\n\toutput: OutputSchema\n}\n\n/**\n * Non-enumerable property key used to attach validator metadata to handler\n * functions created by `defineMethod()`. The `~` prefix follows the Standard\n * Schema convention for \"private\" metadata keys. `extractValidators()` reads\n * this key to collect schemas into an RPCValidators map.\n */\nconst VALIDATORS_KEY = \"~validators\" as const\n\n/**\n * The type of a function created by `defineMethod()`.\n *\n * It is both callable (the handler) and carries `~validators` metadata.\n * The function signature is inferred from the schemas:\n * - If the input schema's output type is a tuple, args are spread\n * - Otherwise the schema output is wrapped in a single-element tuple\n *\n * `extractValidators()` reads the `[~validators]` property to build the\n * validators map that RPCChannel needs.\n */\nexport interface DefinedMethod<\n\tInputSchema extends StandardSchemaV1<any, any>,\n\tOutputSchema extends StandardSchemaV1<any, any>\n> {\n\t(\n\t\t...args: StandardSchemaV1.InferOutput<InputSchema> extends readonly any[]\n\t\t\t? StandardSchemaV1.InferOutput<InputSchema>\n\t\t\t: [StandardSchemaV1.InferOutput<InputSchema>]\n\t): Promise<StandardSchemaV1.InferOutput<OutputSchema>>\n\n\treadonly [VALIDATORS_KEY]: {\n\t\tinput: InputSchema\n\t\toutput: OutputSchema\n\t}\n}\n\n/**\n * Define a single RPC method with schema-first validation.\n * Types are **inferred** from the schemas — no separate type definition needed.\n *\n * @example\n * ```ts\n * const echo = defineMethod(\n * { input: z.tuple([z.string()]), output: z.string() },\n * async (message) => message\n * )\n * ```\n */\nexport function defineMethod<\n\tInputSchema extends StandardSchemaV1<any, any>,\n\tOutputSchema extends StandardSchemaV1<any, any>\n>(\n\tschemas: MethodSchemaConfig<InputSchema, OutputSchema>,\n\thandler: (\n\t\t...args: StandardSchemaV1.InferOutput<InputSchema> extends readonly any[]\n\t\t\t? StandardSchemaV1.InferOutput<InputSchema>\n\t\t\t: [StandardSchemaV1.InferOutput<InputSchema>]\n\t) => Promise<StandardSchemaV1.InferOutput<OutputSchema>>\n): DefinedMethod<InputSchema, OutputSchema> {\n\t// Attach schemas as a non-enumerable property so they don't interfere with\n\t// normal usage (e.g. Object.keys, JSON.stringify) but are accessible to\n\t// `extractValidators()`. We use `Object.defineProperty` to avoid `as any`.\n\tObject.defineProperty(handler, VALIDATORS_KEY, {\n\t\tvalue: { input: schemas.input, output: schemas.output },\n\t\tenumerable: false,\n\t\twritable: false\n\t})\n\treturn handler as DefinedMethod<InputSchema, OutputSchema>\n}\n\n/**\n * Define a complete API with schema-first validation.\n * Identity function — returns the object as-is but enables `InferAPI<typeof api>`.\n *\n * @example\n * ```ts\n * const api = defineAPI({\n * echo: defineMethod({ input: z.tuple([z.string()]), output: z.string() }, async (msg) => msg),\n * math: {\n * add: defineMethod({ input: z.tuple([z.number(), z.number()]), output: z.number() }, async (a, b) => a + b),\n * }\n * })\n * ```\n */\nexport function defineAPI<T extends Record<string, unknown>>(api: T): T {\n\treturn api\n}\n\n/**\n * Walk a `defineAPI()` result and collect `~validators` metadata from\n * `defineMethod()` handlers into an `RPCValidators`-shaped object.\n *\n * For each key in the API object:\n * - If it's a function with `~validators` metadata → extract the schemas\n * - If it's a plain object (namespace) → recurse into it\n * - If it's a Standard Schema object (has `~standard`) → skip it\n * (this prevents treating schema objects as namespace nodes)\n * - Plain functions without metadata are skipped (no validation for them)\n *\n * The result can be passed directly to `RPCChannel`'s `validators` option.\n */\nexport function extractValidators<T extends Record<string, unknown>>(\n\tapi: T\n): Record<string, unknown> {\n\tconst validators: Record<string, unknown> = {}\n\tfor (const key of Object.keys(api)) {\n\t\tconst value = api[key]\n\t\tif (typeof value === \"function\" && VALIDATORS_KEY in value) {\n\t\t\t// This is a defineMethod() handler — extract its schema metadata\n\t\t\tvalidators[key] = (value as Record<string, unknown>)[VALIDATORS_KEY]\n\t\t} else if (typeof value === \"object\" && value !== null && !(\"~standard\" in value)) {\n\t\t\t// This is a namespace object (e.g. { math: { add: defineMethod(...) } }).\n\t\t\t// The `~standard` check prevents descending into Standard Schema objects,\n\t\t\t// which are also plain objects but should not be treated as API namespaces.\n\t\t\tconst nested = extractValidators(value as Record<string, unknown>)\n\t\t\tif (Object.keys(nested).length > 0) {\n\t\t\t\tvalidators[key] = nested\n\t\t\t}\n\t\t}\n\t}\n\treturn validators\n}\n\n// ---------------------------------------------------------------------------\n// Type utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Infer the plain API type from a `defineAPI()` result.\n *\n * `defineAPI()` returns an object where methods are `DefinedMethod` instances\n * (functions with `~validators` metadata). The client side doesn't know about\n * `DefinedMethod` — it just needs the plain function signatures. This type\n * strips the metadata and produces a clean API type suitable for\n * `RPCChannel<{}, InferAPI<typeof api>>`.\n *\n * - `DefinedMethod` → plain async function with inferred arg/return types\n * - Nested `Record<string, unknown>` → recurse\n * - Everything else → pass through unchanged\n */\nexport type InferAPI<T> = {\n\t[K in keyof T]: T[K] extends DefinedMethod<infer I, infer O>\n\t\t? (\n\t\t\t\t...args: StandardSchemaV1.InferOutput<I> extends readonly any[]\n\t\t\t\t\t? StandardSchemaV1.InferOutput<I>\n\t\t\t\t\t: [StandardSchemaV1.InferOutput<I>]\n\t\t\t) => Promise<StandardSchemaV1.InferOutput<O>>\n\t\t: T[K] extends Record<string, unknown>\n\t\t\t? InferAPI<T[K]>\n\t\t\t: T[K]\n}\n","import type { IoInterface, IoMessage } from \"./interface.ts\"\nimport { runInterceptors, type RPCInterceptor } from \"./middleware.ts\"\nimport {\n\tdecodeMessage,\n\tdeserializeError,\n\tencodeMessage,\n\tprocessValueForTransfer,\n\treconstructValueFromTransfer,\n\tserializeError,\n\ttype EnhancedError,\n\ttype Message,\n\ttype Response,\n\ttype SerializationOptions,\n\ttype TransferSlot\n} from \"./serialization.ts\"\nimport { generateUUID } from \"./utils.ts\"\nimport {\n\tlookupValidator,\n\tRPCValidationError,\n\trunValidation,\n\ttype RPCValidators\n} from \"./validation.ts\"\n\n// ---------------------------------------------------------------------------\n// RPCTimeoutError\n// ---------------------------------------------------------------------------\n\n/**\n * Error thrown when an RPC call exceeds the configured timeout.\n *\n * Custom properties (`method`, `timeoutMs`) survive kkrpc's\n * `serializeError()` / `deserializeError()` round-trip (same mechanism\n * as `RPCValidationError`).\n */\nexport class RPCTimeoutError extends Error {\n\tpublic readonly method: string\n\tpublic readonly timeoutMs: number\n\n\tconstructor(method: string, timeoutMs: number) {\n\t\tsuper(`RPC call to \"${method}\" timed out after ${timeoutMs}ms`)\n\t\tthis.name = \"RPCTimeoutError\"\n\t\tthis.method = method\n\t\tthis.timeoutMs = timeoutMs\n\t}\n}\n\n/**\n * Type guard for RPCTimeoutError.\n *\n * Uses `.name` check (not `instanceof`) so it works on deserialized\n * errors received over the wire.\n */\nexport function isRPCTimeoutError(error: unknown): error is RPCTimeoutError {\n\treturn error instanceof Error && error.name === \"RPCTimeoutError\"\n}\n\ninterface PendingRequest {\n\tresolve: (result: any) => void\n\treject: (error: any) => void\n}\n\ninterface CallbackFunction {\n\t(...args: unknown[]): void\n}\n\n// ---------------------------------------------------------------------------\n// Streaming internals\n// ---------------------------------------------------------------------------\n\n/**\n * Consumer-side state for an active stream.\n *\n * Chunks arrive asynchronously from the producer. The consumer reads them\n * via `for await...of`. We bridge these with a simple queue: chunks that\n * arrive before the consumer calls `next()` are buffered; `next()` calls\n * that arrive before a chunk are parked as pending resolvers.\n */\ninterface StreamConsumerState {\n\t/** Buffered iterator results (chunks, end, or error) that arrived before the consumer called next(). */\n\tbuffer: IteratorResult<unknown>[]\n\t/** Error received from the producer (stream-error). Stored so subsequent next() calls reject. */\n\terror?: Error\n\t/** Whether the stream has ended (stream-end or stream-error received). */\n\tdone: boolean\n\t/** Pending next() resolve/reject callbacks waiting for the next chunk. */\n\twaiters: Array<{\n\t\tresolve: (result: IteratorResult<unknown>) => void\n\t\treject: (error: Error) => void\n\t}>\n}\n\n/**\n * Producer-side state for an active stream.\n */\ninterface StreamProducerState {\n\t/** AbortController to signal cancellation to the streaming loop. */\n\tabortController: AbortController\n}\n\n/** Helper to detect AsyncIterable objects. */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n\treturn (\n\t\tvalue !== null &&\n\t\tvalue !== undefined &&\n\t\ttypeof value === \"object\" &&\n\t\tSymbol.asyncIterator in (value as any)\n\t)\n}\n\n/**\n * A bidirectional Stdio IPC channel in RPC style.\n * This allows 2 JS/TS processes to call each other's API like using libraries in RPC style,\n * without needing to deal with `argv`, `stdin`, `stdout` directly.\n */\nexport class RPCChannel<\n\tLocalAPI extends Record<string, any>,\n\tRemoteAPI extends Record<string, any>,\n\tIo extends IoInterface = IoInterface\n> {\n\tprivate pendingRequests: Record<string, PendingRequest> = {}\n\tprivate pendingTimers: Record<string, ReturnType<typeof setTimeout>> = {}\n\tprivate callbacks: Record<string, CallbackFunction> = {}\n\tprivate callbackCache: Map<CallbackFunction, string> = new Map()\n\t/** Producer-side: active outgoing streams keyed by request id. */\n\tprivate activeStreams: Map<string, StreamProducerState> = new Map()\n\t/** Consumer-side: active incoming streams keyed by request id. */\n\tprivate streamConsumers: Map<string, StreamConsumerState> = new Map()\n\tprivate count: number = 0\n\tprivate messageStr = \"\"\n\tprivate apiImplementation?: LocalAPI\n\t/**\n\t * Optional validators map that mirrors the LocalAPI shape.\n\t * When set, incoming RPC calls are validated before the handler runs (input)\n\t * and after it returns (output). Validation only applies to the locally\n\t * exposed API — kkrpc is bidirectional, so each side validates its own API.\n\t */\n\tprivate validators?: RPCValidators<LocalAPI>\n\t/** Interceptor chain that wraps handler invocation in handleRequest. */\n\tprivate interceptors: ReadonlyArray<RPCInterceptor>\n\tprivate serializationOptions: SerializationOptions\n\tprivate supportsTransfer = false\n\tprivate structuredClone = false\n\t/** Timeout in ms for outgoing RPC calls. 0 or Infinity means no timeout. */\n\tprivate timeout: number\n\n\tconstructor(\n\t\tprivate io: Io,\n\t\toptions?: {\n\t\t\texpose?: LocalAPI\n\t\t\tserialization?: SerializationOptions\n\t\t\tenableTransfer?: boolean\n\t\t\t/** Optional validators for the exposed API. Validates inputs/outputs on the receiving side. */\n\t\t\tvalidators?: RPCValidators<LocalAPI>\n\t\t\t/** Interceptors that wrap handler invocation on the receiving side. */\n\t\t\tinterceptors?: RPCInterceptor[]\n\t\t\t/** Timeout in ms for outgoing RPC calls. Default: 0 (no timeout). */\n\t\t\ttimeout?: number\n\t\t}\n\t) {\n\t\tthis.apiImplementation = options?.expose\n\t\tthis.validators = options?.validators\n\t\tthis.interceptors = options?.interceptors ?? []\n\t\tthis.timeout = options?.timeout ?? 0\n\t\tthis.serializationOptions = options?.serialization || {}\n\t\tthis.structuredClone = io.capabilities?.structuredClone === true\n\t\tif (\n\t\t\tthis.structuredClone &&\n\t\t\tio.capabilities?.transfer === true &&\n\t\t\toptions?.enableTransfer !== false\n\t\t) {\n\t\t\tthis.supportsTransfer = true\n\t\t}\n\t\tthis.listen()\n\t}\n\n\t/**\n\t * Exposes a local API implementation that can be called remotely\n\t * @param api The local API implementation to expose\n\t */\n\texpose(api: LocalAPI, validators?: RPCValidators<LocalAPI>) {\n\t\tthis.apiImplementation = api\n\t\tif (validators) this.validators = validators\n\t}\n\n\t/**\n\t * Returns the IO interface used by this channel\n\t * @returns The IO interface instance\n\t */\n\tgetIO(): Io {\n\t\treturn this.io\n\t}\n\n\t/**\n\t * Listens for incoming messages on the IO interface and dispatches them.\n\t */\n\tprivate async listen(): Promise<void> {\n\t\twhile (true) {\n\t\t\t// Check if IO interface is destroyable and has been destroyed\n\t\t\tif (\"isDestroyed\" in this.io && (this.io as Record<string, unknown>).isDestroyed) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst incoming = await this.io.read()\n\t\t\t\tif (incoming === null || incoming === undefined) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tawait this.handleIncomingMessage(incoming)\n\t\t\t} catch (error: unknown) {\n\t\t\t\t// If the error indicates the adapter is destroyed, stop listening\n\t\t\t\tif (error instanceof Error && error.message.includes(\"destroyed\")) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tconsole.error(\"kkrpc: failed to handle incoming message\", error)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async handleIncomingMessage(raw: string | IoMessage): Promise<void> {\n\t\tif (typeof raw === \"string\") {\n\t\t\tif (raw.trim().length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.bufferString(raw)\n\t\t\treturn\n\t\t}\n\n\t\tconst payload = raw.data\n\t\tif (typeof payload === \"string\") {\n\t\t\tawait this.handleIncomingMessage(payload)\n\t\t\treturn\n\t\t}\n\n\t\tif (!payload || typeof payload !== \"object\") {\n\t\t\treturn\n\t\t}\n\n\t\tif (!payload.__transferredValues && raw.transfers && raw.transfers.length > 0) {\n\t\t\tpayload.__transferredValues = raw.transfers\n\t\t}\n\n\t\tconst message = await decodeMessage(payload)\n\t\tawait this.processDecodedMessage(message)\n\t}\n\n\tprivate bufferString(chunk: string): void {\n\t\tthis.messageStr += chunk\n\t\tconst lastChar = this.messageStr[this.messageStr.length - 1]\n\t\tconst msgsSplit = this.messageStr.split(\"\\n\")\n\t\tconst msgs = lastChar === \"\\n\" ? msgsSplit : msgsSplit.slice(0, -1)\n\t\tthis.messageStr = lastChar === \"\\n\" ? \"\" : (msgsSplit.at(-1) ?? \"\")\n\n\t\tfor (const msgStr of msgs.map((msg) => msg.trim()).filter(Boolean)) {\n\t\t\tif (msgStr.startsWith(\"{\")) {\n\t\t\t\tvoid this.handleMessageStr(msgStr)\n\t\t\t} else {\n\t\t\t\tconsole.log(`(kkrpc stdout passthrough):`, msgStr)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async handleMessageStr(messageStr: string): Promise<void> {\n\t\tthis.count++\n\t\ttry {\n\t\t\tconst parsedMessage = await decodeMessage(messageStr)\n\t\t\tawait this.processDecodedMessage(parsedMessage)\n\t\t} catch (error) {\n\t\t\tconsole.error(\"failed to parse message\", typeof messageStr, messageStr, error)\n\t\t}\n\t}\n\n\tprivate async processDecodedMessage(parsedMessage: Message): Promise<void> {\n\t\tif (parsedMessage.type === \"response\") {\n\t\t\tthis.handleResponse(parsedMessage as Message<Response<any>>)\n\t\t} else if (parsedMessage.type === \"request\") {\n\t\t\tthis.handleRequest(parsedMessage)\n\t\t} else if (parsedMessage.type === \"callback\") {\n\t\t\tthis.handleCallback(parsedMessage)\n\t\t} else if (parsedMessage.type === \"get\") {\n\t\t\tthis.handleGet(parsedMessage)\n\t\t} else if (parsedMessage.type === \"set\") {\n\t\t\tthis.handleSet(parsedMessage)\n\t\t} else if (parsedMessage.type === \"construct\") {\n\t\t\tthis.handleConstruct(parsedMessage)\n\t\t} else if (parsedMessage.type === \"stream-chunk\") {\n\t\t\tthis.handleStreamChunk(parsedMessage)\n\t\t} else if (parsedMessage.type === \"stream-end\") {\n\t\t\tthis.handleStreamEnd(parsedMessage)\n\t\t} else if (parsedMessage.type === \"stream-error\") {\n\t\t\tthis.handleStreamError(parsedMessage)\n\t\t} else if (parsedMessage.type === \"stream-cancel\") {\n\t\t\tthis.handleStreamCancel(parsedMessage)\n\t\t} else {\n\t\t\tconsole.error(\"received unknown message type\", parsedMessage, typeof parsedMessage)\n\t\t}\n\t}\n\n\t/**\n\t * Calls a method on the remote API\n\t * @param method The name of the method to call\n\t * @param args Arguments to pass to the remote method\n\t * @returns Promise that resolves with the result of the remote call\n\t */\n\tpublic callMethod<T extends keyof RemoteAPI>(method: T, args: any[]): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst messageId = generateUUID()\n\t\t\tthis.pendingRequests[messageId] = { resolve, reject }\n\t\t\tthis.startTimeout(messageId, method as string)\n\n\t\t\tconst callbackIds: string[] = []\n\t\t\tconst argsWithCallbacks = args.map((arg) => {\n\t\t\t\tif (typeof arg === \"function\") {\n\t\t\t\t\tlet callbackId = this.callbackCache.get(arg)\n\t\t\t\t\tif (!callbackId) {\n\t\t\t\t\t\tcallbackId = generateUUID()\n\t\t\t\t\t\tthis.callbacks[callbackId] = arg\n\t\t\t\t\t\tthis.callbackCache.set(arg, callbackId)\n\t\t\t\t\t}\n\t\t\t\t\tcallbackIds.push(callbackId)\n\t\t\t\t\treturn `__callback__${callbackId}`\n\t\t\t\t}\n\t\t\t\treturn arg\n\t\t\t})\n\n\t\t\tlet finalArgs = argsWithCallbacks\n\t\t\tconst transferables: Transferable[] = []\n\t\t\tconst transferSlots: TransferSlot[] = []\n\t\t\tconst transferredValues: unknown[] = []\n\n\t\t\tif (this.supportsTransfer) {\n\t\t\t\tfinalArgs = argsWithCallbacks.map((arg) =>\n\t\t\t\t\tprocessValueForTransfer(arg, transferables, transferSlots, transferredValues)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst message: Message = {\n\t\t\t\tid: messageId,\n\t\t\t\tmethod: method as string,\n\t\t\t\targs: finalArgs,\n\t\t\t\ttype: \"request\",\n\t\t\t\tcallbackIds: callbackIds.length > 0 ? callbackIds : undefined,\n\t\t\t\ttransferSlots: transferSlots.length > 0 ? transferSlots : undefined\n\t\t\t}\n\n\t\t\tthis.sendMessage(message, transferables, transferredValues)\n\t\t})\n\t}\n\n\t/**\n\t * Gets a property value from the remote API\n\t * @param path The property path (dot notation string or array)\n\t * @returns Promise that resolves with the property value\n\t */\n\tpublic getProperty(path: string | string[]): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst messageId = generateUUID()\n\t\t\tthis.pendingRequests[messageId] = { resolve, reject }\n\t\t\tconst propertyPath = Array.isArray(path) ? path : path.split(\".\")\n\t\t\tthis.startTimeout(messageId, `get:${propertyPath.join(\".\")}`)\n\t\t\tconst message: Message = {\n\t\t\t\tid: messageId,\n\t\t\t\tmethod: \"\",\n\t\t\t\targs: {},\n\t\t\t\ttype: \"get\",\n\t\t\t\tpath: propertyPath\n\t\t\t}\n\t\t\tthis.sendMessage(message)\n\t\t})\n\t}\n\n\t/**\n\t * Sets a property value on the remote API\n\t * @param path The property path (dot notation string or array)\n\t * @param value The value to set\n\t * @returns Promise that resolves when the property is set\n\t */\n\tpublic setProperty(path: string | string[], value: any): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst messageId = generateUUID()\n\t\t\tthis.pendingRequests[messageId] = { resolve, reject }\n\t\t\tconst propertyPath = Array.isArray(path) ? path : path.split(\".\")\n\t\t\tthis.startTimeout(messageId, `set:${propertyPath.join(\".\")}`)\n\t\t\tlet processedValue = value\n\t\t\tconst transferables: Transferable[] = []\n\t\t\tconst transferSlots: TransferSlot[] = []\n\t\t\tconst transferredValues: unknown[] = []\n\n\t\t\tif (this.supportsTransfer) {\n\t\t\t\tprocessedValue = processValueForTransfer(\n\t\t\t\t\tvalue,\n\t\t\t\t\ttransferables,\n\t\t\t\t\ttransferSlots,\n\t\t\t\t\ttransferredValues\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst message: Message = {\n\t\t\t\tid: messageId,\n\t\t\t\tmethod: \"\",\n\t\t\t\targs: {},\n\t\t\t\ttype: \"set\",\n\t\t\t\tpath: propertyPath,\n\t\t\t\tvalue: processedValue,\n\t\t\t\ttransferSlots: transferSlots.length > 0 ? transferSlots : undefined\n\t\t\t}\n\n\t\t\tthis.sendMessage(message, transferables, transferredValues)\n\t\t})\n\t}\n\n\t/**\n\t * Calls a constructor on the remote API\n\t * @param constructor The name of the constructor to call\n\t * @param args Arguments to pass to the remote constructor\n\t * @returns Promise that resolves with the constructed instance\n\t */\n\tpublic callConstructor<T extends keyof RemoteAPI>(constructor: T, args: any[]): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst messageId = generateUUID()\n\t\t\tthis.pendingRequests[messageId] = { resolve, reject }\n\t\t\tthis.startTimeout(messageId, constructor as string)\n\n\t\t\tconst callbackIds: string[] = []\n\t\t\tconst argsWithCallbacks = args.map((arg) => {\n\t\t\t\tif (typeof arg === \"function\") {\n\t\t\t\t\tlet callbackId = this.callbackCache.get(arg)\n\t\t\t\t\tif (!callbackId) {\n\t\t\t\t\t\tcallbackId = generateUUID()\n\t\t\t\t\t\tthis.callbacks[callbackId] = arg\n\t\t\t\t\t\tthis.callbackCache.set(arg, callbackId)\n\t\t\t\t\t}\n\t\t\t\t\tcallbackIds.push(callbackId)\n\t\t\t\t\treturn `__callback__${callbackId}`\n\t\t\t\t}\n\t\t\t\treturn arg\n\t\t\t})\n\n\t\t\tlet finalArgs = argsWithCallbacks\n\t\t\tconst transferables: Transferable[] = []\n\t\t\tconst transferSlots: TransferSlot[] = []\n\t\t\tconst transferredValues: unknown[] = []\n\n\t\t\tif (this.supportsTransfer) {\n\t\t\t\tfinalArgs = argsWithCallbacks.map((arg) =>\n\t\t\t\t\tprocessValueForTransfer(arg, transferables, transferSlots, transferredValues)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst message: Message = {\n\t\t\t\tid: messageId,\n\t\t\t\tmethod: constructor as string,\n\t\t\t\targs: finalArgs,\n\t\t\t\ttype: \"construct\",\n\t\t\t\tcallbackIds: callbackIds.length > 0 ? callbackIds : undefined,\n\t\t\t\ttransferSlots: transferSlots.length > 0 ? transferSlots : undefined\n\t\t\t}\n\n\t\t\tthis.sendMessage(message, transferables, transferredValues)\n\t\t})\n\t}\n\n\t/**\n\t * Handles responses received from remote method calls\n\t * @param response The response message to handle\n\t * @private\n\t */\n\tprivate handleResponse(response: Message<Response<any>>): void {\n\t\tconst { id } = response\n\t\tconst { result, error } = response.args\n\t\tif (this.pendingRequests[id]) {\n\t\t\tthis.clearTimeout(id)\n\t\t\tif (error) {\n\t\t\t\t// Handle enhanced error objects\n\t\t\t\tif (typeof error === \"object\" && error.name && error.message) {\n\t\t\t\t\tthis.pendingRequests[id].reject(deserializeError(error as EnhancedError))\n\t\t\t\t} else {\n\t\t\t\t\t// Fall back to simple string errors for backward compatibility\n\t\t\t\t\tthis.pendingRequests[id].reject(new Error(error as string))\n\t\t\t\t}\n\t\t\t\tdelete this.pendingRequests[id]\n\t\t\t} else if (result && typeof result === \"object\" && (result as any).__stream === true) {\n\t\t\t\t// Stream response: resolve the pending request with an AsyncIterable\n\t\t\t\tconst iterable = this.createStreamIterable(id)\n\t\t\t\tthis.pendingRequests[id].resolve(iterable)\n\t\t\t\tdelete this.pendingRequests[id]\n\t\t\t} else {\n\t\t\t\tlet finalResult = result\n\t\t\t\tif (response.transferSlots && response.transferSlots.length > 0) {\n\t\t\t\t\tconst transferredValues = (response as any).__transferredValues || []\n\t\t\t\t\tfinalResult = reconstructValueFromTransfer(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\tresponse.transferSlots,\n\t\t\t\t\t\ttransferredValues\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthis.pendingRequests[id].resolve(finalResult)\n\t\t\t\tdelete this.pendingRequests[id]\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles incoming method call requests from the remote endpoint\n\t * @param request The request message to handle\n\t * @private\n\t */\n\tprivate async handleRequest(request: Message): Promise<void> {\n\t\tconst { id, method } = request\n\t\tlet incomingArgs = Array.isArray(request.args) ? request.args : []\n\n\t\tif (request.transferSlots && request.transferSlots.length > 0) {\n\t\t\tconst transferredValues = (request as any).__transferredValues || []\n\t\t\tincomingArgs = incomingArgs.map((arg: any) =>\n\t\t\t\treconstructValueFromTransfer(arg, request.transferSlots!, transferredValues)\n\t\t\t)\n\t\t}\n\n\t\tconst methodPath = method.split(\".\")\n\t\tif (!this.apiImplementation) return\n\t\tlet target: any = this.apiImplementation\n\n\t\tfor (let i = 0; i < methodPath.length - 1; i++) {\n\t\t\ttarget = target[methodPath[i]]\n\t\t\tif (!target) {\n\t\t\t\tthis.sendError(id, `Method path ${method} not found at ${methodPath[i]}`)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tconst finalMethod = methodPath[methodPath.length - 1]\n\t\tconst targetMethod = target[finalMethod]\n\n\t\tif (typeof targetMethod !== \"function\") {\n\t\t\tthis.sendError(id, `Method ${method} is not a function`)\n\t\t\treturn\n\t\t}\n\n\t\t// Restore callback arguments: the caller serialized callback functions as\n\t\t// \"__callback__<id>\" placeholder strings. Here we convert them back into\n\t\t// real functions that, when called, send a callback message to the remote side.\n\t\tconst processedArgs = incomingArgs.map((arg: any) => {\n\t\t\tif (typeof arg === \"string\" && arg.startsWith(\"__callback__\")) {\n\t\t\t\tconst callbackId = arg.slice(12)\n\t\t\t\treturn (...callbackArgs: any[]) => {\n\t\t\t\t\tthis.invokeCallback(callbackId, callbackArgs)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn arg\n\t\t})\n\n\t\t// --- Input / Output Validation ---\n\t\t// Look up the validator for this method path (e.g. \"math.divide\").\n\t\t// If no validators were configured, or this method has none, this is undefined\n\t\t// and validation is skipped entirely (backward-compatible no-op).\n\t\tconst methodValidator = lookupValidator(this.validators, method)\n\n\t\tif (methodValidator?.input) {\n\t\t\t// Filter out callback arguments before validating. After the .map() above,\n\t\t\t// callback placeholders have been replaced with real functions, so we filter\n\t\t\t// by `typeof a !== \"function\"`. This matches the FilterCallbacks<T> type\n\t\t\t// utility that strips function params from the schema's expected input tuple.\n\t\t\tconst dataArgs = processedArgs.filter((a: any) => typeof a !== \"function\")\n\t\t\tconst inputResult = await runValidation(methodValidator.input, dataArgs)\n\t\t\t// Use `=== false` (not `!`) for discriminated union narrowing — without a\n\t\t\t// tsconfig, tsc doesn't narrow `!result.success` to the failure branch.\n\t\t\tif (inputResult.success === false) {\n\t\t\t\tthis.sendError(id, new RPCValidationError(\"input\", method, inputResult.issues))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\t// Wrap the handler invocation with the interceptor chain.\n\t\t\t// Interceptors run after input validation, so they see clean args.\n\t\t\tconst invokeHandler = () => targetMethod.apply(target, processedArgs)\n\t\t\tconst result =\n\t\t\t\tthis.interceptors.length > 0\n\t\t\t\t\t? await runInterceptors(\n\t\t\t\t\t\t\tthis.interceptors,\n\t\t\t\t\t\t\t{ method, args: processedArgs, state: {} },\n\t\t\t\t\t\t\tinvokeHandler\n\t\t\t\t\t\t)\n\t\t\t\t\t: await invokeHandler()\n\n\t\t\t// If the handler returned an AsyncIterable, stream it instead of\n\t\t\t// sending a single response. We notify the consumer with a special\n\t\t\t// \"stream\" flag on the initial response, then send chunks.\n\t\t\tif (isAsyncIterable(result)) {\n\t\t\t\tthis.sendResponse(id, { __stream: true })\n\t\t\t\tthis.streamResult(id, result, method, methodValidator)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Output validation: if an output schema is defined, validate the handler's\n\t\t\t// return value before sending it back. This catches bugs where the handler\n\t\t\t// returns an unexpected type (e.g. number instead of string).\n\t\t\tif (methodValidator?.output) {\n\t\t\t\tconst outputResult = await runValidation(methodValidator.output, result)\n\t\t\t\tif (outputResult.success === false) {\n\t\t\t\t\tthis.sendError(id, new RPCValidationError(\"output\", method, outputResult.issues))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Send the validated value (which may have been transformed/coerced by the schema)\n\t\t\t\tthis.sendResponse(id, outputResult.value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.sendResponse(id, result)\n\t\t} catch (error: unknown) {\n\t\t\tthis.sendError(id, error instanceof Error ? error : new Error(String(error)))\n\t\t}\n\t}\n\n\t/**\n\t * Invokes a callback on the remote endpoint\n\t * @param callbackId The ID of the callback to invoke\n\t * @param args Arguments to pass to the callback\n\t * @private\n\t */\n\tprivate invokeCallback(callbackId: string, args: any[]): void {\n\t\tlet finalArgs = args\n\t\tconst transferables: Transferable[] = []\n\t\tconst transferSlots: TransferSlot[] = []\n\t\tconst transferredValues: unknown[] = []\n\n\t\tif (this.supportsTransfer) {\n\t\t\tfinalArgs = args.map((arg) =>\n\t\t\t\tprocessValueForTransfer(arg, transferables, transferSlots, transferredValues)\n\t\t\t)\n\t\t}\n\n\t\tconst message: Message = {\n\t\t\tid: generateUUID(),\n\t\t\tmethod: callbackId,\n\t\t\targs: finalArgs,\n\t\t\ttype: \"callback\",\n\t\t\ttransferSlots: transferSlots.length > 0 ? transferSlots : undefined\n\t\t}\n\t\tthis.sendMessage(message, transferables, transferredValues)\n\t}\n\n\t/**\n\t * Handles callback invocations received from the remote endpoint\n\t * @param message The callback message to handle\n\t * @private\n\t */\n\tprivate handleCallback(message: Message): void {\n\t\tconst { method: callbackId } = message\n\t\tconst callback = this.callbacks[callbackId]\n\t\tif (callback) {\n\t\t\tlet callbackArgs = Array.isArray(message.args) ? message.args : []\n\t\t\tif (message.transferSlots && message.transferSlots.length > 0) {\n\t\t\t\tconst transferredValues = (message as any).__transferredValues || []\n\t\t\t\tcallbackArgs = callbackArgs.map((arg: any) =>\n\t\t\t\t\treconstructValueFromTransfer(arg, message.transferSlots!, transferredValues)\n\t\t\t\t)\n\t\t\t}\n\t\t\tcallback(...callbackArgs)\n\t\t} else {\n\t\t\tconsole.error(`Callback with id ${callbackId} not found`)\n\t\t}\n\t}\n\n\t/**\n\t * Handles property get requests from the remote endpoint\n\t * @param request The get request message to handle\n\t * @private\n\t */\n\tprivate handleGet(request: Message): void {\n\t\tconst { id, path } = request\n\t\tif (!path || !this.apiImplementation) {\n\t\t\tthis.sendError(id, \"Invalid get request: missing path or API implementation\")\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\t// Traverse the object path to get the property value\n\t\t\tlet target: any = this.apiImplementation\n\t\t\tfor (const prop of path) {\n\t\t\t\ttarget = target[prop]\n\t\t\t\tif (target === undefined) {\n\t\t\t\t\tthis.sendError(id, `Property path ${path.join(\".\")} not found at ${prop}`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.sendResponse(id, target)\n\t\t} catch (error: unknown) {\n\t\t\tthis.sendError(id, error instanceof Error ? error : new Error(String(error)))\n\t\t}\n\t}\n\n\t/**\n\t * Handles property set requests from the remote endpoint\n\t * @param request The set request message to handle\n\t * @private\n\t */\n\tprivate handleSet(request: Message): void {\n\t\tconst { id, path } = request\n\t\tif (!path || !this.apiImplementation) {\n\t\t\tthis.sendError(id, \"Invalid set request: missing path or API implementation\")\n\t\t\treturn\n\t\t}\n\n\t\tlet incomingValue = request.value\n\t\tif (request.transferSlots && request.transferSlots.length > 0) {\n\t\t\tconst transferredValues = (request as any).__transferredValues || []\n\t\t\tincomingValue = reconstructValueFromTransfer(\n\t\t\t\trequest.value,\n\t\t\t\trequest.transferSlots,\n\t\t\t\ttransferredValues\n\t\t\t)\n\t\t}\n\n\t\ttry {\n\t\t\t// Traverse to the parent object\n\t\t\tlet target: any = this.apiImplementation\n\t\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\t\ttarget = target[path[i]]\n\t\t\t\tif (!target) {\n\t\t\t\t\tthis.sendError(id, `Property path ${path.join(\".\")} not found at ${path[i]}`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the final property\n\t\t\tconst finalProp = path[path.length - 1]\n\t\t\ttarget[finalProp] = incomingValue\n\t\t\tthis.sendResponse(id, true) // Return true to indicate success\n\t\t} catch (error: unknown) {\n\t\t\tthis.sendError(id, error instanceof Error ? error : new Error(String(error)))\n\t\t}\n\t}\n\n\t/**\n\t * Handles constructor calls from the remote endpoint\n\t * @param request The construct request message to handle\n\t * @private\n\t */\n\tprivate handleConstruct(request: Message): void {\n\t\tconst { id, method } = request\n\t\tlet incomingArgs = Array.isArray(request.args) ? request.args : []\n\n\t\tif (request.transferSlots && request.transferSlots.length > 0) {\n\t\t\tconst transferredValues = (request as any).__transferredValues || []\n\t\t\tincomingArgs = incomingArgs.map((arg: any) =>\n\t\t\t\treconstructValueFromTransfer(arg, request.transferSlots!, transferredValues)\n\t\t\t)\n\t\t}\n\n\t\t// Split the method path and traverse the API implementation\n\t\tconst methodPath = method.split(\".\")\n\t\tif (!this.apiImplementation) {\n\t\t\tthis.sendError(id, \"No API implementation available\")\n\t\t\treturn\n\t\t}\n\t\tlet target: any = this.apiImplementation\n\n\t\t// Traverse the object path\n\t\tfor (let i = 0; i < methodPath.length - 1; i++) {\n\t\t\ttarget = target[methodPath[i]]\n\t\t\tif (!target) {\n\t\t\t\tthis.sendError(id, `Constructor path ${method} not found at ${methodPath[i]}`)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tconst finalMethod = methodPath[methodPath.length - 1]\n\t\tconst ConstructorClass = target[finalMethod]\n\n\t\tif (typeof ConstructorClass !== \"function\") {\n\t\t\tthis.sendError(id, `${method} is not a constructor function`)\n\t\t\treturn\n\t\t}\n\n\t\tconst processedArgs = incomingArgs.map((arg: any) => {\n\t\t\tif (typeof arg === \"string\" && arg.startsWith(\"__callback__\")) {\n\t\t\t\tconst callbackId = arg.slice(12)\n\t\t\t\treturn (...callbackArgs: any[]) => {\n\t\t\t\t\tthis.invokeCallback(callbackId, callbackArgs)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn arg\n\t\t})\n\n\t\ttry {\n\t\t\tconst instance = new ConstructorClass(...processedArgs)\n\t\t\tthis.sendResponse(id, instance)\n\t\t} catch (error: unknown) {\n\t\t\tthis.sendError(id, error instanceof Error ? error : new Error(String(error)))\n\t\t}\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Streaming — producer side\n\t// ---------------------------------------------------------------------------\n\n\t/**\n\t * Iterates an AsyncIterable and sends each yielded value as a stream-chunk.\n\t * Sends stream-end when the iterator completes, or stream-error on failure.\n\t * The loop stops if the consumer sends stream-cancel.\n\t */\n\tprivate async streamResult(\n\t\trequestId: string,\n\t\titerable: AsyncIterable<unknown>,\n\t\tmethod: string,\n\t\tmethodValidator?: ReturnType<typeof lookupValidator>\n\t): Promise<void> {\n\t\tconst abortController = new AbortController()\n\t\tthis.activeStreams.set(requestId, { abortController })\n\n\t\ttry {\n\t\t\tfor await (const value of iterable) {\n\t\t\t\t// Check cancellation\n\t\t\t\tif (abortController.signal.aborted) break\n\n\t\t\t\tlet chunk = value\n\n\t\t\t\t// Per-chunk output validation\n\t\t\t\tif (methodValidator?.output) {\n\t\t\t\t\tconst outputResult = await runValidation(methodValidator.output, chunk)\n\t\t\t\t\tif (outputResult.success === false) {\n\t\t\t\t\t\tthis.sendStreamError(\n\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\tnew RPCValidationError(\"output\", method, outputResult.issues)\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tchunk = outputResult.value\n\t\t\t\t}\n\n\t\t\t\tthis.sendMessage({\n\t\t\t\t\tid: requestId,\n\t\t\t\t\tmethod: \"\",\n\t\t\t\t\targs: { value: chunk },\n\t\t\t\t\ttype: \"stream-chunk\"\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Stream completed normally\n\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\tthis.sendMessage({\n\t\t\t\t\tid: requestId,\n\t\t\t\t\tmethod: \"\",\n\t\t\t\t\targs: {},\n\t\t\t\t\ttype: \"stream-end\"\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\tthis.sendStreamError(requestId, error instanceof Error ? error : new Error(String(error)))\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.activeStreams.delete(requestId)\n\t\t}\n\t}\n\n\t/** Send a stream-error message to the consumer. */\n\tprivate sendStreamError(requestId: string, error: Error): void {\n\t\tthis.sendMessage({\n\t\t\tid: requestId,\n\t\t\tmethod: \"\",\n\t\t\targs: { error: serializeError(error) },\n\t\t\ttype: \"stream-error\"\n\t\t})\n\t}\n\n\t/** Handle a stream-cancel message from the consumer. */\n\tprivate handleStreamCancel(message: Message): void {\n\t\tconst state = this.activeStreams.get(message.id)\n\t\tif (state) {\n\t\t\tstate.abortController.abort()\n\t\t\tthis.activeStreams.delete(message.id)\n\t\t}\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Streaming — consumer side\n\t// ---------------------------------------------------------------------------\n\n\t/**\n\t * Creates an AsyncIterable that yields values from incoming stream-chunk\n\t * messages. The consumer calls `break` or `return()` to send stream-cancel.\n\t */\n\tprivate createStreamIterable(requestId: string): AsyncIterable<unknown> {\n\t\tconst consumer: StreamConsumerState = {\n\t\t\tbuffer: [],\n\t\t\tdone: false,\n\t\t\twaiters: []\n\t\t}\n\t\tthis.streamConsumers.set(requestId, consumer)\n\n\t\tconst channel = this\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn {\n\t\t\t\t\tnext(): Promise<IteratorResult<unknown>> {\n\t\t\t\t\t\t// If there are buffered results, return immediately\n\t\t\t\t\t\tif (consumer.buffer.length > 0) {\n\t\t\t\t\t\t\treturn Promise.resolve(consumer.buffer.shift()!)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If stream is done and buffer is empty, return done\n\t\t\t\t\t\tif (consumer.done) {\n\t\t\t\t\t\t\tif (consumer.error) {\n\t\t\t\t\t\t\t\treturn Promise.reject(consumer.error)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn Promise.resolve({ done: true, value: undefined })\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Wait for next chunk\n\t\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\t\tconsumer.waiters.push({ resolve, reject })\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\treturn(): Promise<IteratorResult<unknown>> {\n\t\t\t\t\t\t// Consumer is breaking out of for-await — send cancel\n\t\t\t\t\t\tchannel.sendMessage({\n\t\t\t\t\t\t\tid: requestId,\n\t\t\t\t\t\t\tmethod: \"\",\n\t\t\t\t\t\t\targs: {},\n\t\t\t\t\t\t\ttype: \"stream-cancel\"\n\t\t\t\t\t\t})\n\t\t\t\t\t\tconsumer.done = true\n\t\t\t\t\t\tchannel.streamConsumers.delete(requestId)\n\t\t\t\t\t\treturn Promise.resolve({ done: true, value: undefined })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Handle a stream-chunk message from the producer. */\n\tprivate handleStreamChunk(message: Message): void {\n\t\tconst consumer = this.streamConsumers.get(message.id)\n\t\tif (!consumer) return\n\n\t\tconst result: IteratorResult<unknown> = {\n\t\t\tdone: false,\n\t\t\tvalue: (message.args as any).value\n\t\t}\n\n\t\tif (consumer.waiters.length > 0) {\n\t\t\tconsumer.waiters.shift()!.resolve(result)\n\t\t} else {\n\t\t\tconsumer.buffer.push(result)\n\t\t}\n\t}\n\n\t/** Handle a stream-end message from the producer. */\n\tprivate handleStreamEnd(message: Message): void {\n\t\tconst consumer = this.streamConsumers.get(message.id)\n\t\tif (!consumer) return\n\n\t\tconsumer.done = true\n\t\tthis.streamConsumers.delete(message.id)\n\n\t\tif (consumer.waiters.length > 0) {\n\t\t\t// Resolve all waiters with done\n\t\t\tfor (const waiter of consumer.waiters) {\n\t\t\t\twaiter.resolve({ done: true, value: undefined })\n\t\t\t}\n\t\t\tconsumer.waiters.length = 0\n\t\t} else {\n\t\t\tconsumer.buffer.push({ done: true, value: undefined })\n\t\t}\n\t}\n\n\t/** Handle a stream-error message from the producer. */\n\tprivate handleStreamError(message: Message): void {\n\t\tconst consumer = this.streamConsumers.get(message.id)\n\t\tif (!consumer) return\n\n\t\tconst rawError = (message.args as any).error\n\t\tconst error =\n\t\t\ttypeof rawError === \"object\" && rawError.name && rawError.message\n\t\t\t\t? deserializeError(rawError as EnhancedError)\n\t\t\t\t: new Error(typeof rawError === \"string\" ? rawError : \"Stream error\")\n\n\t\tconsumer.done = true\n\t\tconsumer.error = error\n\t\tthis.streamConsumers.delete(message.id)\n\n\t\tif (consumer.waiters.length > 0) {\n\t\t\tfor (const waiter of consumer.waiters) {\n\t\t\t\twaiter.reject(error)\n\t\t\t}\n\t\t\tconsumer.waiters.length = 0\n\t\t}\n\t}\n\n\t/**\n\t * Sends a successful response back to the remote endpoint\n\t * @param id The ID of the request being responded to\n\t * @param result The result to send back\n\t * @private\n\t */\n\tprivate sendResponse<T>(id: string, result: T): void {\n\t\tlet responseResult = result\n\t\tconst transferables: Transferable[] = []\n\t\tconst transferSlots: TransferSlot[] = []\n\t\tconst transferredValues: unknown[] = []\n\n\t\tif (this.supportsTransfer) {\n\t\t\tresponseResult = processValueForTransfer(\n\t\t\t\tresult,\n\t\t\t\ttransferables,\n\t\t\t\ttransferSlots,\n\t\t\t\ttransferredValues\n\t\t\t)\n\t\t}\n\n\t\tconst response: Message<Response<T>> = {\n\t\t\tid,\n\t\t\tmethod: \"\",\n\t\t\targs: { result: responseResult },\n\t\t\ttype: \"response\",\n\t\t\ttransferSlots: transferSlots.length > 0 ? transferSlots : undefined\n\t\t}\n\n\t\tthis.sendMessage(response, transferables, transferredValues)\n\t}\n\n\t/**\n\t * Sends an error response back to the remote endpoint\n\t * @param id The ID of the request being responded to\n\t * @param error The error message or Error object to send back\n\t * @private\n\t */\n\tprivate sendError(id: string, error: string | Error): void {\n\t\tconst errorResponse = error instanceof Error ? serializeError(error) : error\n\n\t\tconst response: Message<Response<null>> = {\n\t\t\tid,\n\t\t\tmethod: \"\",\n\t\t\targs: { error: errorResponse },\n\t\t\ttype: \"response\"\n\t\t}\n\t\tthis.sendMessage(response)\n\t}\n\n\tprivate sendMessage(\n\t\tmessage: Message,\n\t\ttransferables: Transferable[] = [],\n\t\ttransferredValues: unknown[] = []\n\t): void {\n\t\tconst encoded = encodeMessage(\n\t\t\tmessage,\n\t\t\tthis.serializationOptions,\n\t\t\tthis.supportsTransfer && transferables.length > 0,\n\t\t\ttransferredValues\n\t\t)\n\n\t\tif (encoded.mode === \"string\") {\n\t\t\tthis.io.write(encoded.data)\n\t\t} else {\n\t\t\tthis.io.write({\n\t\t\t\tdata: encoded.data,\n\t\t\t\ttransfers: transferables\n\t\t\t})\n\t\t}\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Timeout helpers\n\t// ---------------------------------------------------------------------------\n\n\t/** Start a timeout timer for a pending request. No-op if timeout is 0 or Infinity. */\n\tprivate startTimeout(messageId: string, method: string): void {\n\t\tif (!this.timeout || this.timeout === Infinity) return\n\t\tthis.pendingTimers[messageId] = setTimeout(() => {\n\t\t\tconst pending = this.pendingRequests[messageId]\n\t\t\tif (pending) {\n\t\t\t\tpending.reject(new RPCTimeoutError(method, this.timeout))\n\t\t\t\tdelete this.pendingRequests[messageId]\n\t\t\t\tdelete this.pendingTimers[messageId]\n\t\t\t}\n\t\t}, this.timeout)\n\t}\n\n\t/** Clear the timeout timer for a request that received a response. */\n\tprivate clearTimeout(messageId: string): void {\n\t\tif (this.pendingTimers[messageId]) {\n\t\t\tclearTimeout(this.pendingTimers[messageId])\n\t\t\tdelete this.pendingTimers[messageId]\n\t\t}\n\t}\n\n\t/**\n\t * Creates a nested proxy object for chaining remote method calls, property access, and constructor calls\n\t * @param chain Array of method names in the chain\n\t * @returns Proxy object that transforms property access into remote method calls\n\t * @private\n\t */\n\tprivate createNestedProxy(chain: string[] = []): any {\n\t\treturn new Proxy(() => {}, {\n\t\t\tget: (_target, prop: string | symbol) => {\n\t\t\t\t// Handle special properties\n\t\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t\t// Handle property access like obj.prop\n\t\t\t\t\tif (prop !== \"then\") {\n\t\t\t\t\t\treturn this.createNestedProxy([...chain, prop])\n\t\t\t\t\t}\n\t\t\t\t\t// Handle thenable for await support\n\t\t\t\t\tif (prop === \"then\" && chain.length > 0) {\n\t\t\t\t\t\t// Return property value when accessed like: await obj.prop\n\t\t\t\t\t\tconst promise = this.getProperty(chain)\n\t\t\t\t\t\treturn promise.then.bind(promise)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t},\n\t\t\tset: (_target, prop: string | symbol, value: any) => {\n\t\t\t\t// Handle property setting like obj.prop = value\n\t\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t\tconst propertyPath = [...chain, prop]\n\t\t\t\t\tthis.setProperty(propertyPath, value)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t},\n\t\t\tapply: (_target, _thisArg, args: any[]) => {\n\t\t\t\t// Handle method calls like obj.method()\n\t\t\t\tconst method = chain.join(\".\")\n\t\t\t\treturn this.callMethod(method as keyof RemoteAPI, args)\n\t\t\t},\n\t\t\tconstruct: (_target, args: any[]) => {\n\t\t\t\t// Handle constructor calls like new obj.Constructor()\n\t\t\t\treturn this.callConstructor(chain.join(\".\") as keyof RemoteAPI, args)\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * Returns a proxy object that represents the remote API\n\t * Methods called on this proxy will be executed on the remote endpoint\n\t * @returns Proxy object representing the remote API\n\t */\n\tpublic getAPI(): RemoteAPI {\n\t\treturn this.createNestedProxy() as RemoteAPI\n\t}\n\n\t/**\n\t * Destroys the RPC channel and underlying IO interface if it's destroyable\n\t */\n\tdestroy(): void {\n\t\t// Reject all pending requests so callers don't hang forever\n\t\tfor (const [id, pending] of Object.entries(this.pendingRequests)) {\n\t\t\tpending.reject(new Error(\"RPC channel destroyed\"))\n\t\t\tthis.clearTimeout(id)\n\t\t}\n\t\tthis.pendingRequests = {}\n\t\tthis.pendingTimers = {}\n\n\t\t// Cancel all active producer-side streams\n\t\tfor (const [, state] of this.activeStreams) {\n\t\t\tstate.abortController.abort()\n\t\t}\n\t\tthis.activeStreams.clear()\n\n\t\t// Reject all consumer-side stream waiters\n\t\tfor (const [, consumer] of this.streamConsumers) {\n\t\t\tconsumer.done = true\n\t\t\tconst error = new Error(\"RPC channel destroyed\")\n\t\t\tfor (const waiter of consumer.waiters) {\n\t\t\t\twaiter.reject(error)\n\t\t\t}\n\t\t\tconsumer.waiters.length = 0\n\t\t}\n\t\tthis.streamConsumers.clear()\n\n\t\t// Free callbacks\n\t\tthis.freeCallbacks()\n\n\t\t// Clean up IO adapters\n\t\tif (this.io && this.io.destroy) {\n\t\t\tthis.io.destroy()\n\t\t}\n\t}\n\n\t/**\n\t * Frees up memory by clearing stored callbacks and callback cache\n\t * Useful when dealing with many anonymous callback functions to prevent memory leaks\n\t */\n\tfreeCallbacks() {\n\t\tthis.callbacks = {}\n\t\tthis.callbackCache.clear()\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const e=require(`./serialization-DdbbW0af.cjs`);function t(e,t,n){let r=0,i=()=>{if(r>=e.length)return n();let a=e[r++];return a(t,i)};return i()}function n(){return[,,,,].fill(0).map(()=>Math.floor(Math.random()*(2**53-1)).toString(16)).join(`-`)}var r=class extends Error{phase;method;issues;constructor(e,t,n){let r=n.map(e=>e.message).join(`; `);super(`RPC ${e} validation failed for "${t}": ${r}`),this.name=`RPCValidationError`,this.phase=e,this.method=t,this.issues=n}};function i(e){return e instanceof Error&&e.name===`RPCValidationError`}function a(e,t){if(!e)return;let n=t.split(`.`),r=e;for(let e of n){if(!r||typeof r!=`object`)return;r=r[e]}if(r&&typeof r==`object`&&(`input`in r||`output`in r))return r}async function o(e,t){if(!e)return{success:!0,value:t};try{let n=await e[`~standard`].validate(t);return n.issues?{success:!1,issues:n.issues}:{success:!0,value:n.value}}catch(e){return{success:!1,issues:[{message:`Validator threw: ${e}`}]}}}const s=`~validators`;function c(e,t){return Object.defineProperty(t,s,{value:{input:e.input,output:e.output},enumerable:!1,writable:!1}),t}function l(e){return e}function u(e){let t={};for(let n of Object.keys(e)){let r=e[n];if(typeof r==`function`&&s in r)t[n]=r[s];else if(typeof r==`object`&&r&&!(`~standard`in r)){let e=u(r);Object.keys(e).length>0&&(t[n]=e)}}return t}var d=class extends Error{method;timeoutMs;constructor(e,t){super(`RPC call to "${e}" timed out after ${t}ms`),this.name=`RPCTimeoutError`,this.method=e,this.timeoutMs=t}};function f(e){return e instanceof Error&&e.name===`RPCTimeoutError`}function p(e){return typeof e==`object`&&!!e&&Symbol.asyncIterator in e}var m=class{pendingRequests={};pendingTimers={};callbacks={};callbackCache=new Map;activeStreams=new Map;streamConsumers=new Map;count=0;messageStr=``;apiImplementation;validators;interceptors;serializationOptions;supportsTransfer=!1;structuredClone=!1;timeout;constructor(e,t){this.io=e,this.apiImplementation=t?.expose,this.validators=t?.validators,this.interceptors=t?.interceptors??[],this.timeout=t?.timeout??0,this.serializationOptions=t?.serialization||{},this.structuredClone=e.capabilities?.structuredClone===!0,this.structuredClone&&e.capabilities?.transfer===!0&&t?.enableTransfer!==!1&&(this.supportsTransfer=!0),this.listen()}expose(e,t){this.apiImplementation=e,t&&(this.validators=t)}getIO(){return this.io}async listen(){for(;!(`isDestroyed`in this.io&&this.io.isDestroyed);)try{let e=await this.io.read();if(e==null)continue;await this.handleIncomingMessage(e)}catch(e){if(e instanceof Error&&e.message.includes(`destroyed`))break;console.error(`kkrpc: failed to handle incoming message`,e)}}async handleIncomingMessage(t){if(typeof t==`string`){if(t.trim().length===0)return;this.bufferString(t);return}let n=t.data;if(typeof n==`string`){await this.handleIncomingMessage(n);return}if(!n||typeof n!=`object`)return;!n.__transferredValues&&t.transfers&&t.transfers.length>0&&(n.__transferredValues=t.transfers);let r=await e.n(n);await this.processDecodedMessage(r)}bufferString(e){this.messageStr+=e;let t=this.messageStr[this.messageStr.length-1],n=this.messageStr.split(`
2
+ `),r=t===`
3
+ `?n:n.slice(0,-1);this.messageStr=t===`
4
+ `?``:n.at(-1)??``;for(let e of r.map(e=>e.trim()).filter(Boolean))e.startsWith(`{`)?this.handleMessageStr(e):console.log(`(kkrpc stdout passthrough):`,e)}async handleMessageStr(t){this.count++;try{let n=await e.n(t);await this.processDecodedMessage(n)}catch(e){console.error(`failed to parse message`,typeof t,t,e)}}async processDecodedMessage(e){e.type===`response`?this.handleResponse(e):e.type===`request`?this.handleRequest(e):e.type===`callback`?this.handleCallback(e):e.type===`get`?this.handleGet(e):e.type===`set`?this.handleSet(e):e.type===`construct`?this.handleConstruct(e):e.type===`stream-chunk`?this.handleStreamChunk(e):e.type===`stream-end`?this.handleStreamEnd(e):e.type===`stream-error`?this.handleStreamError(e):e.type===`stream-cancel`?this.handleStreamCancel(e):console.error(`received unknown message type`,e,typeof e)}callMethod(t,r){return new Promise((i,a)=>{let o=n();this.pendingRequests[o]={resolve:i,reject:a},this.startTimeout(o,t);let s=[],c=r.map(e=>{if(typeof e==`function`){let t=this.callbackCache.get(e);return t||(t=n(),this.callbacks[t]=e,this.callbackCache.set(e,t)),s.push(t),`__callback__${t}`}return e}),l=c,u=[],d=[],f=[];this.supportsTransfer&&(l=c.map(t=>e.o(t,u,d,f)));let p={id:o,method:t,args:l,type:`request`,callbackIds:s.length>0?s:void 0,transferSlots:d.length>0?d:void 0};this.sendMessage(p,u,f)})}getProperty(e){return new Promise((t,r)=>{let i=n();this.pendingRequests[i]={resolve:t,reject:r};let a=Array.isArray(e)?e:e.split(`.`);this.startTimeout(i,`get:${a.join(`.`)}`);let o={id:i,method:``,args:{},type:`get`,path:a};this.sendMessage(o)})}setProperty(t,r){return new Promise((i,a)=>{let o=n();this.pendingRequests[o]={resolve:i,reject:a};let s=Array.isArray(t)?t:t.split(`.`);this.startTimeout(o,`set:${s.join(`.`)}`);let c=r,l=[],u=[],d=[];this.supportsTransfer&&(c=e.o(r,l,u,d));let f={id:o,method:``,args:{},type:`set`,path:s,value:c,transferSlots:u.length>0?u:void 0};this.sendMessage(f,l,d)})}callConstructor(t,r){return new Promise((i,a)=>{let o=n();this.pendingRequests[o]={resolve:i,reject:a},this.startTimeout(o,t);let s=[],c=r.map(e=>{if(typeof e==`function`){let t=this.callbackCache.get(e);return t||(t=n(),this.callbacks[t]=e,this.callbackCache.set(e,t)),s.push(t),`__callback__${t}`}return e}),l=c,u=[],d=[],f=[];this.supportsTransfer&&(l=c.map(t=>e.o(t,u,d,f)));let p={id:o,method:t,args:l,type:`construct`,callbackIds:s.length>0?s:void 0,transferSlots:d.length>0?d:void 0};this.sendMessage(p,u,f)})}handleResponse(t){let{id:n}=t,{result:r,error:i}=t.args;if(this.pendingRequests[n])if(this.clearTimeout(n),i)typeof i==`object`&&i.name&&i.message?this.pendingRequests[n].reject(e.r(i)):this.pendingRequests[n].reject(Error(i)),delete this.pendingRequests[n];else if(r&&typeof r==`object`&&r.__stream===!0){let e=this.createStreamIterable(n);this.pendingRequests[n].resolve(e),delete this.pendingRequests[n]}else{let i=r;if(t.transferSlots&&t.transferSlots.length>0){let n=t.__transferredValues||[];i=e.s(r,t.transferSlots,n)}this.pendingRequests[n].resolve(i),delete this.pendingRequests[n]}}async handleRequest(n){let{id:i,method:s}=n,c=Array.isArray(n.args)?n.args:[];if(n.transferSlots&&n.transferSlots.length>0){let t=n.__transferredValues||[];c=c.map(r=>e.s(r,n.transferSlots,t))}let l=s.split(`.`);if(!this.apiImplementation)return;let u=this.apiImplementation;for(let e=0;e<l.length-1;e++)if(u=u[l[e]],!u){this.sendError(i,`Method path ${s} not found at ${l[e]}`);return}let d=l[l.length-1],f=u[d];if(typeof f!=`function`){this.sendError(i,`Method ${s} is not a function`);return}let m=c.map(e=>{if(typeof e==`string`&&e.startsWith(`__callback__`)){let t=e.slice(12);return(...e)=>{this.invokeCallback(t,e)}}return e}),h=a(this.validators,s);if(h?.input){let e=m.filter(e=>typeof e!=`function`),t=await o(h.input,e);if(t.success===!1){this.sendError(i,new r(`input`,s,t.issues));return}}try{let e=()=>f.apply(u,m),n=this.interceptors.length>0?await t(this.interceptors,{method:s,args:m,state:{}},e):await e();if(p(n)){this.sendResponse(i,{__stream:!0}),this.streamResult(i,n,s,h);return}if(h?.output){let e=await o(h.output,n);if(e.success===!1){this.sendError(i,new r(`output`,s,e.issues));return}this.sendResponse(i,e.value);return}this.sendResponse(i,n)}catch(e){this.sendError(i,e instanceof Error?e:Error(String(e)))}}invokeCallback(t,r){let i=r,a=[],o=[],s=[];this.supportsTransfer&&(i=r.map(t=>e.o(t,a,o,s)));let c={id:n(),method:t,args:i,type:`callback`,transferSlots:o.length>0?o:void 0};this.sendMessage(c,a,s)}handleCallback(t){let{method:n}=t,r=this.callbacks[n];if(r){let n=Array.isArray(t.args)?t.args:[];if(t.transferSlots&&t.transferSlots.length>0){let r=t.__transferredValues||[];n=n.map(n=>e.s(n,t.transferSlots,r))}r(...n)}else console.error(`Callback with id ${n} not found`)}handleGet(e){let{id:t,path:n}=e;if(!n||!this.apiImplementation){this.sendError(t,`Invalid get request: missing path or API implementation`);return}try{let e=this.apiImplementation;for(let r of n)if(e=e[r],e===void 0){this.sendError(t,`Property path ${n.join(`.`)} not found at ${r}`);return}this.sendResponse(t,e)}catch(e){this.sendError(t,e instanceof Error?e:Error(String(e)))}}handleSet(t){let{id:n,path:r}=t;if(!r||!this.apiImplementation){this.sendError(n,`Invalid set request: missing path or API implementation`);return}let i=t.value;if(t.transferSlots&&t.transferSlots.length>0){let n=t.__transferredValues||[];i=e.s(t.value,t.transferSlots,n)}try{let e=this.apiImplementation;for(let t=0;t<r.length-1;t++)if(e=e[r[t]],!e){this.sendError(n,`Property path ${r.join(`.`)} not found at ${r[t]}`);return}let t=r[r.length-1];e[t]=i,this.sendResponse(n,!0)}catch(e){this.sendError(n,e instanceof Error?e:Error(String(e)))}}handleConstruct(t){let{id:n,method:r}=t,i=Array.isArray(t.args)?t.args:[];if(t.transferSlots&&t.transferSlots.length>0){let n=t.__transferredValues||[];i=i.map(r=>e.s(r,t.transferSlots,n))}let a=r.split(`.`);if(!this.apiImplementation){this.sendError(n,`No API implementation available`);return}let o=this.apiImplementation;for(let e=0;e<a.length-1;e++)if(o=o[a[e]],!o){this.sendError(n,`Constructor path ${r} not found at ${a[e]}`);return}let s=a[a.length-1],c=o[s];if(typeof c!=`function`){this.sendError(n,`${r} is not a constructor function`);return}let l=i.map(e=>{if(typeof e==`string`&&e.startsWith(`__callback__`)){let t=e.slice(12);return(...e)=>{this.invokeCallback(t,e)}}return e});try{let e=new c(...l);this.sendResponse(n,e)}catch(e){this.sendError(n,e instanceof Error?e:Error(String(e)))}}async streamResult(e,t,n,i){let a=new AbortController;this.activeStreams.set(e,{abortController:a});try{for await(let s of t){if(a.signal.aborted)break;let t=s;if(i?.output){let a=await o(i.output,t);if(a.success===!1){this.sendStreamError(e,new r(`output`,n,a.issues));return}t=a.value}this.sendMessage({id:e,method:``,args:{value:t},type:`stream-chunk`})}a.signal.aborted||this.sendMessage({id:e,method:``,args:{},type:`stream-end`})}catch(t){a.signal.aborted||this.sendStreamError(e,t instanceof Error?t:Error(String(t)))}finally{this.activeStreams.delete(e)}}sendStreamError(t,n){this.sendMessage({id:t,method:``,args:{error:e.c(n)},type:`stream-error`})}handleStreamCancel(e){let t=this.activeStreams.get(e.id);t&&(t.abortController.abort(),this.activeStreams.delete(e.id))}createStreamIterable(e){let t={buffer:[],done:!1,waiters:[]};this.streamConsumers.set(e,t);let n=this;return{[Symbol.asyncIterator](){return{next(){return t.buffer.length>0?Promise.resolve(t.buffer.shift()):t.done?t.error?Promise.reject(t.error):Promise.resolve({done:!0,value:void 0}):new Promise((e,n)=>{t.waiters.push({resolve:e,reject:n})})},return(){return n.sendMessage({id:e,method:``,args:{},type:`stream-cancel`}),t.done=!0,n.streamConsumers.delete(e),Promise.resolve({done:!0,value:void 0})}}}}}handleStreamChunk(e){let t=this.streamConsumers.get(e.id);if(!t)return;let n={done:!1,value:e.args.value};t.waiters.length>0?t.waiters.shift().resolve(n):t.buffer.push(n)}handleStreamEnd(e){let t=this.streamConsumers.get(e.id);if(t)if(t.done=!0,this.streamConsumers.delete(e.id),t.waiters.length>0){for(let e of t.waiters)e.resolve({done:!0,value:void 0});t.waiters.length=0}else t.buffer.push({done:!0,value:void 0})}handleStreamError(t){let n=this.streamConsumers.get(t.id);if(!n)return;let r=t.args.error,i=typeof r==`object`&&r.name&&r.message?e.r(r):Error(typeof r==`string`?r:`Stream error`);if(n.done=!0,n.error=i,this.streamConsumers.delete(t.id),n.waiters.length>0){for(let e of n.waiters)e.reject(i);n.waiters.length=0}}sendResponse(t,n){let r=n,i=[],a=[],o=[];this.supportsTransfer&&(r=e.o(n,i,a,o));let s={id:t,method:``,args:{result:r},type:`response`,transferSlots:a.length>0?a:void 0};this.sendMessage(s,i,o)}sendError(t,n){let r={id:t,method:``,args:{error:n instanceof Error?e.c(n):n},type:`response`};this.sendMessage(r)}sendMessage(t,n=[],r=[]){let i=e.a(t,this.serializationOptions,this.supportsTransfer&&n.length>0,r);i.mode===`string`?this.io.write(i.data):this.io.write({data:i.data,transfers:n})}startTimeout(e,t){!this.timeout||this.timeout===1/0||(this.pendingTimers[e]=setTimeout(()=>{let n=this.pendingRequests[e];n&&(n.reject(new d(t,this.timeout)),delete this.pendingRequests[e],delete this.pendingTimers[e])},this.timeout))}clearTimeout(e){this.pendingTimers[e]&&(clearTimeout(this.pendingTimers[e]),delete this.pendingTimers[e])}createNestedProxy(e=[]){return new Proxy(()=>{},{get:(t,n)=>{if(typeof n==`string`){if(n!==`then`)return this.createNestedProxy([...e,n]);if(n===`then`&&e.length>0){let t=this.getProperty(e);return t.then.bind(t)}}},set:(t,n,r)=>{if(typeof n==`string`){let t=[...e,n];return this.setProperty(t,r),!0}return!1},apply:(t,n,r)=>{let i=e.join(`.`);return this.callMethod(i,r)},construct:(t,n)=>this.callConstructor(e.join(`.`),n)})}getAPI(){return this.createNestedProxy()}destroy(){for(let[e,t]of Object.entries(this.pendingRequests))t.reject(Error(`RPC channel destroyed`)),this.clearTimeout(e);this.pendingRequests={},this.pendingTimers={};for(let[,e]of this.activeStreams)e.abortController.abort();this.activeStreams.clear();for(let[,e]of this.streamConsumers){e.done=!0;let t=Error(`RPC channel destroyed`);for(let n of e.waiters)n.reject(t);e.waiters.length=0}this.streamConsumers.clear(),this.freeCallbacks(),this.io&&this.io.destroy&&this.io.destroy()}freeCallbacks(){this.callbacks={},this.callbackCache.clear()}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return o}});
@@ -1,4 +1,4 @@
1
- import { c as SerializationOptions, n as IoInterface } from "./interface-Cdp6K7Dz.js";
1
+ import { c as SerializationOptions, n as IoInterface } from "./interface-ezOcBCNE.js";
2
2
 
3
3
  //#region src/middleware.d.ts
4
4
 
@@ -516,4 +516,4 @@ declare class RPCChannel<LocalAPI extends Record<string, any>, RemoteAPI extends
516
516
  }
517
517
  //#endregion
518
518
  export { RPCCallContext as _, InferAPI as a, RPCValidationError as c, defineMethod as d, extractValidators as f, StandardSchemaV1 as g, runValidation as h, DefinedMethod as i, RPCValidators as l, lookupValidator as m, RPCTimeoutError as n, MethodSchemaConfig as o, isRPCValidationError as p, isRPCTimeoutError as r, MethodValidators as s, RPCChannel as t, defineAPI as u, RPCInterceptor as v, runInterceptors as y };
519
- //# sourceMappingURL=channel-CLazgI0u.d.ts.map
519
+ //# sourceMappingURL=channel-DwZvQkc4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-DwZvQkc4.d.ts","names":[],"sources":["../src/middleware.ts","../src/standard-schema.ts","../src/validation.ts","../src/channel.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +1 @@
1
- const e=require(`./channel-B-xw0r_-.cjs`),t=`__DESTROY__`;var n=class{name=`chrome-port-io`;messageListeners=new Set;messageQueue=[];resolveRead=null;capabilities={structuredClone:!0,transfer:!1};on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.port=e,this.port.onMessage.addListener(this.handleMessage),this.port.onDisconnect.addListener(this.handleDisconnect)}handleMessage=e=>{if(e===t){this.destroy();return}let n=e;this.messageListeners.size>0?this.messageListeners.forEach(e=>e(n)):this.resolveRead?(this.resolveRead(n),this.resolveRead=null):this.messageQueue.push(n)};handleDisconnect=()=>{this.resolveRead&&=(this.resolveRead(null),null),this.cleanup()};read(){return this.messageQueue.length>0?Promise.resolve(this.messageQueue.shift()??null):new Promise(e=>{this.resolveRead=e})}write(e){try{let t=typeof e==`string`?e:e.data;this.port.postMessage(t)}catch(e){console.error(`[ChromePortIO] Failed to write to port. It might be disconnected.`,e),this.destroy()}return Promise.resolve()}cleanup=()=>{this.port.onMessage.removeListener(this.handleMessage),this.port.onDisconnect.removeListener(this.handleDisconnect)};destroy(){this.signalDestroy(),this.port.disconnect(),this.cleanup()}signalDestroy(){try{this.port.postMessage(t)}catch{}}};exports.ChromePortIO=n,exports.RPCChannel=e.t,exports.RPCTimeoutError=e.n,exports.TRANSFER_SLOT_PREFIX=e.p,exports.decodeMessage=e.m,exports.deserializeError=e.h,exports.deserializeMessage=e.g,exports.encodeMessage=e._,exports.generateUUID=e.f,exports.isRPCTimeoutError=e.r,exports.processValueForTransfer=e.v,exports.reconstructValueFromTransfer=e.y,exports.serializeError=e.b,exports.serializeMessage=e.x;
1
+ const e=require(`./channel-DpFB1k-f.cjs`),t=require(`./serialization-DdbbW0af.cjs`),n=`__DESTROY__`;var r=class{name=`chrome-port-io`;messageListeners=new Set;messageQueue=[];resolveRead=null;capabilities={structuredClone:!0,transfer:!1};on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.port=e,this.port.onMessage.addListener(this.handleMessage),this.port.onDisconnect.addListener(this.handleDisconnect)}handleMessage=e=>{if(e===n){this.destroy();return}let t=e;this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};handleDisconnect=()=>{this.resolveRead&&=(this.resolveRead(null),null),this.cleanup()};read(){return this.messageQueue.length>0?Promise.resolve(this.messageQueue.shift()??null):new Promise(e=>{this.resolveRead=e})}write(e){try{let t=typeof e==`string`?e:e.data;this.port.postMessage(t)}catch(e){console.error(`[ChromePortIO] Failed to write to port. It might be disconnected.`,e),this.destroy()}return Promise.resolve()}cleanup=()=>{this.port.onMessage.removeListener(this.handleMessage),this.port.onDisconnect.removeListener(this.handleDisconnect)};destroy(){this.signalDestroy(),this.port.disconnect(),this.cleanup()}signalDestroy(){try{this.port.postMessage(n)}catch{}}};exports.ChromePortIO=r,exports.RPCChannel=e.t,exports.RPCTimeoutError=e.n,exports.TRANSFER_SLOT_PREFIX=t.t,exports.decodeMessage=t.n,exports.deserializeError=t.r,exports.deserializeMessage=t.i,exports.encodeMessage=t.a,exports.generateUUID=e.d,exports.isRPCTimeoutError=e.r,exports.processValueForTransfer=t.o,exports.reconstructValueFromTransfer=t.s,exports.serializeError=t.c,exports.serializeMessage=t.l;
@@ -1,6 +1,6 @@
1
- import { _ as encodeMessage, a as EnhancedError, b as serializeError, c as SerializationOptions, d as WireEnvelope, f as WireFormat, g as deserializeMessage, h as deserializeError, i as EncodedMessage, l as TRANSFER_SLOT_PREFIX, m as decodeMessage, n as IoInterface, o as Message, p as WireV1, r as IoMessage, s as Response, t as IoCapabilities, u as TransferSlot, v as processValueForTransfer, x as serializeMessage, y as reconstructValueFromTransfer } from "./interface-Cdp6K7Dz.js";
2
- import { n as RPCTimeoutError, r as isRPCTimeoutError, t as RPCChannel } from "./channel-CLazgI0u.js";
3
- import { t as generateUUID } from "./utils-BEgiHk89.js";
1
+ import { _ as encodeMessage, a as EnhancedError, b as serializeError, c as SerializationOptions, d as WireEnvelope, f as WireFormat, g as deserializeMessage, h as deserializeError, i as EncodedMessage, l as TRANSFER_SLOT_PREFIX, m as decodeMessage, n as IoInterface, o as Message, p as WireV1, r as IoMessage, s as Response, t as IoCapabilities, u as TransferSlot, v as processValueForTransfer, x as serializeMessage, y as reconstructValueFromTransfer } from "./interface-ezOcBCNE.js";
2
+ import { n as RPCTimeoutError, r as isRPCTimeoutError, t as RPCChannel } from "./channel-DwZvQkc4.js";
3
+ import { t as generateUUID } from "./utils-BE41nAwR.js";
4
4
 
5
5
  //#region src/adapters/chrome-extension.d.ts
6
6
 
@@ -1,2 +1,2 @@
1
- import{_ as e,b as t,f as n,g as r,h as i,m as a,n as o,p as s,r as c,t as l,v as u,x as d,y as f}from"./channel-Dl81iz1-.js";const p=`__DESTROY__`;var m=class{name=`chrome-port-io`;messageListeners=new Set;messageQueue=[];resolveRead=null;capabilities={structuredClone:!0,transfer:!1};on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.port=e,this.port.onMessage.addListener(this.handleMessage),this.port.onDisconnect.addListener(this.handleDisconnect)}handleMessage=e=>{if(e===p){this.destroy();return}let t=e;this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};handleDisconnect=()=>{this.resolveRead&&=(this.resolveRead(null),null),this.cleanup()};read(){return this.messageQueue.length>0?Promise.resolve(this.messageQueue.shift()??null):new Promise(e=>{this.resolveRead=e})}write(e){try{let t=typeof e==`string`?e:e.data;this.port.postMessage(t)}catch(e){console.error(`[ChromePortIO] Failed to write to port. It might be disconnected.`,e),this.destroy()}return Promise.resolve()}cleanup=()=>{this.port.onMessage.removeListener(this.handleMessage),this.port.onDisconnect.removeListener(this.handleDisconnect)};destroy(){this.signalDestroy(),this.port.disconnect(),this.cleanup()}signalDestroy(){try{this.port.postMessage(p)}catch{}}};export{m as ChromePortIO,l as RPCChannel,o as RPCTimeoutError,s as TRANSFER_SLOT_PREFIX,a as decodeMessage,i as deserializeError,r as deserializeMessage,e as encodeMessage,n as generateUUID,c as isRPCTimeoutError,u as processValueForTransfer,f as reconstructValueFromTransfer,t as serializeError,d as serializeMessage};
1
+ import{d as e,n as t,r as n,t as r}from"./channel-CeSgoHz4.js";import{a as i,c as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f}from"./serialization-uE-XobTA.js";const p=`__DESTROY__`;var m=class{name=`chrome-port-io`;messageListeners=new Set;messageQueue=[];resolveRead=null;capabilities={structuredClone:!0,transfer:!1};on(e,t){e===`message`&&this.messageListeners.add(t)}off(e,t){e===`message`&&this.messageListeners.delete(t)}constructor(e){this.port=e,this.port.onMessage.addListener(this.handleMessage),this.port.onDisconnect.addListener(this.handleDisconnect)}handleMessage=e=>{if(e===p){this.destroy();return}let t=e;this.messageListeners.size>0?this.messageListeners.forEach(e=>e(t)):this.resolveRead?(this.resolveRead(t),this.resolveRead=null):this.messageQueue.push(t)};handleDisconnect=()=>{this.resolveRead&&=(this.resolveRead(null),null),this.cleanup()};read(){return this.messageQueue.length>0?Promise.resolve(this.messageQueue.shift()??null):new Promise(e=>{this.resolveRead=e})}write(e){try{let t=typeof e==`string`?e:e.data;this.port.postMessage(t)}catch(e){console.error(`[ChromePortIO] Failed to write to port. It might be disconnected.`,e),this.destroy()}return Promise.resolve()}cleanup=()=>{this.port.onMessage.removeListener(this.handleMessage),this.port.onDisconnect.removeListener(this.handleDisconnect)};destroy(){this.signalDestroy(),this.port.disconnect(),this.cleanup()}signalDestroy(){try{this.port.postMessage(p)}catch{}}};export{m as ChromePortIO,r as RPCChannel,t as RPCTimeoutError,f as TRANSFER_SLOT_PREFIX,c as decodeMessage,u as deserializeError,o as deserializeMessage,i as encodeMessage,e as generateUUID,n as isRPCTimeoutError,l as processValueForTransfer,d as reconstructValueFromTransfer,a as serializeError,s as serializeMessage};
2
2
  //# sourceMappingURL=chrome-extension.js.map