request-iframe 0.1.0 → 0.2.0

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 (223) hide show
  1. package/QUICKSTART.CN.md +4 -2
  2. package/QUICKSTART.md +4 -2
  3. package/README.CN.md +302 -54
  4. package/README.md +281 -36
  5. package/cdn/request-iframe-react.umd.js +3354 -0
  6. package/cdn/request-iframe-react.umd.js.map +1 -0
  7. package/cdn/request-iframe-react.umd.min.js +2 -0
  8. package/cdn/request-iframe-react.umd.min.js.map +1 -0
  9. package/cdn/request-iframe.umd.js +19735 -0
  10. package/cdn/request-iframe.umd.js.map +1 -0
  11. package/cdn/request-iframe.umd.min.js +4 -0
  12. package/cdn/request-iframe.umd.min.js.map +1 -0
  13. package/esm/api/client.js +31 -22
  14. package/esm/api/endpoint.js +229 -0
  15. package/esm/api/server.js +19 -9
  16. package/esm/constants/debug.js +17 -0
  17. package/esm/constants/index.js +115 -66
  18. package/esm/constants/log.js +11 -0
  19. package/esm/constants/messages.js +6 -1
  20. package/esm/constants/warn-once.js +15 -0
  21. package/esm/endpoint/facade.js +390 -0
  22. package/esm/endpoint/heartbeat/heartbeat.js +60 -0
  23. package/esm/endpoint/heartbeat/ping.js +20 -0
  24. package/esm/endpoint/index.js +13 -0
  25. package/esm/endpoint/infra/hub.js +316 -0
  26. package/esm/endpoint/infra/inbox.js +232 -0
  27. package/esm/endpoint/infra/outbox.js +408 -0
  28. package/esm/endpoint/stream/dispatcher.js +58 -0
  29. package/esm/endpoint/stream/errors.js +27 -0
  30. package/esm/endpoint/stream/factory.js +76 -0
  31. package/esm/endpoint/stream/file-auto-resolve.js +34 -0
  32. package/esm/endpoint/stream/file-writable.js +105 -0
  33. package/esm/endpoint/stream/handler.js +26 -0
  34. package/esm/{core → impl}/client.js +243 -320
  35. package/esm/{core → impl}/response.js +120 -154
  36. package/esm/impl/server.js +568 -0
  37. package/esm/index.js +13 -6
  38. package/esm/message/ack.js +27 -0
  39. package/esm/message/channel-cache.js +108 -0
  40. package/esm/message/channel.js +92 -5
  41. package/esm/message/dispatcher.js +149 -98
  42. package/esm/stream/error.js +22 -0
  43. package/esm/stream/index.js +3 -1
  44. package/esm/stream/readable-stream.js +101 -26
  45. package/esm/stream/stream-core.js +121 -3
  46. package/esm/stream/writable-stream.js +368 -43
  47. package/esm/utils/ack.js +36 -0
  48. package/esm/utils/blob.js +16 -0
  49. package/esm/utils/cache.js +25 -76
  50. package/esm/utils/content-type.js +81 -0
  51. package/esm/utils/debug.js +157 -180
  52. package/esm/utils/hooks.js +130 -0
  53. package/esm/utils/id.js +14 -0
  54. package/esm/utils/iframe.js +20 -0
  55. package/esm/utils/index.js +12 -162
  56. package/esm/utils/is.js +3 -0
  57. package/esm/utils/logger.js +55 -0
  58. package/esm/utils/origin.js +3 -1
  59. package/esm/utils/promise.js +3 -0
  60. package/esm/utils/window.js +31 -0
  61. package/library/api/client.d.ts.map +1 -1
  62. package/library/api/client.js +32 -23
  63. package/library/api/endpoint.d.ts +23 -0
  64. package/library/api/endpoint.d.ts.map +1 -0
  65. package/library/api/endpoint.js +235 -0
  66. package/library/api/server.d.ts +4 -1
  67. package/library/api/server.d.ts.map +1 -1
  68. package/library/api/server.js +19 -9
  69. package/library/constants/debug.d.ts +18 -0
  70. package/library/constants/debug.d.ts.map +1 -0
  71. package/library/constants/debug.js +23 -0
  72. package/library/constants/index.d.ts +58 -7
  73. package/library/constants/index.d.ts.map +1 -1
  74. package/library/constants/index.js +143 -67
  75. package/library/constants/log.d.ts +12 -0
  76. package/library/constants/log.d.ts.map +1 -0
  77. package/library/constants/log.js +17 -0
  78. package/library/constants/messages.d.ts +6 -1
  79. package/library/constants/messages.d.ts.map +1 -1
  80. package/library/constants/messages.js +6 -1
  81. package/library/constants/warn-once.d.ts +12 -0
  82. package/library/constants/warn-once.d.ts.map +1 -0
  83. package/library/constants/warn-once.js +22 -0
  84. package/library/endpoint/facade.d.ts +238 -0
  85. package/library/endpoint/facade.d.ts.map +1 -0
  86. package/library/endpoint/facade.js +398 -0
  87. package/library/endpoint/heartbeat/heartbeat.d.ts +34 -0
  88. package/library/endpoint/heartbeat/heartbeat.d.ts.map +1 -0
  89. package/library/endpoint/heartbeat/heartbeat.js +67 -0
  90. package/library/endpoint/heartbeat/ping.d.ts +18 -0
  91. package/library/endpoint/heartbeat/ping.d.ts.map +1 -0
  92. package/library/endpoint/heartbeat/ping.js +26 -0
  93. package/library/endpoint/index.d.ts +16 -0
  94. package/library/endpoint/index.d.ts.map +1 -0
  95. package/library/endpoint/index.js +114 -0
  96. package/library/endpoint/infra/hub.d.ts +170 -0
  97. package/library/endpoint/infra/hub.d.ts.map +1 -0
  98. package/library/endpoint/infra/hub.js +323 -0
  99. package/library/endpoint/infra/inbox.d.ts +73 -0
  100. package/library/endpoint/infra/inbox.d.ts.map +1 -0
  101. package/library/endpoint/infra/inbox.js +239 -0
  102. package/library/endpoint/infra/outbox.d.ts +149 -0
  103. package/library/endpoint/infra/outbox.d.ts.map +1 -0
  104. package/library/endpoint/infra/outbox.js +415 -0
  105. package/library/endpoint/stream/dispatcher.d.ts +33 -0
  106. package/library/endpoint/stream/dispatcher.d.ts.map +1 -0
  107. package/library/endpoint/stream/dispatcher.js +66 -0
  108. package/library/endpoint/stream/errors.d.ts +20 -0
  109. package/library/endpoint/stream/errors.d.ts.map +1 -0
  110. package/library/endpoint/stream/errors.js +32 -0
  111. package/library/endpoint/stream/factory.d.ts +44 -0
  112. package/library/endpoint/stream/factory.d.ts.map +1 -0
  113. package/library/endpoint/stream/factory.js +82 -0
  114. package/library/endpoint/stream/file-auto-resolve.d.ts +26 -0
  115. package/library/endpoint/stream/file-auto-resolve.d.ts.map +1 -0
  116. package/library/endpoint/stream/file-auto-resolve.js +41 -0
  117. package/library/endpoint/stream/file-writable.d.ts +33 -0
  118. package/library/endpoint/stream/file-writable.d.ts.map +1 -0
  119. package/library/endpoint/stream/file-writable.js +115 -0
  120. package/library/endpoint/stream/handler.d.ts +20 -0
  121. package/library/endpoint/stream/handler.d.ts.map +1 -0
  122. package/library/endpoint/stream/handler.js +32 -0
  123. package/library/{core → impl}/client.d.ts +16 -13
  124. package/library/impl/client.d.ts.map +1 -0
  125. package/library/{core → impl}/client.js +254 -333
  126. package/library/{core → impl}/request.d.ts.map +1 -1
  127. package/library/{core → impl}/response.d.ts +7 -12
  128. package/library/impl/response.d.ts.map +1 -0
  129. package/library/{core → impl}/response.js +120 -154
  130. package/library/{core → impl}/server.d.ts +26 -55
  131. package/library/impl/server.d.ts.map +1 -0
  132. package/library/impl/server.js +575 -0
  133. package/library/index.d.ts +13 -6
  134. package/library/index.d.ts.map +1 -1
  135. package/library/index.js +16 -16
  136. package/library/message/ack.d.ts +15 -0
  137. package/library/message/ack.d.ts.map +1 -0
  138. package/library/message/ack.js +33 -0
  139. package/library/message/channel-cache.d.ts +26 -0
  140. package/library/message/channel-cache.d.ts.map +1 -0
  141. package/library/message/channel-cache.js +115 -0
  142. package/library/message/channel.d.ts +53 -6
  143. package/library/message/channel.d.ts.map +1 -1
  144. package/library/message/channel.js +96 -9
  145. package/library/message/dispatcher.d.ts +17 -0
  146. package/library/message/dispatcher.d.ts.map +1 -1
  147. package/library/message/dispatcher.js +149 -98
  148. package/library/stream/error.d.ts +24 -0
  149. package/library/stream/error.d.ts.map +1 -0
  150. package/library/stream/error.js +29 -0
  151. package/library/stream/index.d.ts +4 -1
  152. package/library/stream/index.d.ts.map +1 -1
  153. package/library/stream/index.js +7 -4
  154. package/library/stream/readable-stream.d.ts.map +1 -1
  155. package/library/stream/readable-stream.js +102 -27
  156. package/library/stream/stream-core.d.ts +22 -1
  157. package/library/stream/stream-core.d.ts.map +1 -1
  158. package/library/stream/stream-core.js +120 -2
  159. package/library/stream/types.d.ts +115 -2
  160. package/library/stream/types.d.ts.map +1 -1
  161. package/library/stream/writable-stream.d.ts +20 -2
  162. package/library/stream/writable-stream.d.ts.map +1 -1
  163. package/library/stream/writable-stream.js +366 -41
  164. package/library/types/index.d.ts +17 -22
  165. package/library/types/index.d.ts.map +1 -1
  166. package/library/utils/ack.d.ts +2 -0
  167. package/library/utils/ack.d.ts.map +1 -0
  168. package/library/utils/ack.js +44 -0
  169. package/library/utils/blob.d.ts +3 -0
  170. package/library/utils/blob.d.ts.map +1 -0
  171. package/library/utils/blob.js +22 -0
  172. package/library/utils/cache.d.ts +10 -20
  173. package/library/utils/cache.d.ts.map +1 -1
  174. package/library/utils/cache.js +25 -79
  175. package/library/utils/content-type.d.ts +13 -0
  176. package/library/utils/content-type.d.ts.map +1 -0
  177. package/library/utils/content-type.js +87 -0
  178. package/library/utils/debug.d.ts.map +1 -1
  179. package/library/utils/debug.js +156 -178
  180. package/library/utils/hooks.d.ts +30 -0
  181. package/library/utils/hooks.d.ts.map +1 -0
  182. package/library/utils/hooks.js +139 -0
  183. package/library/utils/id.d.ts +9 -0
  184. package/library/utils/id.d.ts.map +1 -0
  185. package/library/utils/id.js +21 -0
  186. package/library/utils/iframe.d.ts +5 -0
  187. package/library/utils/iframe.d.ts.map +1 -0
  188. package/library/utils/iframe.js +25 -0
  189. package/library/utils/index.d.ts +7 -34
  190. package/library/utils/index.d.ts.map +1 -1
  191. package/library/utils/index.js +58 -193
  192. package/library/utils/is.d.ts +2 -0
  193. package/library/utils/is.d.ts.map +1 -0
  194. package/library/utils/is.js +9 -0
  195. package/library/utils/logger.d.ts +13 -0
  196. package/library/utils/logger.d.ts.map +1 -0
  197. package/library/utils/logger.js +63 -0
  198. package/library/utils/origin.d.ts.map +1 -1
  199. package/library/utils/origin.js +2 -1
  200. package/library/utils/promise.d.ts +2 -0
  201. package/library/utils/promise.d.ts.map +1 -0
  202. package/library/utils/promise.js +9 -0
  203. package/library/utils/window.d.ts +2 -0
  204. package/library/utils/window.d.ts.map +1 -0
  205. package/library/utils/window.js +38 -0
  206. package/package.json +49 -2
  207. package/react/package.json +2 -1
  208. package/esm/core/client-server.js +0 -329
  209. package/esm/core/server.js +0 -767
  210. package/esm/utils/ack-meta.js +0 -53
  211. package/library/core/client-server.d.ts +0 -106
  212. package/library/core/client-server.d.ts.map +0 -1
  213. package/library/core/client-server.js +0 -336
  214. package/library/core/client.d.ts.map +0 -1
  215. package/library/core/response.d.ts.map +0 -1
  216. package/library/core/server.d.ts.map +0 -1
  217. package/library/core/server.js +0 -772
  218. package/library/utils/ack-meta.d.ts +0 -2
  219. package/library/utils/ack-meta.d.ts.map +0 -1
  220. package/library/utils/ack-meta.js +0 -59
  221. /package/esm/{core → impl}/request.js +0 -0
  222. /package/library/{core → impl}/request.d.ts +0 -0
  223. /package/library/{core → impl}/request.js +0 -0
