request-iframe 0.0.6 → 0.1.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/README.CN.md +220 -21
- package/README.md +221 -24
- package/esm/api/client.js +80 -0
- package/esm/api/server.js +61 -0
- package/esm/constants/index.js +289 -0
- package/esm/constants/messages.js +157 -0
- package/esm/core/client-server.js +294 -0
- package/esm/core/client.js +873 -0
- package/esm/core/request.js +27 -0
- package/esm/core/response.js +459 -0
- package/esm/core/server.js +776 -0
- package/esm/index.js +21 -0
- package/esm/interceptors/index.js +122 -0
- package/esm/message/channel.js +182 -0
- package/esm/message/dispatcher.js +418 -0
- package/esm/message/index.js +2 -0
- package/esm/stream/file-stream.js +289 -0
- package/esm/stream/index.js +44 -0
- package/esm/stream/readable-stream.js +539 -0
- package/esm/stream/stream-core.js +204 -0
- package/esm/stream/types.js +1 -0
- package/esm/stream/writable-stream.js +836 -0
- package/esm/types/index.js +1 -0
- package/esm/utils/ack.js +36 -0
- package/esm/utils/cache.js +147 -0
- package/esm/utils/cookie.js +352 -0
- package/esm/utils/debug.js +521 -0
- package/esm/utils/error.js +27 -0
- package/esm/utils/index.js +180 -0
- package/esm/utils/origin.js +30 -0
- package/esm/utils/path-match.js +148 -0
- package/esm/utils/protocol.js +157 -0
- package/library/api/client.d.ts.map +1 -1
- package/library/api/client.js +13 -5
- package/library/api/server.d.ts.map +1 -1
- package/library/api/server.js +6 -1
- package/library/constants/index.d.ts +59 -4
- package/library/constants/index.d.ts.map +1 -1
- package/library/constants/index.js +67 -9
- package/library/constants/messages.d.ts +8 -1
- package/library/constants/messages.d.ts.map +1 -1
- package/library/constants/messages.js +8 -1
- package/library/core/client-server.d.ts +7 -15
- package/library/core/client-server.d.ts.map +1 -1
- package/library/core/client-server.js +56 -44
- package/library/core/client.d.ts +4 -1
- package/library/core/client.d.ts.map +1 -1
- package/library/core/client.js +74 -31
- package/library/core/response.d.ts +21 -3
- package/library/core/response.d.ts.map +1 -1
- package/library/core/response.js +55 -7
- package/library/core/server.d.ts +34 -3
- package/library/core/server.d.ts.map +1 -1
- package/library/core/server.js +191 -21
- package/library/message/channel.d.ts +6 -0
- package/library/message/channel.d.ts.map +1 -1
- package/library/message/channel.js +2 -1
- package/library/message/dispatcher.d.ts +32 -0
- package/library/message/dispatcher.d.ts.map +1 -1
- package/library/message/dispatcher.js +131 -1
- package/library/stream/file-stream.d.ts +4 -0
- package/library/stream/file-stream.d.ts.map +1 -1
- package/library/stream/file-stream.js +61 -33
- package/library/stream/index.d.ts.map +1 -1
- package/library/stream/index.js +2 -0
- package/library/stream/readable-stream.d.ts +30 -11
- package/library/stream/readable-stream.d.ts.map +1 -1
- package/library/stream/readable-stream.js +368 -73
- package/library/stream/stream-core.d.ts +65 -0
- package/library/stream/stream-core.d.ts.map +1 -0
- package/library/stream/stream-core.js +211 -0
- package/library/stream/types.d.ts +203 -3
- package/library/stream/types.d.ts.map +1 -1
- package/library/stream/writable-stream.d.ts +59 -13
- package/library/stream/writable-stream.d.ts.map +1 -1
- package/library/stream/writable-stream.js +647 -197
- package/library/types/index.d.ts +70 -4
- 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/debug.js +1 -1
- package/library/utils/index.d.ts +1 -0
- package/library/utils/index.d.ts.map +1 -1
- package/library/utils/index.js +19 -2
- package/library/utils/origin.d.ts +14 -0
- package/library/utils/origin.d.ts.map +1 -0
- package/library/utils/origin.js +35 -0
- package/package.json +30 -7
- package/react/README.md +16 -0
- package/react/esm/index.js +284 -0
- package/react/library/index.d.ts +1 -1
- package/react/library/index.d.ts.map +1 -1
- package/react/library/index.js +3 -3
- package/react/package.json +24 -2
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
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");
|
|
11
|
+
require("core-js/modules/es.promise.js");
|
|
12
|
+
require("core-js/modules/es.set.js");
|
|
13
|
+
require("core-js/modules/web.dom-collections.for-each.js");
|
|
14
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
|
+
var _constants = require("../constants");
|
|
17
|
+
/**
|
|
18
|
+
* Shared stream core (internal).
|
|
19
|
+
*
|
|
20
|
+
* - Read side: buffer + waiters + consume compaction
|
|
21
|
+
* - Common: state + terminal error + basic waiter mechanics
|
|
22
|
+
*
|
|
23
|
+
* NOTE:
|
|
24
|
+
* This is an internal abstraction to share logic between Readable/Writable streams.
|
|
25
|
+
* Public API remains `IframeReadableStream` / `IframeWritableStream`.
|
|
26
|
+
*/
|
|
27
|
+
class IframeStreamCore {
|
|
28
|
+
constructor(streamId, type, chunked, metadata, consume, mode) {
|
|
29
|
+
(0, _defineProperty2.default)(this, "_state", _constants.StreamState.PENDING);
|
|
30
|
+
(0, _defineProperty2.default)(this, "chunks", []);
|
|
31
|
+
(0, _defineProperty2.default)(this, "waiters", []);
|
|
32
|
+
(0, _defineProperty2.default)(this, "listeners", new Map());
|
|
33
|
+
this.streamId = streamId;
|
|
34
|
+
this.type = type;
|
|
35
|
+
this.chunked = chunked;
|
|
36
|
+
this.metadata = metadata;
|
|
37
|
+
this.consume = consume;
|
|
38
|
+
this.mode = mode;
|
|
39
|
+
}
|
|
40
|
+
get state() {
|
|
41
|
+
return this._state;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Subscribe to stream events.
|
|
46
|
+
*
|
|
47
|
+
* This is designed for observability (debugging / metrics / UI progress),
|
|
48
|
+
* and should not be used to drive protocol-critical logic.
|
|
49
|
+
*
|
|
50
|
+
* Returns an unsubscribe function.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
on(event, listener) {
|
|
54
|
+
if (!this.listeners.has(event)) {
|
|
55
|
+
this.listeners.set(event, new Set());
|
|
56
|
+
}
|
|
57
|
+
this.listeners.get(event).add(listener);
|
|
58
|
+
|
|
59
|
+
// Terminal events: if already reached, fire once immediately for convenience.
|
|
60
|
+
if (event === _constants.StreamEvent.END && this._state === _constants.StreamState.ENDED) {
|
|
61
|
+
this.safeCall(listener);
|
|
62
|
+
} else if (event === _constants.StreamEvent.ERROR && this._state === _constants.StreamState.ERROR) {
|
|
63
|
+
this.safeCall(listener, {
|
|
64
|
+
error: this.terminalError
|
|
65
|
+
});
|
|
66
|
+
} else if (event === _constants.StreamEvent.CANCEL && this._state === _constants.StreamState.CANCELLED) {
|
|
67
|
+
this.safeCall(listener, {
|
|
68
|
+
error: this.terminalError
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return () => this.off(event, listener);
|
|
72
|
+
}
|
|
73
|
+
once(event, listener) {
|
|
74
|
+
// If already terminal, behave like a synchronous one-shot.
|
|
75
|
+
if (event === _constants.StreamEvent.END && this._state === _constants.StreamState.ENDED) {
|
|
76
|
+
this.safeCall(listener);
|
|
77
|
+
return () => {};
|
|
78
|
+
}
|
|
79
|
+
if (event === _constants.StreamEvent.ERROR && this._state === _constants.StreamState.ERROR) {
|
|
80
|
+
this.safeCall(listener, {
|
|
81
|
+
error: this.terminalError
|
|
82
|
+
});
|
|
83
|
+
return () => {};
|
|
84
|
+
}
|
|
85
|
+
if (event === _constants.StreamEvent.CANCEL && this._state === _constants.StreamState.CANCELLED) {
|
|
86
|
+
this.safeCall(listener, {
|
|
87
|
+
error: this.terminalError
|
|
88
|
+
});
|
|
89
|
+
return () => {};
|
|
90
|
+
}
|
|
91
|
+
var wrapped = payload => {
|
|
92
|
+
this.off(event, wrapped);
|
|
93
|
+
this.safeCall(listener, payload);
|
|
94
|
+
};
|
|
95
|
+
return this.on(event, wrapped);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Unsubscribe from stream events.
|
|
100
|
+
*/
|
|
101
|
+
|
|
102
|
+
off(event, listener) {
|
|
103
|
+
var set = this.listeners.get(event);
|
|
104
|
+
if (!set) return;
|
|
105
|
+
set.delete(listener);
|
|
106
|
+
if (set.size === 0) {
|
|
107
|
+
this.listeners.delete(event);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
emit(event, payload) {
|
|
111
|
+
var set = this.listeners.get(event);
|
|
112
|
+
if (!set || set.size === 0) return;
|
|
113
|
+
// Snapshot to avoid issues if listeners mutate subscriptions.
|
|
114
|
+
var list = Array.from(set);
|
|
115
|
+
list.forEach(fn => this.safeCall(fn, payload));
|
|
116
|
+
}
|
|
117
|
+
clearAllListeners() {
|
|
118
|
+
this.listeners.clear();
|
|
119
|
+
}
|
|
120
|
+
safeCall(fn, payload) {
|
|
121
|
+
try {
|
|
122
|
+
fn(payload);
|
|
123
|
+
} catch (_unused) {
|
|
124
|
+
/** ignore user listener errors */
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
notifyWaiters() {
|
|
128
|
+
if (this.waiters.length === 0) return;
|
|
129
|
+
var list = this.waiters;
|
|
130
|
+
this.waiters = [];
|
|
131
|
+
list.forEach(fn => {
|
|
132
|
+
try {
|
|
133
|
+
fn();
|
|
134
|
+
} catch (_unused2) {
|
|
135
|
+
/** ignore */
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
waitForChange() {
|
|
140
|
+
if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR || this._state === _constants.StreamState.CANCELLED) {
|
|
141
|
+
return Promise.resolve();
|
|
142
|
+
}
|
|
143
|
+
return new Promise(resolve => {
|
|
144
|
+
this.waiters.push(resolve);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
fail(error) {
|
|
148
|
+
if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR) return;
|
|
149
|
+
this._state = _constants.StreamState.ERROR;
|
|
150
|
+
this.terminalError = error;
|
|
151
|
+
this.emit(_constants.StreamEvent.ERROR, {
|
|
152
|
+
error
|
|
153
|
+
});
|
|
154
|
+
this.emit(_constants.StreamEvent.STATE, {
|
|
155
|
+
state: this._state
|
|
156
|
+
});
|
|
157
|
+
this.notifyWaiters();
|
|
158
|
+
}
|
|
159
|
+
cancel(reason) {
|
|
160
|
+
if (this._state === _constants.StreamState.ENDED || this._state === _constants.StreamState.ERROR || this._state === _constants.StreamState.CANCELLED) return;
|
|
161
|
+
this._state = _constants.StreamState.CANCELLED;
|
|
162
|
+
this.terminalError = new Error(reason || _constants.Messages.STREAM_CANCELLED);
|
|
163
|
+
this.emit(_constants.StreamEvent.CANCEL, {
|
|
164
|
+
reason,
|
|
165
|
+
error: this.terminalError
|
|
166
|
+
});
|
|
167
|
+
this.emit(_constants.StreamEvent.STATE, {
|
|
168
|
+
state: this._state
|
|
169
|
+
});
|
|
170
|
+
this.notifyWaiters();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Read-side: enqueue a decoded chunk
|
|
175
|
+
*/
|
|
176
|
+
pushChunk(chunk) {
|
|
177
|
+
if (this._state !== _constants.StreamState.PENDING && this._state !== _constants.StreamState.STREAMING) return;
|
|
178
|
+
this._state = _constants.StreamState.STREAMING;
|
|
179
|
+
this.chunks.push(chunk);
|
|
180
|
+
this.emit(_constants.StreamEvent.DATA, {
|
|
181
|
+
chunk
|
|
182
|
+
});
|
|
183
|
+
this.emit(_constants.StreamEvent.STATE, {
|
|
184
|
+
state: this._state
|
|
185
|
+
});
|
|
186
|
+
this.notifyWaiters();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Read-side: mark end
|
|
191
|
+
*/
|
|
192
|
+
end() {
|
|
193
|
+
if (this._state === _constants.StreamState.ENDED) return;
|
|
194
|
+
this._state = _constants.StreamState.ENDED;
|
|
195
|
+
this.emit(_constants.StreamEvent.END);
|
|
196
|
+
this.emit(_constants.StreamEvent.STATE, {
|
|
197
|
+
state: this._state
|
|
198
|
+
});
|
|
199
|
+
this.notifyWaiters();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Handle inbound message (shared).
|
|
204
|
+
* - ReadableStream will use DATA/END/ERROR/CANCEL
|
|
205
|
+
* - WritableStream may use PULL/ACK/CANCEL separately, so this is intentionally minimal.
|
|
206
|
+
*/
|
|
207
|
+
handleInboundMessage(_data) {
|
|
208
|
+
// Intentionally left blank in core.
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.IframeStreamCore = IframeStreamCore;
|
|
@@ -1,9 +1,85 @@
|
|
|
1
|
-
import { StreamType as StreamTypeConstant, StreamState as StreamStateConstant } 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
|
|
5
5
|
*/
|
|
6
6
|
export type StreamType = typeof StreamTypeConstant[keyof typeof StreamTypeConstant];
|
|
7
|
+
/** Writable stream mode */
|
|
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
|
+
}
|
|
7
83
|
/**
|
|
8
84
|
* Stream data chunk
|
|
9
85
|
*/
|
|
@@ -21,6 +97,24 @@ export interface WritableStreamOptions {
|
|
|
21
97
|
type?: StreamType;
|
|
22
98
|
/** Whether to use chunked transfer (true: multiple transfers, false: single transfer) */
|
|
23
99
|
chunked?: boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Stream mode
|
|
102
|
+
* - pull (default): uses iterator/next to produce chunks
|
|
103
|
+
* - push: user calls write()/end() manually (iterator/next not required)
|
|
104
|
+
*/
|
|
105
|
+
mode?: WritableStreamMode;
|
|
106
|
+
/**
|
|
107
|
+
* Stream expire timeout (milliseconds).
|
|
108
|
+
* If set to a positive number, the stream will automatically error out after this duration
|
|
109
|
+
* to avoid leaking resources when the receiver never finishes consuming.
|
|
110
|
+
*/
|
|
111
|
+
expireTimeout?: number;
|
|
112
|
+
/**
|
|
113
|
+
* Stream idle timeout (milliseconds) on the writer side.
|
|
114
|
+
* - Used for pull/ack protocol: if the writer does not receive pull/ack within this duration,
|
|
115
|
+
* it will perform a heartbeat check (if available) and fail the stream if not alive.
|
|
116
|
+
*/
|
|
117
|
+
streamTimeout?: number;
|
|
24
118
|
/** Data generator iterator (higher priority than next) */
|
|
25
119
|
iterator?: () => AsyncGenerator<any, void, unknown>;
|
|
26
120
|
/** Data generator function (returns next chunk on each call) */
|
|
@@ -32,6 +126,28 @@ export interface WritableStreamOptions {
|
|
|
32
126
|
* If true, client will automatically read the stream and return fileData instead of stream
|
|
33
127
|
*/
|
|
34
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;
|
|
35
151
|
}
|
|
36
152
|
/**
|
|
37
153
|
* Readable stream configuration options
|
|
@@ -43,6 +159,28 @@ export interface ReadableStreamOptions {
|
|
|
43
159
|
chunked?: boolean;
|
|
44
160
|
/** Stream metadata */
|
|
45
161
|
metadata?: Record<string, any>;
|
|
162
|
+
/** secretKey (for generating outgoing stream control messages like stream_cancel) */
|
|
163
|
+
secretKey?: string;
|
|
164
|
+
/**
|
|
165
|
+
* Idle timeout (milliseconds) while waiting for new stream data.
|
|
166
|
+
* - When triggered, the stream may perform a heartbeat check (if provided).
|
|
167
|
+
*/
|
|
168
|
+
idleTimeout?: number;
|
|
169
|
+
/**
|
|
170
|
+
* Heartbeat function used during idle timeout.
|
|
171
|
+
* - Should resolve true if connection is still alive, otherwise false.
|
|
172
|
+
*/
|
|
173
|
+
heartbeat?: () => Promise<boolean>;
|
|
174
|
+
/**
|
|
175
|
+
* Whether to discard already-consumed chunks during async iteration to reduce memory usage.
|
|
176
|
+
* Default is false (keeps all chunks, useful for read()/readAll()).
|
|
177
|
+
*/
|
|
178
|
+
consume?: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Stream mode from the sender (optional).
|
|
181
|
+
* - Populated from stream_start so receiver can make decisions.
|
|
182
|
+
*/
|
|
183
|
+
mode?: WritableStreamMode;
|
|
46
184
|
}
|
|
47
185
|
/**
|
|
48
186
|
* File writable stream configuration options
|
|
@@ -80,6 +218,18 @@ export interface StreamBindContext {
|
|
|
80
218
|
secretKey?: string;
|
|
81
219
|
/** MessageChannel for sending messages */
|
|
82
220
|
channel: MessageChannel;
|
|
221
|
+
/**
|
|
222
|
+
* Register stream control message handler (for pull/ack/cancel) on the owner side.
|
|
223
|
+
* This allows writable streams to receive `stream_*` control messages routed by core client/server.
|
|
224
|
+
*/
|
|
225
|
+
registerStreamHandler?: (streamId: string, handler: (data: StreamMessageData) => void) => void;
|
|
226
|
+
/** Unregister stream handler */
|
|
227
|
+
unregisterStreamHandler?: (streamId: string) => void;
|
|
228
|
+
/**
|
|
229
|
+
* Heartbeat function used by streamTimeout on writer side (optional).
|
|
230
|
+
* Should resolve true if connection is alive.
|
|
231
|
+
*/
|
|
232
|
+
heartbeat?: () => Promise<boolean>;
|
|
83
233
|
/** Server instance ID (for server-side streams, used as creatorId) */
|
|
84
234
|
serverId?: string;
|
|
85
235
|
/** Client instance ID (for client-side streams, used as creatorId) */
|
|
@@ -107,8 +257,29 @@ export interface IIframeWritableStream {
|
|
|
107
257
|
_bind(context: StreamBindContext): void;
|
|
108
258
|
/** Start stream transfer */
|
|
109
259
|
start(): Promise<void>;
|
|
260
|
+
/**
|
|
261
|
+
* Push a chunk manually (only meaningful when mode === 'push').
|
|
262
|
+
* @param data Chunk payload
|
|
263
|
+
* @param done Whether this is the last chunk
|
|
264
|
+
*/
|
|
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>;
|
|
268
|
+
/**
|
|
269
|
+
* End the stream (only meaningful when mode === 'push').
|
|
270
|
+
*/
|
|
271
|
+
end(): void;
|
|
272
|
+
/** Abort stream transfer */
|
|
273
|
+
abort(reason?: string): void;
|
|
110
274
|
/** Cancel stream transfer */
|
|
111
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;
|
|
112
283
|
}
|
|
113
284
|
/**
|
|
114
285
|
* Readable stream interface (client-side)
|
|
@@ -124,16 +295,38 @@ export interface IIframeReadableStream<T = any> {
|
|
|
124
295
|
readonly state: StreamState;
|
|
125
296
|
/** Stream metadata */
|
|
126
297
|
readonly metadata?: Record<string, any>;
|
|
127
|
-
/**
|
|
128
|
-
|
|
298
|
+
/**
|
|
299
|
+
* Stream mode from the sender (if provided).
|
|
300
|
+
*/
|
|
301
|
+
readonly mode?: WritableStreamMode;
|
|
302
|
+
/**
|
|
303
|
+
* Read all data (waits until the stream ends).
|
|
304
|
+
* - Non-chunked streams typically resolve to a single chunk (T)
|
|
305
|
+
* - Chunked streams may resolve to T[] (depending on stream implementation)
|
|
306
|
+
*/
|
|
307
|
+
read(): Promise<T | T[]>;
|
|
308
|
+
/**
|
|
309
|
+
* Read all chunks as an array (always returns T[]).
|
|
310
|
+
* Useful for chunked streams when you want a consistent return type.
|
|
311
|
+
*/
|
|
312
|
+
readAll(): Promise<T[]>;
|
|
129
313
|
/** Async iterator (for chunked streams) */
|
|
130
314
|
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
315
|
+
/** Abort stream */
|
|
316
|
+
abort(reason?: string): void;
|
|
131
317
|
/** Cancel stream */
|
|
132
318
|
cancel(reason?: string): void;
|
|
133
319
|
/** Listen for stream end */
|
|
134
320
|
onEnd(callback: () => void): void;
|
|
135
321
|
/** Listen for stream error */
|
|
136
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;
|
|
137
330
|
}
|
|
138
331
|
/**
|
|
139
332
|
* File readable stream interface
|
|
@@ -164,10 +357,17 @@ export interface StreamMessageData {
|
|
|
164
357
|
type?: StreamType;
|
|
165
358
|
/** Whether chunked */
|
|
166
359
|
chunked?: boolean;
|
|
360
|
+
/** Stream mode (provided by stream_start) */
|
|
361
|
+
mode?: WritableStreamMode;
|
|
167
362
|
/** Data chunk */
|
|
168
363
|
data?: any;
|
|
364
|
+
/** Chunk sequence number (used for data chunk identification) */
|
|
365
|
+
seq?: number;
|
|
169
366
|
/** Whether this is the last chunk */
|
|
170
367
|
done?: boolean;
|
|
368
|
+
/** Pull credit (how many chunks requested) */
|
|
369
|
+
credit?: number;
|
|
370
|
+
/** reserved */
|
|
171
371
|
/** Error message */
|
|
172
372
|
error?: string;
|
|
173
373
|
/** Cancel reason */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/stream/types.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/stream/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,43 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StreamState, StreamBindContext, WritableStreamOptions, IIframeWritableStream, WritableStreamMode, StreamFrameOptions } from './types';
|
|
2
|
+
import { IframeStreamCore } from './stream-core';
|
|
2
3
|
/**
|
|
3
4
|
* IframeWritableStream - Server-side writable stream
|
|
4
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* Writer/producer stream.
|
|
7
|
+
* It can be created on either side:
|
|
8
|
+
* - Server → Client: used as response stream (via `res.sendStream(stream)`)
|
|
9
|
+
* - Client → Server: used as request body stream (via `client.sendStream(path, stream)`)
|
|
5
10
|
*/
|
|
6
|
-
export declare class IframeWritableStream implements IIframeWritableStream {
|
|
7
|
-
readonly
|
|
8
|
-
readonly type: StreamType;
|
|
9
|
-
readonly chunked: boolean;
|
|
10
|
-
private _state;
|
|
11
|
+
export declare class IframeWritableStream extends IframeStreamCore<any> implements IIframeWritableStream {
|
|
12
|
+
readonly mode: WritableStreamMode;
|
|
11
13
|
private context;
|
|
12
14
|
private readonly iterator?;
|
|
13
15
|
private readonly nextFn?;
|
|
14
|
-
private readonly metadata?;
|
|
15
16
|
private readonly autoResolve?;
|
|
17
|
+
private readonly expireTimeout?;
|
|
18
|
+
private readonly streamTimeout?;
|
|
19
|
+
private readonly maxPendingChunks?;
|
|
20
|
+
private readonly maxPendingBytes?;
|
|
21
|
+
private expireTimer;
|
|
22
|
+
private idleTimer;
|
|
23
|
+
private lastRemoteActivityAt;
|
|
24
|
+
private heartbeatInFlight;
|
|
25
|
+
/** pull/ack protocol */
|
|
26
|
+
private pullCredit;
|
|
27
|
+
private seq;
|
|
28
|
+
private pendingBytes;
|
|
29
|
+
private readonly pendingQueue;
|
|
30
|
+
private pumping;
|
|
31
|
+
private completionPromise;
|
|
32
|
+
private resolveCompletion;
|
|
33
|
+
private rejectCompletion;
|
|
34
|
+
private ackWaiters;
|
|
35
|
+
private ackReceiverRegistered;
|
|
36
|
+
private ackReceiver?;
|
|
16
37
|
constructor(options?: WritableStreamOptions);
|
|
38
|
+
private enqueue;
|
|
39
|
+
private estimateChunkBytes;
|
|
40
|
+
private utf8ByteLength;
|
|
17
41
|
/** Get stream state */
|
|
18
42
|
get state(): StreamState;
|
|
19
43
|
/**
|
|
@@ -21,26 +45,44 @@ export declare class IframeWritableStream implements IIframeWritableStream {
|
|
|
21
45
|
* Called during res.sendStream()
|
|
22
46
|
*/
|
|
23
47
|
_bind(context: StreamBindContext): void;
|
|
48
|
+
private registerControlHandler;
|
|
49
|
+
private unregisterControlHandler;
|
|
50
|
+
private handleControlMessage;
|
|
51
|
+
private clearIdleTimer;
|
|
52
|
+
private performHeartbeat;
|
|
53
|
+
private startIdleTimer;
|
|
24
54
|
/**
|
|
25
55
|
* Send message (to client when server-side stream, to server when client-side stream)
|
|
26
56
|
*/
|
|
27
57
|
private sendMessage;
|
|
58
|
+
private ensureAckReceiver;
|
|
59
|
+
private cleanupAckWaiters;
|
|
60
|
+
private registerAckWaiter;
|
|
61
|
+
private clearExpireTimer;
|
|
62
|
+
private startExpireTimer;
|
|
28
63
|
/**
|
|
29
64
|
* Start stream transfer
|
|
30
65
|
*/
|
|
31
66
|
start(): Promise<void>;
|
|
32
67
|
/**
|
|
33
|
-
*
|
|
68
|
+
* Push a chunk manually (mode === 'push').
|
|
69
|
+
*/
|
|
70
|
+
write(data: any, done?: boolean): void;
|
|
71
|
+
write(data: any, options: StreamFrameOptions): Promise<boolean>;
|
|
72
|
+
write(data: any, done: boolean | undefined, options: StreamFrameOptions): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* End the stream (mode === 'push').
|
|
34
75
|
*/
|
|
35
|
-
|
|
76
|
+
end(): void;
|
|
36
77
|
/**
|
|
37
|
-
* Generate data from
|
|
78
|
+
* Generate data from iterator
|
|
38
79
|
*/
|
|
39
|
-
private
|
|
80
|
+
private pumpFromGenerator;
|
|
40
81
|
/**
|
|
41
82
|
* Send data chunk
|
|
42
83
|
*/
|
|
43
84
|
private sendData;
|
|
85
|
+
private flush;
|
|
44
86
|
/**
|
|
45
87
|
* Encode data (subclasses can override, e.g., FileStream needs Base64 encoding)
|
|
46
88
|
*/
|
|
@@ -48,11 +90,15 @@ export declare class IframeWritableStream implements IIframeWritableStream {
|
|
|
48
90
|
/**
|
|
49
91
|
* End stream
|
|
50
92
|
*/
|
|
51
|
-
private
|
|
93
|
+
private endInternal;
|
|
52
94
|
/**
|
|
53
95
|
* Send error
|
|
54
96
|
*/
|
|
55
97
|
private error;
|
|
98
|
+
/**
|
|
99
|
+
* Abort stream transfer (is alias of cancel method)
|
|
100
|
+
*/
|
|
101
|
+
abort(reason?: string): void;
|
|
56
102
|
/**
|
|
57
103
|
* Cancel stream transfer
|
|
58
104
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writable-stream.d.ts","sourceRoot":"","sources":["../../src/stream/writable-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"writable-stream.d.ts","sourceRoot":"","sources":["../../src/stream/writable-stream.ts"],"names":[],"mappings":"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"}
|