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.
- package/QUICKSTART.CN.md +4 -2
- package/QUICKSTART.md +4 -2
- package/README.CN.md +302 -54
- package/README.md +281 -36
- package/cdn/request-iframe-react.umd.js +3354 -0
- package/cdn/request-iframe-react.umd.js.map +1 -0
- package/cdn/request-iframe-react.umd.min.js +2 -0
- package/cdn/request-iframe-react.umd.min.js.map +1 -0
- package/cdn/request-iframe.umd.js +19735 -0
- package/cdn/request-iframe.umd.js.map +1 -0
- package/cdn/request-iframe.umd.min.js +4 -0
- package/cdn/request-iframe.umd.min.js.map +1 -0
- package/esm/api/client.js +31 -22
- package/esm/api/endpoint.js +229 -0
- package/esm/api/server.js +19 -9
- package/esm/constants/debug.js +17 -0
- package/esm/constants/index.js +115 -66
- package/esm/constants/log.js +11 -0
- package/esm/constants/messages.js +6 -1
- package/esm/constants/warn-once.js +15 -0
- package/esm/endpoint/facade.js +390 -0
- package/esm/endpoint/heartbeat/heartbeat.js +60 -0
- package/esm/endpoint/heartbeat/ping.js +20 -0
- package/esm/endpoint/index.js +13 -0
- package/esm/endpoint/infra/hub.js +316 -0
- package/esm/endpoint/infra/inbox.js +232 -0
- package/esm/endpoint/infra/outbox.js +408 -0
- package/esm/endpoint/stream/dispatcher.js +58 -0
- package/esm/endpoint/stream/errors.js +27 -0
- package/esm/endpoint/stream/factory.js +76 -0
- package/esm/endpoint/stream/file-auto-resolve.js +34 -0
- package/esm/endpoint/stream/file-writable.js +105 -0
- package/esm/endpoint/stream/handler.js +26 -0
- package/esm/{core → impl}/client.js +243 -320
- package/esm/{core → impl}/response.js +120 -154
- package/esm/impl/server.js +568 -0
- package/esm/index.js +13 -6
- package/esm/message/ack.js +27 -0
- package/esm/message/channel-cache.js +108 -0
- package/esm/message/channel.js +92 -5
- package/esm/message/dispatcher.js +149 -98
- package/esm/stream/error.js +22 -0
- package/esm/stream/index.js +3 -1
- package/esm/stream/readable-stream.js +101 -26
- package/esm/stream/stream-core.js +121 -3
- package/esm/stream/writable-stream.js +368 -43
- package/esm/utils/ack.js +36 -0
- package/esm/utils/blob.js +16 -0
- package/esm/utils/cache.js +25 -76
- package/esm/utils/content-type.js +81 -0
- package/esm/utils/debug.js +157 -180
- package/esm/utils/hooks.js +130 -0
- package/esm/utils/id.js +14 -0
- package/esm/utils/iframe.js +20 -0
- package/esm/utils/index.js +12 -162
- package/esm/utils/is.js +3 -0
- package/esm/utils/logger.js +55 -0
- package/esm/utils/origin.js +3 -1
- package/esm/utils/promise.js +3 -0
- package/esm/utils/window.js +31 -0
- package/library/api/client.d.ts.map +1 -1
- package/library/api/client.js +32 -23
- package/library/api/endpoint.d.ts +23 -0
- package/library/api/endpoint.d.ts.map +1 -0
- package/library/api/endpoint.js +235 -0
- package/library/api/server.d.ts +4 -1
- package/library/api/server.d.ts.map +1 -1
- package/library/api/server.js +19 -9
- package/library/constants/debug.d.ts +18 -0
- package/library/constants/debug.d.ts.map +1 -0
- package/library/constants/debug.js +23 -0
- package/library/constants/index.d.ts +58 -7
- package/library/constants/index.d.ts.map +1 -1
- package/library/constants/index.js +143 -67
- package/library/constants/log.d.ts +12 -0
- package/library/constants/log.d.ts.map +1 -0
- package/library/constants/log.js +17 -0
- package/library/constants/messages.d.ts +6 -1
- package/library/constants/messages.d.ts.map +1 -1
- package/library/constants/messages.js +6 -1
- package/library/constants/warn-once.d.ts +12 -0
- package/library/constants/warn-once.d.ts.map +1 -0
- package/library/constants/warn-once.js +22 -0
- package/library/endpoint/facade.d.ts +238 -0
- package/library/endpoint/facade.d.ts.map +1 -0
- package/library/endpoint/facade.js +398 -0
- package/library/endpoint/heartbeat/heartbeat.d.ts +34 -0
- package/library/endpoint/heartbeat/heartbeat.d.ts.map +1 -0
- package/library/endpoint/heartbeat/heartbeat.js +67 -0
- package/library/endpoint/heartbeat/ping.d.ts +18 -0
- package/library/endpoint/heartbeat/ping.d.ts.map +1 -0
- package/library/endpoint/heartbeat/ping.js +26 -0
- package/library/endpoint/index.d.ts +16 -0
- package/library/endpoint/index.d.ts.map +1 -0
- package/library/endpoint/index.js +114 -0
- package/library/endpoint/infra/hub.d.ts +170 -0
- package/library/endpoint/infra/hub.d.ts.map +1 -0
- package/library/endpoint/infra/hub.js +323 -0
- package/library/endpoint/infra/inbox.d.ts +73 -0
- package/library/endpoint/infra/inbox.d.ts.map +1 -0
- package/library/endpoint/infra/inbox.js +239 -0
- package/library/endpoint/infra/outbox.d.ts +149 -0
- package/library/endpoint/infra/outbox.d.ts.map +1 -0
- package/library/endpoint/infra/outbox.js +415 -0
- package/library/endpoint/stream/dispatcher.d.ts +33 -0
- package/library/endpoint/stream/dispatcher.d.ts.map +1 -0
- package/library/endpoint/stream/dispatcher.js +66 -0
- package/library/endpoint/stream/errors.d.ts +20 -0
- package/library/endpoint/stream/errors.d.ts.map +1 -0
- package/library/endpoint/stream/errors.js +32 -0
- package/library/endpoint/stream/factory.d.ts +44 -0
- package/library/endpoint/stream/factory.d.ts.map +1 -0
- package/library/endpoint/stream/factory.js +82 -0
- package/library/endpoint/stream/file-auto-resolve.d.ts +26 -0
- package/library/endpoint/stream/file-auto-resolve.d.ts.map +1 -0
- package/library/endpoint/stream/file-auto-resolve.js +41 -0
- package/library/endpoint/stream/file-writable.d.ts +33 -0
- package/library/endpoint/stream/file-writable.d.ts.map +1 -0
- package/library/endpoint/stream/file-writable.js +115 -0
- package/library/endpoint/stream/handler.d.ts +20 -0
- package/library/endpoint/stream/handler.d.ts.map +1 -0
- package/library/endpoint/stream/handler.js +32 -0
- package/library/{core → impl}/client.d.ts +16 -13
- package/library/impl/client.d.ts.map +1 -0
- package/library/{core → impl}/client.js +254 -333
- package/library/{core → impl}/request.d.ts.map +1 -1
- package/library/{core → impl}/response.d.ts +7 -12
- package/library/impl/response.d.ts.map +1 -0
- package/library/{core → impl}/response.js +120 -154
- package/library/{core → impl}/server.d.ts +26 -55
- package/library/impl/server.d.ts.map +1 -0
- package/library/impl/server.js +575 -0
- package/library/index.d.ts +13 -6
- package/library/index.d.ts.map +1 -1
- package/library/index.js +16 -16
- package/library/message/ack.d.ts +15 -0
- package/library/message/ack.d.ts.map +1 -0
- package/library/message/ack.js +33 -0
- package/library/message/channel-cache.d.ts +26 -0
- package/library/message/channel-cache.d.ts.map +1 -0
- package/library/message/channel-cache.js +115 -0
- package/library/message/channel.d.ts +53 -6
- package/library/message/channel.d.ts.map +1 -1
- package/library/message/channel.js +96 -9
- package/library/message/dispatcher.d.ts +17 -0
- package/library/message/dispatcher.d.ts.map +1 -1
- package/library/message/dispatcher.js +149 -98
- package/library/stream/error.d.ts +24 -0
- package/library/stream/error.d.ts.map +1 -0
- package/library/stream/error.js +29 -0
- package/library/stream/index.d.ts +4 -1
- package/library/stream/index.d.ts.map +1 -1
- package/library/stream/index.js +7 -4
- package/library/stream/readable-stream.d.ts.map +1 -1
- package/library/stream/readable-stream.js +102 -27
- package/library/stream/stream-core.d.ts +22 -1
- package/library/stream/stream-core.d.ts.map +1 -1
- package/library/stream/stream-core.js +120 -2
- package/library/stream/types.d.ts +115 -2
- package/library/stream/types.d.ts.map +1 -1
- package/library/stream/writable-stream.d.ts +20 -2
- package/library/stream/writable-stream.d.ts.map +1 -1
- package/library/stream/writable-stream.js +366 -41
- package/library/types/index.d.ts +17 -22
- package/library/types/index.d.ts.map +1 -1
- package/library/utils/ack.d.ts +2 -0
- package/library/utils/ack.d.ts.map +1 -0
- package/library/utils/ack.js +44 -0
- package/library/utils/blob.d.ts +3 -0
- package/library/utils/blob.d.ts.map +1 -0
- package/library/utils/blob.js +22 -0
- package/library/utils/cache.d.ts +10 -20
- package/library/utils/cache.d.ts.map +1 -1
- package/library/utils/cache.js +25 -79
- package/library/utils/content-type.d.ts +13 -0
- package/library/utils/content-type.d.ts.map +1 -0
- package/library/utils/content-type.js +87 -0
- package/library/utils/debug.d.ts.map +1 -1
- package/library/utils/debug.js +156 -178
- package/library/utils/hooks.d.ts +30 -0
- package/library/utils/hooks.d.ts.map +1 -0
- package/library/utils/hooks.js +139 -0
- package/library/utils/id.d.ts +9 -0
- package/library/utils/id.d.ts.map +1 -0
- package/library/utils/id.js +21 -0
- package/library/utils/iframe.d.ts +5 -0
- package/library/utils/iframe.d.ts.map +1 -0
- package/library/utils/iframe.js +25 -0
- package/library/utils/index.d.ts +7 -34
- package/library/utils/index.d.ts.map +1 -1
- package/library/utils/index.js +58 -193
- package/library/utils/is.d.ts +2 -0
- package/library/utils/is.d.ts.map +1 -0
- package/library/utils/is.js +9 -0
- package/library/utils/logger.d.ts +13 -0
- package/library/utils/logger.d.ts.map +1 -0
- package/library/utils/logger.js +63 -0
- package/library/utils/origin.d.ts.map +1 -1
- package/library/utils/origin.js +2 -1
- package/library/utils/promise.d.ts +2 -0
- package/library/utils/promise.d.ts.map +1 -0
- package/library/utils/promise.js +9 -0
- package/library/utils/window.d.ts +2 -0
- package/library/utils/window.d.ts.map +1 -0
- package/library/utils/window.js +38 -0
- package/package.json +49 -2
- package/react/package.json +2 -1
- package/esm/core/client-server.js +0 -329
- package/esm/core/server.js +0 -767
- package/esm/utils/ack-meta.js +0 -53
- package/library/core/client-server.d.ts +0 -106
- package/library/core/client-server.d.ts.map +0 -1
- package/library/core/client-server.js +0 -336
- package/library/core/client.d.ts.map +0 -1
- package/library/core/response.d.ts.map +0 -1
- package/library/core/server.d.ts.map +0 -1
- package/library/core/server.js +0 -772
- package/library/utils/ack-meta.d.ts +0 -2
- package/library/utils/ack-meta.d.ts.map +0 -1
- package/library/utils/ack-meta.js +0 -59
- /package/esm/{core → impl}/request.js +0 -0
- /package/library/{core → impl}/request.d.ts +0 -0
- /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
|
|
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,
|
|
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
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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,
|
|
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 (
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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,
|
|
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 (
|
|
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
|
|
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
|
|
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 */
|