@@ -17,9 +17,10 @@ require("core-js/modules/es.promise.finally.js");
17
17
  require("core-js/modules/web.dom-collections.iterator.js");
18
18
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
19
19
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
- var _utils = require("../utils");
20
+ var _protocol = require("../utils/protocol");
21
21
  var _constants = require("../constants");
22
22
  var _streamCore = require("./stream-core");
23
+ var _error = require("./error");
23
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
24
25
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25
26
  /**
@@ -49,9 +50,18 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
49
50
  this.messageHandler.registerStreamHandler(streamId, this.handleStreamMessage.bind(this));
50
51
  // Initial pull to start the stream (pull protocol)
51
52
  this.requestMore(1);
53
+
54
+ // Observable: constructed and ready to receive data
55
+ this.emit(_constants.StreamEvent.START, {
56
+ streamId: this.streamId,
57
+ type: this.type,
58
+ chunked: this.chunked,
59
+ mode: this.mode,
60
+ metadata: this.metadata
61
+ });
52
62
  }
53
63
  postControl(type, body) {
54
- var message = (0, _utils.createPostMessage)(type, this.requestId, {
64
+ var message = (0, _protocol.createPostMessage)(type, this.requestId, {
55
65
  secretKey: this.secretKey,
56
66
  body: _objectSpread({
57
67
  streamId: this.streamId
@@ -66,6 +76,9 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
66
76
  this.postControl(_constants.MessageType.STREAM_PULL, {
67
77
  credit
68
78
  });
79
+ this.emit(_constants.StreamEvent.PULL, {
80
+ credit
81
+ });
69
82
  } catch (_unused) {
70
83
  /** ignore */
