request-iframe 0.0.1
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 +269 -0
- package/QUICKSTART.md +269 -0
- package/README.CN.md +1369 -0
- package/README.md +1016 -0
- package/library/__tests__/interceptors.test.ts +124 -0
- package/library/__tests__/requestIframe.test.ts +2216 -0
- package/library/__tests__/stream.test.ts +650 -0
- package/library/__tests__/utils.test.ts +433 -0
- package/library/api/client.d.ts +16 -0
- package/library/api/client.d.ts.map +1 -0
- package/library/api/client.js +72 -0
- package/library/api/server.d.ts +16 -0
- package/library/api/server.d.ts.map +1 -0
- package/library/api/server.js +44 -0
- package/library/constants/index.d.ts +209 -0
- package/library/constants/index.d.ts.map +1 -0
- package/library/constants/index.js +260 -0
- package/library/constants/messages.d.ts +80 -0
- package/library/constants/messages.d.ts.map +1 -0
- package/library/constants/messages.js +123 -0
- package/library/core/client.d.ts +99 -0
- package/library/core/client.d.ts.map +1 -0
- package/library/core/client.js +440 -0
- package/library/core/message-handler.d.ts +110 -0
- package/library/core/message-handler.d.ts.map +1 -0
- package/library/core/message-handler.js +320 -0
- package/library/core/request-response.d.ts +59 -0
- package/library/core/request-response.d.ts.map +1 -0
- package/library/core/request-response.js +337 -0
- package/library/core/request.d.ts +17 -0
- package/library/core/request.d.ts.map +1 -0
- package/library/core/request.js +34 -0
- package/library/core/response.d.ts +51 -0
- package/library/core/response.d.ts.map +1 -0
- package/library/core/response.js +323 -0
- package/library/core/server-base.d.ts +86 -0
- package/library/core/server-base.d.ts.map +1 -0
- package/library/core/server-base.js +257 -0
- package/library/core/server-client.d.ts +99 -0
- package/library/core/server-client.d.ts.map +1 -0
- package/library/core/server-client.js +256 -0
- package/library/core/server.d.ts +82 -0
- package/library/core/server.d.ts.map +1 -0
- package/library/core/server.js +338 -0
- package/library/index.d.ts +16 -0
- package/library/index.d.ts.map +1 -0
- package/library/index.js +211 -0
- package/library/interceptors/index.d.ts +41 -0
- package/library/interceptors/index.d.ts.map +1 -0
- package/library/interceptors/index.js +126 -0
- package/library/message/channel.d.ts +107 -0
- package/library/message/channel.d.ts.map +1 -0
- package/library/message/channel.js +184 -0
- package/library/message/dispatcher.d.ts +119 -0
- package/library/message/dispatcher.d.ts.map +1 -0
- package/library/message/dispatcher.js +249 -0
- package/library/message/index.d.ts +5 -0
- package/library/message/index.d.ts.map +1 -0
- package/library/message/index.js +25 -0
- package/library/stream/file-stream.d.ts +48 -0
- package/library/stream/file-stream.d.ts.map +1 -0
- package/library/stream/file-stream.js +240 -0
- package/library/stream/index.d.ts +15 -0
- package/library/stream/index.d.ts.map +1 -0
- package/library/stream/index.js +83 -0
- package/library/stream/readable-stream.d.ts +83 -0
- package/library/stream/readable-stream.d.ts.map +1 -0
- package/library/stream/readable-stream.js +249 -0
- package/library/stream/types.d.ts +165 -0
- package/library/stream/types.d.ts.map +1 -0
- package/library/stream/types.js +5 -0
- package/library/stream/writable-stream.d.ts +60 -0
- package/library/stream/writable-stream.d.ts.map +1 -0
- package/library/stream/writable-stream.js +348 -0
- package/library/types/index.d.ts +408 -0
- package/library/types/index.d.ts.map +1 -0
- package/library/types/index.js +5 -0
- package/library/utils/cache.d.ts +19 -0
- package/library/utils/cache.d.ts.map +1 -0
- package/library/utils/cache.js +83 -0
- package/library/utils/cookie.d.ts +117 -0
- package/library/utils/cookie.d.ts.map +1 -0
- package/library/utils/cookie.js +365 -0
- package/library/utils/debug.d.ts +11 -0
- package/library/utils/debug.d.ts.map +1 -0
- package/library/utils/debug.js +162 -0
- package/library/utils/index.d.ts +13 -0
- package/library/utils/index.d.ts.map +1 -0
- package/library/utils/index.js +132 -0
- package/library/utils/path-match.d.ts +17 -0
- package/library/utils/path-match.d.ts.map +1 -0
- package/library/utils/path-match.js +90 -0
- package/library/utils/protocol.d.ts +61 -0
- package/library/utils/protocol.d.ts.map +1 -0
- package/library/utils/protocol.js +169 -0
- package/package.json +58 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { StreamType, StreamState, ReadableStreamOptions, IIframeReadableStream, StreamMessageData } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Stream message handler interface
|
|
4
|
+
*/
|
|
5
|
+
export interface StreamMessageHandler {
|
|
6
|
+
/** Register stream message handler */
|
|
7
|
+
registerStreamHandler(streamId: string, handler: (data: StreamMessageData) => void): void;
|
|
8
|
+
/** Unregister handler */
|
|
9
|
+
unregisterStreamHandler(streamId: string): void;
|
|
10
|
+
/** Post message */
|
|
11
|
+
postMessage(message: any): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* IframeReadableStream - Client-side readable stream
|
|
15
|
+
* Used to receive stream data sent from the server
|
|
16
|
+
*/
|
|
17
|
+
export declare class IframeReadableStream<T = any> implements IIframeReadableStream<T> {
|
|
18
|
+
readonly streamId: string;
|
|
19
|
+
readonly type: StreamType;
|
|
20
|
+
readonly chunked: boolean;
|
|
21
|
+
readonly metadata?: Record<string, any>;
|
|
22
|
+
private _state;
|
|
23
|
+
private readonly chunks;
|
|
24
|
+
private resolveRead?;
|
|
25
|
+
private rejectRead?;
|
|
26
|
+
private onEndCallback?;
|
|
27
|
+
private onErrorCallback?;
|
|
28
|
+
private readonly messageHandler;
|
|
29
|
+
private readonly requestId;
|
|
30
|
+
private readonly secretKey?;
|
|
31
|
+
constructor(streamId: string, requestId: string, messageHandler: StreamMessageHandler, options?: ReadableStreamOptions);
|
|
32
|
+
/** Get stream state */
|
|
33
|
+
get state(): StreamState;
|
|
34
|
+
/**
|
|
35
|
+
* Handle stream message
|
|
36
|
+
*/
|
|
37
|
+
private handleStreamMessage;
|
|
38
|
+
/**
|
|
39
|
+
* Handle data chunk (internal method)
|
|
40
|
+
*/
|
|
41
|
+
private handleData;
|
|
42
|
+
/**
|
|
43
|
+
* Decode data (subclasses can override, e.g., FileStream needs Base64 decoding)
|
|
44
|
+
*/
|
|
45
|
+
protected decodeData(data: any): T;
|
|
46
|
+
/**
|
|
47
|
+
* Stream ended (internal handling)
|
|
48
|
+
*/
|
|
49
|
+
private handleEnd;
|
|
50
|
+
/**
|
|
51
|
+
* Merge data chunks (subclasses can override)
|
|
52
|
+
*/
|
|
53
|
+
protected mergeChunks(): T;
|
|
54
|
+
/**
|
|
55
|
+
* Stream error (internal method)
|
|
56
|
+
*/
|
|
57
|
+
private handleError;
|
|
58
|
+
/**
|
|
59
|
+
* Stream cancelled (internal method)
|
|
60
|
+
*/
|
|
61
|
+
private handleCancel;
|
|
62
|
+
/**
|
|
63
|
+
* Read all data
|
|
64
|
+
*/
|
|
65
|
+
read(): Promise<T>;
|
|
66
|
+
/**
|
|
67
|
+
* Async iterator
|
|
68
|
+
*/
|
|
69
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
70
|
+
/**
|
|
71
|
+
* Cancel stream
|
|
72
|
+
*/
|
|
73
|
+
cancel(reason?: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Listen for stream end
|
|
76
|
+
*/
|
|
77
|
+
onEnd(callback: () => void): void;
|
|
78
|
+
/**
|
|
79
|
+
* Listen for stream error
|
|
80
|
+
*/
|
|
81
|
+
onError(callback: (error: Error) => void): void;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=readable-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readable-stream.d.ts","sourceRoot":"","sources":["../../src/stream/readable-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,yBAAyB;IACzB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,mBAAmB;IACnB,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,oBAAoB,CAAC,CAAC,GAAG,GAAG,CAAE,YAAW,qBAAqB,CAAC,CAAC,CAAC;IAC5E,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;IAE/C,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,WAAW,CAAC,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,eAAe,CAAC,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;gBAGlC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,oBAAoB,EACpC,OAAO,GAAE,qBAA0B;IAcrC,uBAAuB;IACvB,IAAW,KAAK,IAAI,WAAW,CAE9B;IAED;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;IAIlC;;OAEG;IACH,OAAO,CAAC,SAAS;IAiBjB;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,CAAC;IAW1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;IAiBzB;;OAEG;IACI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;IAoBjD;;OAEG;IACI,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkBpC;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAOxC;;OAEG;IACI,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;CAGvD"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.IframeReadableStream = void 0;
|
|
8
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
require("core-js/modules/es.symbol.async-iterator.js");
|
|
10
|
+
require("core-js/modules/es.promise.js");
|
|
11
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
+
var _utils = require("../utils");
|
|
14
|
+
var _constants = require("../constants");
|
|
15
|
+
/**
|
|
16
|
+
* Stream message handler interface
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* IframeReadableStream - Client-side readable stream
|
|
21
|
+
* Used to receive stream data sent from the server
|
|
22
|
+
*/
|
|
23
|
+
class IframeReadableStream {
|
|
24
|
+
constructor(streamId, requestId, messageHandler, options = {}) {
|
|
25
|
+
var _options$type, _options$chunked;
|
|
26
|
+
(0, _defineProperty2.default)(this, "_state", _constants.StreamState.PENDING);
|
|
27
|
+
(0, _defineProperty2.default)(this, "chunks", []);
|
|
28
|
+
this.streamId = streamId;
|
|
29
|
+
this.requestId = requestId;
|
|
30
|
+
this.messageHandler = messageHandler;
|
|
31
|
+
this.type = (_options$type = options.type) !== null && _options$type !== void 0 ? _options$type : _constants.StreamType.DATA;
|
|
32
|
+
this.chunked = (_options$chunked = options.chunked) !== null && _options$chunked !== void 0 ? _options$chunked : true;
|
|
33
|
+
this.metadata = options.metadata;
|
|
34
|
+
this.secretKey = options.secretKey;
|
|
35
|
+
|
|
36
|
+
// Register stream message handler
|
|
37
|
+
this.messageHandler.registerStreamHandler(streamId, this.handleStreamMessage.bind(this));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Get stream state */
|
|
41
|
+
get state() {
|
|
42
|
+
return this._state;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Handle stream message
|
|
47
|
+
*/
|
|
48
|
+
handleStreamMessage(data) {
|
|
49
|
+
switch (data.type) {
|
|
50
|
+
case _constants.StreamInternalMessageType.DATA:
|
|
51
|
+
this.handleData(data.data, data.done);
|
|
52
|
+
break;
|
|
53
|
+
case _constants.StreamInternalMessageType.END:
|
|
54
|
+
this.handleEnd();
|
|
55
|
+
break;
|
|
56
|
+
case _constants.StreamInternalMessageType.ERROR:
|
|
57
|
+
this.handleError(new Error(data.error || _constants.Messages.STREAM_ERROR));
|
|
58
|
+
break;
|
|
59
|
+
case _constants.StreamInternalMessageType.CANCEL:
|
|
60
|
+
this.handleCancel(data.reason);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Handle data chunk (internal method)
|
|
67
|
+
*/
|
|
68
|
+
handleData(data, done) {
|
|
69
|
+
if (this._state !== _constants.StreamState.PENDING && this._state !== _constants.StreamState.STREAMING) return;
|
|
70
|
+
this._state = _constants.StreamState.STREAMING;
|
|
71
|
+
var decoded = this.decodeData(data);
|
|
72
|
+
this.chunks.push(decoded);
|
|
73
|
+
if (done) {
|
|
74
|
+
this.handleEnd();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Decode data (subclasses can override, e.g., FileStream needs Base64 decoding)
|
|
80
|
+
*/
|
|
81
|
+
decodeData(data) {
|
|
82
|
+
return data;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Stream ended (internal handling)
|
|
87
|
+
*/
|
|
88
|
+
handleEnd() {
|
|
89
|
+
var _this$onEndCallback;
|
|
90
|
+
if (this._state === _constants.StreamState.ENDED) return;
|
|
91
|
+
this._state = _constants.StreamState.ENDED;
|
|
92
|
+
this.messageHandler.unregisterStreamHandler(this.streamId);
|
|
93
|
+
if (this.resolveRead) {
|
|
94
|
+
// Merge all data chunks
|
|
95
|
+
var result = this.mergeChunks();
|
|
96
|
+
this.resolveRead(result);
|
|
97
|
+
this.resolveRead = undefined;
|
|
98
|
+
this.rejectRead = undefined;
|
|
99
|
+
}
|
|
100
|
+
(_this$onEndCallback = this.onEndCallback) === null || _this$onEndCallback === void 0 || _this$onEndCallback.call(this);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Merge data chunks (subclasses can override)
|
|
105
|
+
*/
|
|
106
|
+
mergeChunks() {
|
|
107
|
+
if (this.chunks.length === 0) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
if (this.chunks.length === 1) {
|
|
111
|
+
return this.chunks[0];
|
|
112
|
+
}
|
|
113
|
+
// Default returns array
|
|
114
|
+
return this.chunks;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Stream error (internal method)
|
|
119
|
+
*/
|
|
120
|
+
handleError(error) {
|
|
121
|
+
var _this$onErrorCallback;
|
|
122
|
+
if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR) return;
|
|
123
|
+
this._state = _constants.StreamState.ERROR;
|
|
124
|
+
this.messageHandler.unregisterStreamHandler(this.streamId);
|
|
125
|
+
if (this.rejectRead) {
|
|
126
|
+
this.rejectRead(error);
|
|
127
|
+
this.resolveRead = undefined;
|
|
128
|
+
this.rejectRead = undefined;
|
|
129
|
+
}
|
|
130
|
+
(_this$onErrorCallback = this.onErrorCallback) === null || _this$onErrorCallback === void 0 || _this$onErrorCallback.call(this, error);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Stream cancelled (internal method)
|
|
135
|
+
*/
|
|
136
|
+
handleCancel(reason) {
|
|
137
|
+
var _this$onErrorCallback2;
|
|
138
|
+
if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR || this._state === _constants.StreamState.CANCELLED) return;
|
|
139
|
+
this._state = _constants.StreamState.CANCELLED;
|
|
140
|
+
this.messageHandler.unregisterStreamHandler(this.streamId);
|
|
141
|
+
var error = new Error(reason || _constants.Messages.STREAM_CANCELLED);
|
|
142
|
+
if (this.rejectRead) {
|
|
143
|
+
this.rejectRead(error);
|
|
144
|
+
this.resolveRead = undefined;
|
|
145
|
+
this.rejectRead = undefined;
|
|
146
|
+
}
|
|
147
|
+
(_this$onErrorCallback2 = this.onErrorCallback) === null || _this$onErrorCallback2 === void 0 || _this$onErrorCallback2.call(this, error);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Read all data
|
|
152
|
+
*/
|
|
153
|
+
read() {
|
|
154
|
+
return new Promise((resolve, reject) => {
|
|
155
|
+
if (this._state === _constants.StreamState.ENDED) {
|
|
156
|
+
resolve(this.mergeChunks());
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (this._state === _constants.StreamState.ERROR || this._state === _constants.StreamState.CANCELLED) {
|
|
160
|
+
reject(new Error(_constants.Messages.STREAM_READ_ERROR));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this.resolveRead = resolve;
|
|
164
|
+
this.rejectRead = reject;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Async iterator
|
|
170
|
+
*/
|
|
171
|
+
[Symbol.asyncIterator]() {
|
|
172
|
+
var index = 0;
|
|
173
|
+
var stream = this;
|
|
174
|
+
return {
|
|
175
|
+
next() {
|
|
176
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
177
|
+
return _regenerator.default.wrap(function (_context) {
|
|
178
|
+
while (1) switch (_context.prev = _context.next) {
|
|
179
|
+
case 0:
|
|
180
|
+
if (!(index >= stream.chunks.length)) {
|
|
181
|
+
_context.next = 3;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
if (!(stream._state === _constants.StreamState.ENDED || stream._state === _constants.StreamState.ERROR || stream._state === _constants.StreamState.CANCELLED)) {
|
|
185
|
+
_context.next = 1;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
return _context.abrupt("return", {
|
|
189
|
+
done: true,
|
|
190
|
+
value: undefined
|
|
191
|
+
});
|
|
192
|
+
case 1:
|
|
193
|
+
_context.next = 2;
|
|
194
|
+
return new Promise(resolve => setTimeout(resolve, 10));
|
|
195
|
+
case 2:
|
|
196
|
+
_context.next = 0;
|
|
197
|
+
break;
|
|
198
|
+
case 3:
|
|
199
|
+
return _context.abrupt("return", {
|
|
200
|
+
done: false,
|
|
201
|
+
value: stream.chunks[index++]
|
|
202
|
+
});
|
|
203
|
+
case 4:
|
|
204
|
+
case "end":
|
|
205
|
+
return _context.stop();
|
|
206
|
+
}
|
|
207
|
+
}, _callee);
|
|
208
|
+
}))();
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Cancel stream
|
|
215
|
+
*/
|
|
216
|
+
cancel(reason) {
|
|
217
|
+
if (this._state !== _constants.StreamState.PENDING && this._state !== _constants.StreamState.STREAMING) return;
|
|
218
|
+
this._state = _constants.StreamState.CANCELLED;
|
|
219
|
+
|
|
220
|
+
// Notify server to cancel
|
|
221
|
+
var message = (0, _utils.createPostMessage)(_constants.MessageType.STREAM_CANCEL, this.requestId, {
|
|
222
|
+
secretKey: this.secretKey,
|
|
223
|
+
body: {
|
|
224
|
+
streamId: this.streamId,
|
|
225
|
+
reason
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
this.messageHandler.postMessage(message);
|
|
229
|
+
this.messageHandler.unregisterStreamHandler(this.streamId);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Listen for stream end
|
|
234
|
+
*/
|
|
235
|
+
onEnd(callback) {
|
|
236
|
+
this.onEndCallback = callback;
|
|
237
|
+
if (this._state === _constants.StreamState.ENDED) {
|
|
238
|
+
callback();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Listen for stream error
|
|
244
|
+
*/
|
|
245
|
+
onError(callback) {
|
|
246
|
+
this.onErrorCallback = callback;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.IframeReadableStream = IframeReadableStream;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { StreamType as StreamTypeConstant, StreamState as StreamStateConstant } from '../constants';
|
|
2
|
+
import type { MessageChannel } from '../message';
|
|
3
|
+
/**
|
|
4
|
+
* Stream type
|
|
5
|
+
*/
|
|
6
|
+
export type StreamType = typeof StreamTypeConstant[keyof typeof StreamTypeConstant];
|
|
7
|
+
/**
|
|
8
|
+
* Stream data chunk
|
|
9
|
+
*/
|
|
10
|
+
export interface StreamChunk {
|
|
11
|
+
/** Chunk data */
|
|
12
|
+
data: any;
|
|
13
|
+
/** Whether this is the last chunk */
|
|
14
|
+
done: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Writable stream configuration options
|
|
18
|
+
*/
|
|
19
|
+
export interface WritableStreamOptions {
|
|
20
|
+
/** Stream type: data for regular data, file for files */
|
|
21
|
+
type?: StreamType;
|
|
22
|
+
/** Whether to use chunked transfer (true: multiple transfers, false: single transfer) */
|
|
23
|
+
chunked?: boolean;
|
|
24
|
+
/** Data generator iterator (higher priority than next) */
|
|
25
|
+
iterator?: () => AsyncGenerator<any, void, unknown>;
|
|
26
|
+
/** Data generator function (returns next chunk on each call) */
|
|
27
|
+
next?: () => Promise<StreamChunk> | StreamChunk;
|
|
28
|
+
/** Stream metadata */
|
|
29
|
+
metadata?: Record<string, any>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Readable stream configuration options
|
|
33
|
+
*/
|
|
34
|
+
export interface ReadableStreamOptions {
|
|
35
|
+
/** Stream type */
|
|
36
|
+
type?: StreamType;
|
|
37
|
+
/** Whether to use chunked transfer */
|
|
38
|
+
chunked?: boolean;
|
|
39
|
+
/** Stream metadata */
|
|
40
|
+
metadata?: Record<string, any>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* File writable stream configuration options
|
|
44
|
+
*/
|
|
45
|
+
export interface FileWritableStreamOptions extends Omit<WritableStreamOptions, 'type'> {
|
|
46
|
+
/** Filename */
|
|
47
|
+
filename: string;
|
|
48
|
+
/** MIME type */
|
|
49
|
+
mimeType?: string;
|
|
50
|
+
/** File size (optional, used for progress calculation) */
|
|
51
|
+
size?: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* File readable stream configuration options
|
|
55
|
+
*/
|
|
56
|
+
export interface FileReadableStreamOptions extends Omit<ReadableStreamOptions, 'type'> {
|
|
57
|
+
/** Filename */
|
|
58
|
+
filename?: string;
|
|
59
|
+
/** MIME type */
|
|
60
|
+
mimeType?: string;
|
|
61
|
+
/** File size */
|
|
62
|
+
size?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Stream bind context (associates request information)
|
|
66
|
+
*/
|
|
67
|
+
export interface StreamBindContext {
|
|
68
|
+
/** Request ID */
|
|
69
|
+
requestId: string;
|
|
70
|
+
/** Target window */
|
|
71
|
+
targetWindow: Window;
|
|
72
|
+
/** Target origin */
|
|
73
|
+
targetOrigin: string;
|
|
74
|
+
/** secretKey */
|
|
75
|
+
secretKey?: string;
|
|
76
|
+
/** MessageChannel for sending messages (optional, uses direct postMessage if not provided) */
|
|
77
|
+
channel?: MessageChannel;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Stream state
|
|
81
|
+
*/
|
|
82
|
+
export type StreamState = typeof StreamStateConstant[keyof typeof StreamStateConstant];
|
|
83
|
+
/**
|
|
84
|
+
* Writable stream interface (server-side)
|
|
85
|
+
*/
|
|
86
|
+
export interface IIframeWritableStream {
|
|
87
|
+
/** Stream ID */
|
|
88
|
+
readonly streamId: string;
|
|
89
|
+
/** Stream type */
|
|
90
|
+
readonly type: StreamType;
|
|
91
|
+
/** Whether chunked */
|
|
92
|
+
readonly chunked: boolean;
|
|
93
|
+
/** Stream state */
|
|
94
|
+
readonly state: StreamState;
|
|
95
|
+
/** Bind to request context */
|
|
96
|
+
_bind(context: StreamBindContext): void;
|
|
97
|
+
/** Start stream transfer */
|
|
98
|
+
start(): Promise<void>;
|
|
99
|
+
/** Cancel stream transfer */
|
|
100
|
+
cancel(reason?: string): void;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Readable stream interface (client-side)
|
|
104
|
+
*/
|
|
105
|
+
export interface IIframeReadableStream<T = any> {
|
|
106
|
+
/** Stream ID */
|
|
107
|
+
readonly streamId: string;
|
|
108
|
+
/** Stream type */
|
|
109
|
+
readonly type: StreamType;
|
|
110
|
+
/** Whether chunked */
|
|
111
|
+
readonly chunked: boolean;
|
|
112
|
+
/** Stream state */
|
|
113
|
+
readonly state: StreamState;
|
|
114
|
+
/** Stream metadata */
|
|
115
|
+
readonly metadata?: Record<string, any>;
|
|
116
|
+
/** Read all data (for non-chunked streams or wait for chunked stream to complete) */
|
|
117
|
+
read(): Promise<T>;
|
|
118
|
+
/** Async iterator (for chunked streams) */
|
|
119
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
120
|
+
/** Cancel stream */
|
|
121
|
+
cancel(reason?: string): void;
|
|
122
|
+
/** Listen for stream end */
|
|
123
|
+
onEnd(callback: () => void): void;
|
|
124
|
+
/** Listen for stream error */
|
|
125
|
+
onError(callback: (error: Error) => void): void;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* File readable stream interface
|
|
129
|
+
*/
|
|
130
|
+
export interface IIframeFileReadableStream extends IIframeReadableStream<Uint8Array> {
|
|
131
|
+
/** Filename */
|
|
132
|
+
readonly filename?: string;
|
|
133
|
+
/** MIME type */
|
|
134
|
+
readonly mimeType?: string;
|
|
135
|
+
/** File size */
|
|
136
|
+
readonly size?: number;
|
|
137
|
+
/** Read as Blob */
|
|
138
|
+
readAsBlob(): Promise<Blob>;
|
|
139
|
+
/** Read as ArrayBuffer */
|
|
140
|
+
readAsArrayBuffer(): Promise<ArrayBuffer>;
|
|
141
|
+
/** Read as Data URL */
|
|
142
|
+
readAsDataURL(): Promise<string>;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Stream message data
|
|
146
|
+
*/
|
|
147
|
+
export interface StreamMessageData {
|
|
148
|
+
/** Stream ID */
|
|
149
|
+
streamId: string;
|
|
150
|
+
/** Stream type */
|
|
151
|
+
type?: StreamType;
|
|
152
|
+
/** Whether chunked */
|
|
153
|
+
chunked?: boolean;
|
|
154
|
+
/** Data chunk */
|
|
155
|
+
data?: any;
|
|
156
|
+
/** Whether this is the last chunk */
|
|
157
|
+
done?: boolean;
|
|
158
|
+
/** Error message */
|
|
159
|
+
error?: string;
|
|
160
|
+
/** Cancel reason */
|
|
161
|
+
reason?: string;
|
|
162
|
+
/** Metadata */
|
|
163
|
+
metadata?: Record<string, any>;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/stream/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAAE,WAAW,IAAI,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,kBAAkB,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAEpF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,qCAAqC;IACrC,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;IAChD,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,kBAAkB;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACpF,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACpF,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,mBAAmB,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kBAAkB;IAClB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,mBAAmB;IACnB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,8BAA8B;IAC9B,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,4BAA4B;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,6BAA6B;IAC7B,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,GAAG;IAC5C,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kBAAkB;IAClB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,mBAAmB;IACnB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,qFAAqF;IACrF,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,2CAA2C;IAC3C,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,oBAAoB;IACpB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4BAA4B;IAC5B,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAClC,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,qBAAqB,CAAC,UAAU,CAAC;IAClF,eAAe;IACf,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB;IAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,0BAA0B;IAC1B,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,uBAAuB;IACvB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,qCAAqC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { StreamType, StreamState, StreamBindContext, WritableStreamOptions, IIframeWritableStream } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* IframeWritableStream - Server-side writable stream
|
|
4
|
+
* Used to send stream data to the client
|
|
5
|
+
*/
|
|
6
|
+
export declare class IframeWritableStream implements IIframeWritableStream {
|
|
7
|
+
readonly streamId: string;
|
|
8
|
+
readonly type: StreamType;
|
|
9
|
+
readonly chunked: boolean;
|
|
10
|
+
private _state;
|
|
11
|
+
private context;
|
|
12
|
+
private readonly iterator?;
|
|
13
|
+
private readonly nextFn?;
|
|
14
|
+
private readonly metadata?;
|
|
15
|
+
constructor(options?: WritableStreamOptions);
|
|
16
|
+
/** Get stream state */
|
|
17
|
+
get state(): StreamState;
|
|
18
|
+
/**
|
|
19
|
+
* Bind to request context
|
|
20
|
+
* Called during res.sendStream()
|
|
21
|
+
*/
|
|
22
|
+
_bind(context: StreamBindContext): void;
|
|
23
|
+
/**
|
|
24
|
+
* Send message to client
|
|
25
|
+
*/
|
|
26
|
+
private sendMessage;
|
|
27
|
+
/**
|
|
28
|
+
* Start stream transfer
|
|
29
|
+
*/
|
|
30
|
+
start(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Generate data from iterator
|
|
33
|
+
*/
|
|
34
|
+
private streamFromIterator;
|
|
35
|
+
/**
|
|
36
|
+
* Generate data from next function
|
|
37
|
+
*/
|
|
38
|
+
private streamFromNext;
|
|
39
|
+
/**
|
|
40
|
+
* Send data chunk
|
|
41
|
+
*/
|
|
42
|
+
private sendData;
|
|
43
|
+
/**
|
|
44
|
+
* Encode data (subclasses can override, e.g., FileStream needs Base64 encoding)
|
|
45
|
+
*/
|
|
46
|
+
protected encodeData(data: any): any;
|
|
47
|
+
/**
|
|
48
|
+
* End stream
|
|
49
|
+
*/
|
|
50
|
+
private end;
|
|
51
|
+
/**
|
|
52
|
+
* Send error
|
|
53
|
+
*/
|
|
54
|
+
private error;
|
|
55
|
+
/**
|
|
56
|
+
* Cancel stream transfer
|
|
57
|
+
*/
|
|
58
|
+
cancel(reason?: string): void;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=writable-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writable-stream.d.ts","sourceRoot":"","sources":["../../src/stream/writable-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AAWjB;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,OAAO,EAAE,OAAO,CAAC;IAEjC,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAsB;gBAE7B,OAAO,GAAE,qBAA0B;IAStD,uBAAuB;IACvB,IAAW,KAAK,IAAI,WAAW,CAE9B;IAED;;;OAGG;IACI,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI9C;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCnC;;OAEG;YACW,kBAAkB;IAuBhC;;OAEG;YACW,cAAc;IAsB5B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG;IAIpC;;OAEG;IACH,OAAO,CAAC,GAAG;IAOX;;OAEG;IACH,OAAO,CAAC,KAAK;IASb;;OAEG;IACI,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAWrC"}
|