71
84
  }
@@ -102,13 +115,17 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
102
115
  this.handleEnd();
103
116
  break;
104
117
  case _constants.StreamInternalMessageType.ERROR:
105
- this.handleError(new Error(data.error || _constants.Messages.STREAM_ERROR));
118
+ this.handleError(new _error.RequestIframeStreamError({
119
+ message: data.error || _constants.Messages.STREAM_ERROR,
120
+ code: _constants.ErrorCode.STREAM_ERROR,
121
+ streamId: this.streamId,
122
+ requestId: this.requestId
123
+ }));
106
124
  break;
107
125
  case _constants.StreamInternalMessageType.CANCEL:
108
126
  this.handleCancel(data.reason);
109
127
  break;
110
128
  case _constants.StreamInternalMessageType.PULL:
111
- case _constants.StreamInternalMessageType.ACK:
112
129
  // Control messages for writer side; ignore in readable stream
113
130
  break;
114
131
  }
@@ -122,17 +139,14 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
122
139
  this._state = _constants.StreamState.STREAMING;
123
140
  var decoded = this.decodeData(data);
124
141
  this.chunks.push(decoded);
125
-
126
- // Ack this chunk (if seq provided)
127
- if (typeof seq === 'number' && seq >= 0) {
128
- try {
129
- this.postControl(_constants.MessageType.STREAM_ACK, {
130
- seq
131
- });
132
- } catch (_unused2) {
133
- /** ignore */
134
- }
135
- }
142
+ this.emit(_constants.StreamEvent.DATA, {
143
+ chunk: decoded,
144
+ done,
145
+ seq
146
+ });
147
+ this.emit(_constants.StreamEvent.STATE, {
148
+ state: this._state
149
+ });
136
150
  this.notifyWaiters();
137
151
  this.schedulePullIfNeeded();
138
152
  if (done) {
@@ -157,6 +171,7 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
157
171
  this.messageHandler.unregisterStreamHandler(this.streamId);
158
172
  this.notifyWaiters();
159
173
  (_this$onEndCallback = this.onEndCallback) === null || _this$onEndCallback === void 0 || _this$onEndCallback.call(this);
174
+ this.clearAllListeners();
160
175
  }
161
176
 
162
177
  /**
@@ -183,6 +198,7 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
183
198
  this.messageHandler.unregisterStreamHandler(this.streamId);
184
199
  this.notifyWaiters();
185
200
  (_this$onErrorCallback = this.onErrorCallback) === null || _this$onErrorCallback === void 0 || _this$onErrorCallback.call(this, error);
201
+ this.clearAllListeners();
186
202
  }
187
203
 
188
204
  /**
@@ -201,10 +217,14 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
201
217
  if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR || this._state === _constants.StreamState.CANCELLED) return;
202
218
  super.cancel((0, _constants.formatMessage)(_constants.Messages.STREAM_CANCELLED, reason || ''));
203
219
  this.notifyWaiters();
220
+ this.emit(_constants.StreamEvent.CANCEL, {
221
+ reason,
222
+ remote: notifyRemote
223
+ });
204
224
  if (notifyRemote) {
205
225
  try {
206
226
  /** Notify server to cancel */
207
- var _message = (0, _utils.createPostMessage)(_constants.MessageType.STREAM_CANCEL, this.requestId, {
227
+ var _message = (0, _protocol.createPostMessage)(_constants.MessageType.STREAM_CANCEL, this.requestId, {
208
228
  secretKey: this.secretKey,
209
229
  body: {
210
230
  streamId: this.streamId,
@@ -212,7 +232,7 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
212
232
  }
213
233
  });
214
234
  this.messageHandler.postMessage(_message);
215
- } catch (_unused3) {
235
+ } catch (_unused2) {
216
236
  /** ignore send failures on cancel/abort */
217
237
  }
218
238
  }
@@ -222,8 +242,14 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
222
242
  (_this$onErrorCallback2 = this.onErrorCallback) === null || _this$onErrorCallback2 === void 0 || _this$onErrorCallback2.call(this, this.terminalError);
223
243
  } else {
224
244
  var _this$onErrorCallback3;
225
- (_this$onErrorCallback3 = this.onErrorCallback) === null || _this$onErrorCallback3 === void 0 || _this$onErrorCallback3.call(this, new Error(_constants.Messages.STREAM_CANCELLED));
245
+ (_this$onErrorCallback3 = this.onErrorCallback) === null || _this$onErrorCallback3 === void 0 || _this$onErrorCallback3.call(this, new _error.RequestIframeStreamError({
246
+ message: _constants.Messages.STREAM_CANCELLED,
247
+ code: _constants.ErrorCode.STREAM_CANCELLED,
248
+ streamId: this.streamId,
249
+ requestId: this.requestId
250
+ }));
226
251
  }
252
+ this.clearAllListeners();
227
253
  }
228
254
  performHeartbeat() {
229
255
  var _this = this;
@@ -309,7 +335,15 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
309
335
  return _context2.abrupt("return");
310
336
  case 8:
311
337
  // Connection likely dead: fail the stream
312
- _this2.handleError(new Error((0, _constants.formatMessage)(_constants.Messages.STREAM_TIMEOUT, _this2.idleTimeout)));
338
+ _this2.emit(_constants.StreamEvent.TIMEOUT, {
339
+ timeout: _this2.idleTimeout
340
+ });
341
+ _this2.handleError(new _error.RequestIframeStreamError({
342
+ message: (0, _constants.formatMessage)(_constants.Messages.STREAM_TIMEOUT, _this2.idleTimeout),
343
+ code: _constants.ErrorCode.STREAM_TIMEOUT,
344
+ streamId: _this2.streamId,
345
+ requestId: _this2.requestId
346
+ }));
313
347
  case 9:
314
348
  case "end":
315
349
  return _context2.stop();
@@ -324,6 +358,7 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
324
358
  read() {
325
359
  var _this3 = this;
326
360
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
361
+ var merged, _merged;
327
362
  return _regenerator.default.wrap(function (_context3) {
328
363
  while (1) switch (_context3.prev = _context3.next) {
329
364
  case 0:
@@ -331,13 +366,22 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
331
366
  _context3.next = 1;
332
367
  break;
333
368
  }
334
- return _context3.abrupt("return", _this3.mergeChunks());
369
+ merged = _this3.mergeChunks();
370
+ _this3.emit(_constants.StreamEvent.READ, {
371
+ value: merged
372
+ });
373
+ return _context3.abrupt("return", merged);
335
374
  case 1:
336
375
  if (!(_this3._state === _constants.StreamState.ERROR || _this3._state === _constants.StreamState.CANCELLED)) {
337
376
  _context3.next = 2;
338
377
  break;
339
378
  }
340
- throw _this3.terminalError || new Error(_constants.Messages.STREAM_READ_ERROR);
379
+ throw _this3.terminalError || new _error.RequestIframeStreamError({
380
+ message: _constants.Messages.STREAM_READ_ERROR,
381
+ code: _constants.ErrorCode.STREAM_READ_ERROR,
382
+ streamId: _this3.streamId,
383
+ requestId: _this3.requestId
384
+ });
341
385
  case 2:
342
386
  if (!(_this3._state === _constants.StreamState.PENDING || _this3._state === _constants.StreamState.STREAMING)) {
343
387
  _context3.next = 4;
@@ -356,9 +400,18 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
356
400
  _context3.next = 5;
357
401
  break;
358
402
  }
359
- return _context3.abrupt("return", _this3.mergeChunks());
403
+ _merged = _this3.mergeChunks();
404
+ _this3.emit(_constants.StreamEvent.READ, {
405
+ value: _merged
406
+ });
407
+ return _context3.abrupt("return", _merged);
360
408
  case 5:
361
- throw _this3.terminalError || new Error(_constants.Messages.STREAM_READ_ERROR);
409
+ throw _this3.terminalError || new _error.RequestIframeStreamError({
410
+ message: _constants.Messages.STREAM_READ_ERROR,
411
+ code: _constants.ErrorCode.STREAM_READ_ERROR,
412
+ streamId: _this3.streamId,
413
+ requestId: _this3.requestId
414
+ });
362
415
  case 6:
363
416
  case "end":
364
417
  return _context3.stop();
@@ -373,6 +426,7 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
373
426
  readAll() {
374
427
  var _this4 = this;
375
428
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
429
+ var list, _list;
376
430
  return _regenerator.default.wrap(function (_context4) {
377
431
  while (1) switch (_context4.prev = _context4.next) {
378
432
  case 0:
@@ -380,13 +434,22 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
380
434
  _context4.next = 1;
381
435
  break;
382
436
  }
383
- return _context4.abrupt("return", _this4.chunks.slice());
437
+ list = _this4.chunks.slice();
438
+ _this4.emit(_constants.StreamEvent.READ, {
439
+ value: list
440
+ });
441
+ return _context4.abrupt("return", list);
384
442
  case 1:
385
443
  if (!(_this4._state === _constants.StreamState.ERROR || _this4._state === _constants.StreamState.CANCELLED)) {
386
444
  _context4.next = 2;
387
445
  break;
388
446
  }
389
- throw _this4.terminalError || new Error(_constants.Messages.STREAM_READ_ERROR);
447
+ throw _this4.terminalError || new _error.RequestIframeStreamError({
448
+ message: _constants.Messages.STREAM_READ_ERROR,
449
+ code: _constants.ErrorCode.STREAM_READ_ERROR,
450
+ streamId: _this4.streamId,
451
+ requestId: _this4.requestId
452
+ });
390
453
  case 2:
391
454
  if (!(_this4._state === _constants.StreamState.PENDING || _this4._state === _constants.StreamState.STREAMING)) {
392
455
  _context4.next = 4;
@@ -403,9 +466,18 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
403
466
  _context4.next = 5;
404
467
  break;
405
468
  }
406
- return _context4.abrupt("return", _this4.chunks.slice());
469
+ _list = _this4.chunks.slice();
470
+ _this4.emit(_constants.StreamEvent.READ, {
471
+ value: _list
472
+ });
473
+ return _context4.abrupt("return", _list);
407
474
  case 5:
408
- throw _this4.terminalError || new Error(_constants.Messages.STREAM_READ_ERROR);
475
+ throw _this4.terminalError || new _error.RequestIframeStreamError({
476
+ message: _constants.Messages.STREAM_READ_ERROR,
477
+ code: _constants.ErrorCode.STREAM_READ_ERROR,
478
+ streamId: _this4.streamId,
479
+ requestId: _this4.requestId
480
+ });
409
481
  case 6:
410
482
  case "end":
411
483
  return _context4.stop();
@@ -449,6 +521,9 @@ class IframeReadableStream extends _streamCore.IframeStreamCore {
449
521
  break;
450
522
  case 3:
451
523
  value = stream.chunks[index++];
524
+ stream.emit(_constants.StreamEvent.READ, {
525
+ value
526
+ });
452
527
  if (stream.consume) {
453
528
  /**
454
529
  * Drop already-consumed chunks to reduce memory usage.
@@ -1,4 +1,4 @@
1
- import type { StreamState, StreamType, StreamMessageData, WritableStreamMode } from './types';
1
+ import type { StreamState, StreamType, StreamMessageData, WritableStreamMode, StreamEventName, StreamEventListener } from './types';
2
2
  /**
3
3
  * Shared stream core (internal).
4
4
  *
@@ -20,8 +20,29 @@ export declare class IframeStreamCore<T = any> {
20
20
  protected chunks: T[];
21
21
  protected waiters: Array<() => void>;
22
22
  protected consume: boolean;
23
+ private listeners;
23
24
  constructor(streamId: string, type: StreamType, chunked: boolean, metadata: Record<string, any> | undefined, consume: boolean, mode?: WritableStreamMode);
24
25
  get state(): StreamState;
26
+ /**
27
+ * Subscribe to stream events.
28
+ *
29
+ * This is designed for observability (debugging / metrics / UI progress),
30
+ * and should not be used to drive protocol-critical logic.
31
+ *
32
+ * Returns an unsubscribe function.
33
+ */
34
+ on<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): () => void;
35
+ on(event: string, listener: (payload: any) => void): () => void;
36
+ once<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): () => void;
37
+ once(event: string, listener: (payload: any) => void): () => void;
38
+ /**
39
+ * Unsubscribe from stream events.
40
+ */
41
+ off<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): void;
42
+ off(event: string, listener: (payload: any) => void): void;
43
+ protected emit(event: string, payload?: any): void;
44
+ protected clearAllListeners(): void;
45
+ private safeCall;
25
46
  protected notifyWaiters(): void;
26
47
  protected waitForChange(): Promise<void>;
27
48
  protected fail(error: Error): void;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-core.d.ts","sourceRoot":"","sources":["../../src/stream/stream-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG9F;;;;;;;;;GASG;AACH,qBAAa,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACnC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,SAAgB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAE1C,SAAS,CAAC,MAAM,EAAE,WAAW,CAA+B;IAC5D,SAAS,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC;IAEhC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAM;IAC3B,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAM;IAE1C,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;gBAGzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACzC,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,kBAAkB;IAU3B,IAAW,KAAK,IAAI,WAAW,CAE9B;IAED,SAAS,CAAC,aAAa,IAAI,IAAI;IAa/B,SAAS,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOlC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAWvC;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAOnC;;OAEG;IACH,SAAS,CAAC,GAAG,IAAI,IAAI;IAMrB;;;;OAIG;IACI,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;CAG5D"}
1
+ {"version":3,"file":"stream-core.d.ts","sourceRoot":"","sources":["../../src/stream/stream-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAIjB;;;;;;;;;GASG;AACH,qBAAa,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACnC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,SAAgB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAE1C,SAAS,CAAC,MAAM,EAAE,WAAW,CAA+B;IAC5D,SAAS,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC;IAEhC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAM;IAC3B,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAM;IAE1C,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;IAE3B,OAAO,CAAC,SAAS,CAAoD;gBAGnE,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACzC,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,kBAAkB;IAU3B,IAAW,KAAK,IAAI,WAAW,CAE9B;IAED;;;;;;;OAOG;IACI,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IACrF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAmB/D,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IACvF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAuBxE;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAChF,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAUjE,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAQlD,SAAS,CAAC,iBAAiB,IAAI,IAAI;IAInC,OAAO,CAAC,QAAQ;IAQhB,SAAS,CAAC,aAAa,IAAI,IAAI;IAa/B,SAAS,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IASlC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBvC;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IASnC;;OAEG;IACH,SAAS,CAAC,GAAG,IAAI,IAAI;IAQrB;;;;OAIG;IACI,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;CAG5D"}
@@ -5,10 +5,16 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.IframeStreamCore = void 0;
8
+ require("core-js/modules/es.array.from.js");
9
+ require("core-js/modules/es.array.iterator.js");
10
+ require("core-js/modules/es.map.js");
8
11
  require("core-js/modules/es.promise.js");
12
+ require("core-js/modules/es.set.js");
9
13
  require("core-js/modules/web.dom-collections.for-each.js");
14
+ require("core-js/modules/web.dom-collections.iterator.js");
10
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
16
  var _constants = require("../constants");
17
+ var _error = require("./error");
12
18
  /**
13
19
  * Shared stream core (internal).
14
20
  *
@@ -24,6 +30,7 @@ class IframeStreamCore {
24
30
  (0, _defineProperty2.default)(this, "_state", _constants.StreamState.PENDING);
25
31
  (0, _defineProperty2.default)(this, "chunks", []);
26
32
  (0, _defineProperty2.default)(this, "waiters", []);
33
+ (0, _defineProperty2.default)(this, "listeners", new Map());
27
34
  this.streamId = streamId;
28
35
  this.type = type;
29
36
  this.chunked = chunked;
@@ -34,6 +41,90 @@ class IframeStreamCore {
34
41
  get state() {
35
42
  return this._state;
36
43
  }
44
+
45
+ /**
46
+ * Subscribe to stream events.
47
+ *
48
+ * This is designed for observability (debugging / metrics / UI progress),
49
+ * and should not be used to drive protocol-critical logic.
50
+ *
51
+ * Returns an unsubscribe function.
52
+ */
53
+
54
+ on(event, listener) {
55
+ if (!this.listeners.has(event)) {
56
+ this.listeners.set(event, new Set());
57
+ }
58
+ this.listeners.get(event).add(listener);
59
+
60
+ // Terminal events: if already reached, fire once immediately for convenience.
61
+ if (event === _constants.StreamEvent.END && this._state === _constants.StreamState.ENDED) {
62
+ this.safeCall(listener);
63
+ } else if (event === _constants.StreamEvent.ERROR && this._state === _constants.StreamState.ERROR) {
64
+ this.safeCall(listener, {
65
+ error: this.terminalError
66
+ });
67
+ } else if (event === _constants.StreamEvent.CANCEL && this._state === _constants.StreamState.CANCELLED) {
68
+ this.safeCall(listener, {
69
+ error: this.terminalError
70
+ });
71
+ }
72
+ return () => this.off(event, listener);
73
+ }
74
+ once(event, listener) {
75
+ // If already terminal, behave like a synchronous one-shot.
76
+ if (event === _constants.StreamEvent.END && this._state === _constants.StreamState.ENDED) {
77
+ this.safeCall(listener);
78
+ return () => {};
79
+ }
80
+ if (event === _constants.StreamEvent.ERROR && this._state === _constants.StreamState.ERROR) {
81
+ this.safeCall(listener, {
82
+ error: this.terminalError
83
+ });
84
+ return () => {};
85
+ }
86
+ if (event === _constants.StreamEvent.CANCEL && this._state === _constants.StreamState.CANCELLED) {
87
+ this.safeCall(listener, {
88
+ error: this.terminalError
89
+ });
90
+ return () => {};
91
+ }
92
+ var wrapped = payload => {
93
+ this.off(event, wrapped);
94
+ this.safeCall(listener, payload);
95
+ };
96
+ return this.on(event, wrapped);
97
+ }
98
+
99
+ /**
100
+ * Unsubscribe from stream events.
101
+ */
102
+
103
+ off(event, listener) {
104
+ var set = this.listeners.get(event);
105
+ if (!set) return;
106
+ set.delete(listener);
107
+ if (set.size === 0) {
108
+ this.listeners.delete(event);
109
+ }
110
+ }
111
+ emit(event, payload) {
112
+ var set = this.listeners.get(event);
113
+ if (!set || set.size === 0) return;
114
+ // Snapshot to avoid issues if listeners mutate subscriptions.
115
+ var list = Array.from(set);
116
+ list.forEach(fn => this.safeCall(fn, payload));
117
+ }
118
+ clearAllListeners() {
119
+ this.listeners.clear();
120
+ }
121
+ safeCall(fn, payload) {
122
+ try {
123
+ fn(payload);
124
+ } catch (_unused) {
125
+ /** ignore user listener errors */
126
+ }
127
+ }
37
128
  notifyWaiters() {
38
129
  if (this.waiters.length === 0) return;
39
130
  var list = this.waiters;
@@ -41,7 +132,7 @@ class IframeStreamCore {
41
132
  list.forEach(fn => {
42
133
  try {
43
134
  fn();
44
- } catch (_unused) {
135
+ } catch (_unused2) {
45
136
  /** ignore */
46
137
  }
47
138
  });
@@ -58,12 +149,29 @@ class IframeStreamCore {
58
149
  if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR) return;
59
150
  this._state = _constants.StreamState.ERROR;
60
151
  this.terminalError = error;
152
+ this.emit(_constants.StreamEvent.ERROR, {
153
+ error
154
+ });
155
+ this.emit(_constants.StreamEvent.STATE, {
156
+ state: this._state
157
+ });
61
158
  this.notifyWaiters();
62
159
  }
63
160
  cancel(reason) {
64
161
  if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR || this._state === _constants.StreamState.CANCELLED) return;
65
162
  this._state = _constants.StreamState.CANCELLED;
66
- this.terminalError = new Error(reason || _constants.Messages.STREAM_CANCELLED);
163
+ this.terminalError = new _error.RequestIframeStreamError({
164
+ message: reason || _constants.Messages.STREAM_CANCELLED,
165
+ code: _constants.ErrorCode.STREAM_CANCELLED,
166
+ streamId: this.streamId
167
+ });
168
+ this.emit(_constants.StreamEvent.CANCEL, {
169
+ reason,
170
+ error: this.terminalError
171
+ });
172
+ this.emit(_constants.StreamEvent.STATE, {
173
+ state: this._state
174
+ });
67
175
  this.notifyWaiters();
68
176
  }
69
177
 
@@ -74,6 +182,12 @@ class IframeStreamCore {
74
182
  if (this._state !== _constants.StreamState.PENDING && this._state !== _constants.StreamState.STREAMING) return;
75
183
  this._state = _constants.StreamState.STREAMING;
76
184
  this.chunks.push(chunk);
185
+ this.emit(_constants.StreamEvent.DATA, {
186
+ chunk
187
+ });
188
+ this.emit(_constants.StreamEvent.STATE, {
189
+ state: this._state
190
+ });
77
191
  this.notifyWaiters();
78
192
  }
79
193
 
@@ -83,6 +197,10 @@ class IframeStreamCore {
83
197
  end() {
84
198
  if (this._state === _constants.StreamState.ENDED) return;
85
199
  this._state = _constants.StreamState.ENDED;
200
+ this.emit(_constants.StreamEvent.END);
201
+ this.emit(_constants.StreamEvent.STATE, {
202
+ state: this._state
203
+ });
86
204
  this.notifyWaiters();
87
205
  }
88
206
 
@@ -1,4 +1,4 @@
1
- import { StreamType as StreamTypeConstant, StreamState as StreamStateConstant, StreamMode as StreamModeConstant } from '../constants';
1
+ import { StreamType as StreamTypeConstant, StreamState as StreamStateConstant, StreamMode as StreamModeConstant, StreamEvent as StreamEventConstant } from '../constants';
2
2
  import type { MessageChannel } from '../message';
3
3
  /**
4
4
  * Stream type
@@ -6,6 +6,80 @@ import type { MessageChannel } from '../message';
6
6
  export type StreamType = typeof StreamTypeConstant[keyof typeof StreamTypeConstant];
7
7
  /** Writable stream mode */
8
8
  export type WritableStreamMode = typeof StreamModeConstant[keyof typeof StreamModeConstant];
9
+ /**
10
+ * Stream event name
11
+ */
12
+ export type StreamEventName = typeof StreamEventConstant[keyof typeof StreamEventConstant];
13
+ /**
14
+ * Stream event payload map (for stream.on/once/off typing)
15
+ */
16
+ export type StreamEventPayloadMap = {
17
+ start: {
18
+ streamId: string;
19
+ type: StreamType;
20
+ chunked: boolean;
21
+ mode?: WritableStreamMode;
22
+ metadata?: Record<string, any>;
23
+ };
24
+ data: {
25
+ chunk: any;
26
+ done?: boolean;
27
+ seq?: number;
28
+ };
29
+ read: {
30
+ value: any;
31
+ };
32
+ write: {
33
+ data: any;
34
+ done?: boolean;
35
+ };
36
+ send: {
37
+ seq: number;
38
+ done?: boolean;
39
+ };
40
+ pull: {
41
+ credit: number;
42
+ totalCredit?: number;
43
+ };
44
+ ack: {
45
+ seq?: number;
46
+ };
47
+ end: void;
48
+ cancel: {
49
+ reason?: string;
50
+ remote?: boolean;
51
+ error?: Error;
52
+ };
53
+ error: {
54
+ error?: Error;
55
+ };
56
+ timeout: {
57
+ timeout?: number;
58
+ };
59
+ expired: {
60
+ timeout: number;
61
+ };
62
+ state: {
63
+ state: StreamState;
64
+ };
65
+ };
66
+ export type StreamEventListener<E extends StreamEventName = StreamEventName> = (payload: StreamEventPayloadMap[E]) => void;
67
+ /**
68
+ * Per-frame send/receive options (optional).
69
+ */
70
+ export interface StreamFrameOptions {
71
+ /**
72
+ * Whether to require delivery acknowledgment for this frame.
73
+ *
74
+ * When enabled:
75
+ * - the sender attaches `requireAck: true` to the underlying postMessage
76
+ * - the receiver (MessageDispatcher) auto-replies with `ack` after it accepts the message
77
+ * - the returned Promise resolves to true/false
78
+ */
79
+ requireAck?: boolean;
80
+ /** Acknowledgment timeout (ms). Default: DefaultTimeout.ACK */
81
+ ackTimeout?: number;
82
+ }
9
83
  /**
10
84
  * Stream data chunk
11
85
  */
@@ -52,6 +126,28 @@ export interface WritableStreamOptions {
52
126
  * If true, client will automatically read the stream and return fileData instead of stream
53
127
  */
54
128
  autoResolve?: boolean;
129
+ /**
130
+ * Maximum number of pending (unsent) chunks kept in memory on the writer side.
131
+ *
132
+ * This is especially useful for long-lived `push` streams when the receiver stops pulling
133
+ * (e.g. tab hidden/backgrounded): the writer-side `pendingQueue` may grow without bound if
134
+ * user code keeps calling write().
135
+ *
136
+ * - When enabled (value > 0), exceeding the limit will cause write()/producer to throw.
137
+ * - Default: unlimited.
138
+ */
139
+ maxPendingChunks?: number;
140
+ /**
141
+ * Maximum bytes of pending (unsent) chunks kept in memory on the writer side.
142
+ *
143
+ * Notes:
144
+ * - Only counts well-defined types: string / ArrayBuffer / TypedArray(DataView) / Blob / File.
145
+ * - For other values (plain objects), the size is treated as 0 (not counted). If you need
146
+ * byte-level backpressure for objects, stringify them yourself before write().
147
+ *
148
+ * Default: unlimited.
149
+ */
150
+ maxPendingBytes?: number;
55
151
  }
56
152
  /**
57
153
  * Readable stream configuration options
@@ -167,6 +263,8 @@ export interface IIframeWritableStream {
167
263
  * @param done Whether this is the last chunk
168
264
  */
169
265
  write(data: any, done?: boolean): void;
266
+ write(data: any, options: StreamFrameOptions): Promise<boolean>;
267
+ write(data: any, done: boolean | undefined, options: StreamFrameOptions): Promise<boolean>;
170
268
  /**
171
269
  * End the stream (only meaningful when mode === 'push').
172
270
  */
@@ -175,6 +273,13 @@ export interface IIframeWritableStream {
175
273
  abort(reason?: string): void;
176
274
  /** Cancel stream transfer */
177
275
  cancel(reason?: string): void;
276
+ /**
277
+ * Subscribe to stream events (debug/observability).
278
+ * Returns an unsubscribe function.
279
+ */
280
+ on<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): () => void;
281
+ once<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): () => void;
282
+ off<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): void;
178
283
  }
179
284
  /**
180
285
  * Readable stream interface (client-side)
@@ -215,6 +320,13 @@ export interface IIframeReadableStream<T = any> {
215
320
  onEnd(callback: () => void): void;
216
321
  /** Listen for stream error */
217
322
  onError(callback: (error: Error) => void): void;
323
+ /**
324
+ * Subscribe to stream events (debug/observability).
325
+ * Returns an unsubscribe function.
326
+ */
327
+ on<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): () => void;
328
+ once<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): () => void;
329
+ off<E extends StreamEventName>(event: E, listener: StreamEventListener<E>): void;
218
330
  }
219
331
  /**
220
332
  * File readable stream interface
@@ -249,12 +361,13 @@ export interface StreamMessageData {
249
361
  mode?: WritableStreamMode;
250
362
  /** Data chunk */
251
363
  data?: any;
252
- /** Chunk sequence number (used by pull/ack protocol) */
364
+ /** Chunk sequence number (used for data chunk identification) */
253
365
  seq?: number;
254
366
  /** Whether this is the last chunk */
255
367
  done?: boolean;
256
368
  /** Pull credit (how many chunks requested) */
257
369
  credit?: number;
370
+ /** reserved */
258
371
  /** Error message */
259
372
  error?: string;
260
373
  /** Cancel reason */