lemon-model 1.2.3 → 1.4.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/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/socket/decorators.js +266 -0
- package/dist/esm/socket/decorators.js.map +1 -0
- package/dist/esm/socket/index.js +2 -0
- package/dist/esm/socket/index.js.map +1 -1
- package/dist/esm/socket/multi.js +94 -0
- package/dist/esm/socket/multi.js.map +1 -0
- package/dist/esm/socket/socket.js +82 -22
- package/dist/esm/socket/socket.js.map +1 -1
- package/dist/esm/socket/transport.js +385 -3
- package/dist/esm/socket/transport.js.map +1 -1
- package/dist/esm/sync/client.js +166 -0
- package/dist/esm/sync/client.js.map +1 -0
- package/dist/esm/sync/index.js +14 -0
- package/dist/esm/sync/index.js.map +1 -0
- package/dist/esm/sync/machine.js +181 -0
- package/dist/esm/sync/machine.js.map +1 -0
- package/dist/esm/sync/network.js +273 -0
- package/dist/esm/sync/network.js.map +1 -0
- package/dist/esm/sync/testing.js +44 -0
- package/dist/esm/sync/testing.js.map +1 -0
- package/dist/esm/sync/ticker.js +53 -0
- package/dist/esm/sync/ticker.js.map +1 -0
- package/dist/esm/sync/types.js +2 -0
- package/dist/{proxy → esm/sync}/types.js.map +1 -1
- package/dist/esm/upload/engine/engine.js +166 -0
- package/dist/esm/upload/engine/engine.js.map +1 -0
- package/dist/esm/upload/engine/executors.js +57 -0
- package/dist/esm/upload/engine/executors.js.map +1 -0
- package/dist/esm/upload/engine/index.js +13 -0
- package/dist/esm/upload/engine/index.js.map +1 -0
- package/dist/esm/upload/engine/progress.js +52 -0
- package/dist/esm/upload/engine/progress.js.map +1 -0
- package/dist/esm/upload/index.js +11 -0
- package/dist/esm/upload/index.js.map +1 -0
- package/dist/esm/upload/testing.js +73 -0
- package/dist/esm/upload/testing.js.map +1 -0
- package/dist/esm/upload/types.js +69 -0
- package/dist/esm/upload/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/socket/client/index.d.ts +9 -0
- package/dist/socket/client/index.js +26 -0
- package/dist/socket/client/index.js.map +1 -0
- package/dist/socket/client/keep-alive-controller.d.ts +35 -0
- package/dist/socket/client/keep-alive-controller.js +101 -0
- package/dist/socket/client/keep-alive-controller.js.map +1 -0
- package/dist/socket/client/message-router.d.ts +15 -0
- package/dist/socket/client/message-router.js +52 -0
- package/dist/socket/client/message-router.js.map +1 -0
- package/dist/socket/client/pending-request-store.d.ts +24 -0
- package/dist/socket/client/pending-request-store.js +78 -0
- package/dist/socket/client/pending-request-store.js.map +1 -0
- package/dist/socket/client/reconnect-controller.d.ts +56 -0
- package/dist/socket/client/reconnect-controller.js +177 -0
- package/dist/socket/client/reconnect-controller.js.map +1 -0
- package/dist/socket/client/rotation-controller.d.ts +32 -0
- package/dist/socket/client/rotation-controller.js +76 -0
- package/dist/socket/client/rotation-controller.js.map +1 -0
- package/dist/socket/client/shared-timer-scheduler.d.ts +17 -0
- package/dist/socket/client/shared-timer-scheduler.js +77 -0
- package/dist/socket/client/shared-timer-scheduler.js.map +1 -0
- package/dist/socket/client/socket-client.d.ts +2 -0
- package/dist/socket/client/socket-client.js +219 -0
- package/dist/socket/client/socket-client.js.map +1 -0
- package/dist/socket/client/types.d.ts +101 -0
- package/dist/socket/client/types.js +3 -0
- package/dist/socket/client/types.js.map +1 -0
- package/dist/socket/client/websocket-client-transport.d.ts +23 -0
- package/dist/socket/client/websocket-client-transport.js +152 -0
- package/dist/socket/client/websocket-client-transport.js.map +1 -0
- package/dist/socket/decorators.d.ts +38 -0
- package/dist/socket/decorators.js +271 -0
- package/dist/socket/decorators.js.map +1 -0
- package/dist/socket/index.d.ts +2 -0
- package/dist/socket/index.js +2 -0
- package/dist/socket/index.js.map +1 -1
- package/dist/socket/multi.d.ts +33 -0
- package/dist/socket/multi.js +98 -0
- package/dist/socket/multi.js.map +1 -0
- package/dist/socket/socket.d.ts +22 -4
- package/dist/socket/socket.js +82 -22
- package/dist/socket/socket.js.map +1 -1
- package/dist/socket/transport.d.ts +124 -6
- package/dist/socket/transport.js +389 -4
- package/dist/socket/transport.js.map +1 -1
- package/dist/sync/client.d.ts +16 -0
- package/dist/sync/client.js +171 -0
- package/dist/sync/client.js.map +1 -0
- package/dist/sync/index.d.ts +10 -0
- package/dist/sync/index.js +30 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/machine.d.ts +3 -0
- package/dist/sync/machine.js +185 -0
- package/dist/sync/machine.js.map +1 -0
- package/dist/sync/network.d.ts +38 -0
- package/dist/sync/network.js +278 -0
- package/dist/sync/network.js.map +1 -0
- package/dist/sync/testing.d.ts +38 -0
- package/dist/sync/testing.js +48 -0
- package/dist/sync/testing.js.map +1 -0
- package/dist/sync/ticker.d.ts +21 -0
- package/dist/sync/ticker.js +57 -0
- package/dist/sync/ticker.js.map +1 -0
- package/dist/sync/types.d.ts +115 -0
- package/dist/sync/types.js +3 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/upload/engine/engine.d.ts +52 -0
- package/dist/upload/engine/engine.js +172 -0
- package/dist/upload/engine/engine.js.map +1 -0
- package/dist/upload/engine/executors.d.ts +44 -0
- package/dist/upload/engine/executors.js +62 -0
- package/dist/upload/engine/executors.js.map +1 -0
- package/dist/upload/engine/index.d.ts +12 -0
- package/dist/upload/engine/index.js +29 -0
- package/dist/upload/engine/index.js.map +1 -0
- package/dist/upload/engine/progress.d.ts +48 -0
- package/dist/upload/engine/progress.js +57 -0
- package/dist/upload/engine/progress.js.map +1 -0
- package/dist/upload/index.d.ts +10 -0
- package/dist/{proxy → upload}/index.js +6 -8
- package/dist/upload/index.js.map +1 -0
- package/dist/upload/testing.d.ts +21 -0
- package/dist/upload/testing.js +76 -0
- package/dist/upload/testing.js.map +1 -0
- package/dist/upload/types.d.ts +230 -0
- package/dist/upload/types.js +74 -0
- package/dist/upload/types.js.map +1 -0
- package/package.json +26 -1
- package/dist/proxy/index.d.ts +0 -12
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/proxy.d.ts +0 -75
- package/dist/proxy/proxy.js +0 -198
- package/dist/proxy/proxy.js.map +0 -1
- package/dist/proxy/transport.d.ts +0 -123
- package/dist/proxy/transport.js +0 -401
- package/dist/proxy/transport.js.map +0 -1
- package/dist/proxy/types.d.ts +0 -89
- package/dist/proxy/types.js +0 -12
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTranslatedNetwork = exports.createReconnectingNetwork = void 0;
|
|
4
|
+
const websocket_1 = require("./websocket");
|
|
5
|
+
/**
|
|
6
|
+
* default watchdog cadence for readyState-based death detection.
|
|
7
|
+
* needed because an in-memory `Network.close()` notifies no one (see `socket/socket.ts`); only a
|
|
8
|
+
* real `OwnedWebSocketNetwork`/`BrowserWebSocketNetwork` close notifies via `onError` (see below),
|
|
9
|
+
* so the watchdog is a fallback and can stay slow — 1s keeps idle browser cost negligible.
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_WATCHDOG_MS = 1000;
|
|
12
|
+
/** create the L1 reconnect decorator: swaps the internal network on death, keeping instance identity for L3 */
|
|
13
|
+
const createReconnectingNetwork = (factory, options) => new ReconnectingNetwork(factory, options);
|
|
14
|
+
exports.createReconnectingNetwork = createReconnectingNetwork;
|
|
15
|
+
/** `NetworkSupportable` decorator that transparently swaps its internal network on death */
|
|
16
|
+
class ReconnectingNetwork {
|
|
17
|
+
constructor(factory, options) {
|
|
18
|
+
var _a, _b, _c, _d;
|
|
19
|
+
this.factory = factory;
|
|
20
|
+
this._generation = 0;
|
|
21
|
+
/** connected: 정상 감시 | connecting: 후보 open 대기 | backoff: 재시도 대기 | closed: 영구 종료 */
|
|
22
|
+
this.phase = 'connected';
|
|
23
|
+
this.retryCount = 0;
|
|
24
|
+
this.lastMessageAt = Date.now();
|
|
25
|
+
this.messageHandlers = new Set();
|
|
26
|
+
this.errorHandlers = new Set();
|
|
27
|
+
this.reconnectHandlers = new Set();
|
|
28
|
+
this.baseMs = (_a = options === null || options === void 0 ? void 0 : options.baseMs) !== null && _a !== void 0 ? _a : 1000;
|
|
29
|
+
this.factor = (_b = options === null || options === void 0 ? void 0 : options.factor) !== null && _b !== void 0 ? _b : 2;
|
|
30
|
+
this.maxMs = (_c = options === null || options === void 0 ? void 0 : options.maxMs) !== null && _c !== void 0 ? _c : 30000;
|
|
31
|
+
this.maxRetries = options === null || options === void 0 ? void 0 : options.maxRetries;
|
|
32
|
+
this.idleTimeoutMs = options === null || options === void 0 ? void 0 : options.idleTimeoutMs;
|
|
33
|
+
this.delayMs = this.baseMs;
|
|
34
|
+
this.current = factory();
|
|
35
|
+
this.attach(this.current);
|
|
36
|
+
this.watchdogTimer = setInterval(() => this.watch(), (_d = options === null || options === void 0 ? void 0 : options.watchdogMs) !== null && _d !== void 0 ? _d : DEFAULT_WATCHDOG_MS);
|
|
37
|
+
}
|
|
38
|
+
/** internal network generation (0 initially, +1 per reconnect) */
|
|
39
|
+
get generation() {
|
|
40
|
+
return this._generation;
|
|
41
|
+
}
|
|
42
|
+
get readyState() {
|
|
43
|
+
return this.phase === 'closed' ? 'closed' : this.current.readyState;
|
|
44
|
+
}
|
|
45
|
+
ready() {
|
|
46
|
+
var _a, _b, _c;
|
|
47
|
+
return (_c = (_b = (_a = this.current).ready) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : Promise.resolve();
|
|
48
|
+
}
|
|
49
|
+
onOpen(handler) {
|
|
50
|
+
var _a, _b, _c;
|
|
51
|
+
return (_c = (_b = (_a = this.current).onOpen) === null || _b === void 0 ? void 0 : _b.call(_a, handler)) !== null && _c !== void 0 ? _c : (() => undefined);
|
|
52
|
+
}
|
|
53
|
+
/** while disconnected (mid-reconnect or permanently closed) this throws synchronously; no send queuing */
|
|
54
|
+
send(data) {
|
|
55
|
+
if (this.phase === 'closed')
|
|
56
|
+
throw new Error(`@network is closed - reconnectingNetwork.send`);
|
|
57
|
+
if (this.current.readyState !== 'open') {
|
|
58
|
+
throw new Error(`@network is not connected - reconnectingNetwork.send`);
|
|
59
|
+
}
|
|
60
|
+
this.current.send(data);
|
|
61
|
+
}
|
|
62
|
+
onMessage(handler) {
|
|
63
|
+
this.messageHandlers.add(handler);
|
|
64
|
+
return () => this.messageHandlers.delete(handler);
|
|
65
|
+
}
|
|
66
|
+
onError(handler) {
|
|
67
|
+
this.errorHandlers.add(handler);
|
|
68
|
+
return () => this.errorHandlers.delete(handler);
|
|
69
|
+
}
|
|
70
|
+
onReconnect(handler) {
|
|
71
|
+
this.reconnectHandlers.add(handler);
|
|
72
|
+
return () => this.reconnectHandlers.delete(handler);
|
|
73
|
+
}
|
|
74
|
+
/** options are remembered and re-applied to every reconnected generation */
|
|
75
|
+
configure(options) {
|
|
76
|
+
var _a, _b;
|
|
77
|
+
this.configured = Object.assign(Object.assign({}, this.configured), options);
|
|
78
|
+
(_b = (_a = this.current).configure) === null || _b === void 0 ? void 0 : _b.call(_a, this.configured);
|
|
79
|
+
}
|
|
80
|
+
/** stop reconnecting and close the internal network for good */
|
|
81
|
+
close(code, reason) {
|
|
82
|
+
if (this.phase === 'closed')
|
|
83
|
+
return;
|
|
84
|
+
this.phase = 'closed';
|
|
85
|
+
clearInterval(this.watchdogTimer);
|
|
86
|
+
if (this.reconnectTimer)
|
|
87
|
+
clearTimeout(this.reconnectTimer);
|
|
88
|
+
this.detach();
|
|
89
|
+
this.current.close(code, reason);
|
|
90
|
+
this.messageHandlers.clear();
|
|
91
|
+
this.errorHandlers.clear();
|
|
92
|
+
this.reconnectHandlers.clear();
|
|
93
|
+
}
|
|
94
|
+
attach(network) {
|
|
95
|
+
this.unsubscribeMessage = network.onMessage(raw => {
|
|
96
|
+
this.lastMessageAt = Date.now();
|
|
97
|
+
for (const handler of [...this.messageHandlers])
|
|
98
|
+
handler(raw);
|
|
99
|
+
});
|
|
100
|
+
this.unsubscribeError = network.onError((error, context) => {
|
|
101
|
+
for (const handler of [...this.errorHandlers])
|
|
102
|
+
handler(error, Object.assign(Object.assign({}, context), { network: this }));
|
|
103
|
+
//! `OwnedWebSocketNetwork`/`BrowserWebSocketNetwork` notify a close via onError with this scope
|
|
104
|
+
//! (see `WEBSOCKET_NETWORK_SCOPE` in `socket/websocket.ts`). other onError calls (e.g. delivery
|
|
105
|
+
//! errors) are forwarded above but do not by themselves mean the network died.
|
|
106
|
+
if (context.scope === websocket_1.WEBSOCKET_NETWORK_SCOPE.ownedClose ||
|
|
107
|
+
context.scope === websocket_1.WEBSOCKET_NETWORK_SCOPE.browserClose) {
|
|
108
|
+
this.onInnerDeath();
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
detach() {
|
|
113
|
+
var _a, _b, _c;
|
|
114
|
+
(_a = this.unsubscribeMessage) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
115
|
+
(_b = this.unsubscribeError) === null || _b === void 0 ? void 0 : _b.call(this);
|
|
116
|
+
(_c = this.unsubscribeCandidateOpen) === null || _c === void 0 ? void 0 : _c.call(this);
|
|
117
|
+
}
|
|
118
|
+
onInnerDeath() {
|
|
119
|
+
if (this.phase === 'connected')
|
|
120
|
+
this.beginBackoff();
|
|
121
|
+
else if (this.phase === 'connecting')
|
|
122
|
+
this.failAttempt(new Error(`@candidate network died before open - reconnectingNetwork`), 'reconnectingNetwork.connect');
|
|
123
|
+
}
|
|
124
|
+
/** watchdog fallback for networks that close without notifying (e.g. in-memory `Network.close()`) */
|
|
125
|
+
watch() {
|
|
126
|
+
const state = this.current.readyState;
|
|
127
|
+
if (this.phase === 'connected') {
|
|
128
|
+
if (state === 'closing' || state === 'closed')
|
|
129
|
+
return this.beginBackoff();
|
|
130
|
+
if (this.idleTimeoutMs && Date.now() - this.lastMessageAt > this.idleTimeoutMs)
|
|
131
|
+
this.beginBackoff();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (this.phase === 'connecting') {
|
|
135
|
+
if (state === 'open')
|
|
136
|
+
return this.settleReconnected(); // onOpen 없는 network용 fallback
|
|
137
|
+
if (state === 'closing' || state === 'closed')
|
|
138
|
+
this.onInnerDeath();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
beginBackoff() {
|
|
142
|
+
this.detach();
|
|
143
|
+
this.phase = 'backoff';
|
|
144
|
+
this.reconnectTimer = setTimeout(() => this.attemptReconnect(), this.delayMs);
|
|
145
|
+
}
|
|
146
|
+
attemptReconnect() {
|
|
147
|
+
var _a, _b;
|
|
148
|
+
if (this.phase === 'closed')
|
|
149
|
+
return;
|
|
150
|
+
if (this.maxRetries != null && this.retryCount >= this.maxRetries) {
|
|
151
|
+
this.phase = 'closed';
|
|
152
|
+
clearInterval(this.watchdogTimer);
|
|
153
|
+
const error = new Error(`@network exceeded maxRetries[${this.maxRetries}] - reconnectingNetwork`);
|
|
154
|
+
for (const handler of [...this.errorHandlers])
|
|
155
|
+
handler(error, { scope: 'reconnectingNetwork.maxRetries', network: this });
|
|
156
|
+
this.messageHandlers.clear();
|
|
157
|
+
this.errorHandlers.clear();
|
|
158
|
+
this.reconnectHandlers.clear();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
let next;
|
|
162
|
+
try {
|
|
163
|
+
next = this.factory();
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
this.failAttempt(e, 'reconnectingNetwork.factory');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this.current = next;
|
|
170
|
+
this.attach(next);
|
|
171
|
+
if (this.configured)
|
|
172
|
+
(_a = next.configure) === null || _a === void 0 ? void 0 : _a.call(next, this.configured);
|
|
173
|
+
this.phase = 'connecting';
|
|
174
|
+
//! success is declared only once the candidate actually OPENS. a factory return alone is not a
|
|
175
|
+
//! connection (a real WebSocket constructs fine while the server is down), so resetting backoff
|
|
176
|
+
//! here would degrade to a constant-rate reconnect storm with an onReconnect/tick per attempt.
|
|
177
|
+
const state = next.readyState;
|
|
178
|
+
if (state === 'open')
|
|
179
|
+
return this.settleReconnected();
|
|
180
|
+
if (state === 'closing' || state === 'closed')
|
|
181
|
+
return this.onInnerDeath();
|
|
182
|
+
this.unsubscribeCandidateOpen = (_b = next.onOpen) === null || _b === void 0 ? void 0 : _b.call(next, () => {
|
|
183
|
+
if (this.phase === 'connecting' && this.current === next)
|
|
184
|
+
this.settleReconnected();
|
|
185
|
+
});
|
|
186
|
+
//! a candidate stuck in 'connecting' is bounded by the inner network's own connect timeout
|
|
187
|
+
//! (e.g. `OwnedWebSocketNetwork.connectTimeoutMs`), which actual-closes and lands in onInnerDeath.
|
|
188
|
+
}
|
|
189
|
+
/** a reconnect attempt failed (factory throw, or candidate died before open): keep growing the backoff */
|
|
190
|
+
failAttempt(error, scope) {
|
|
191
|
+
this.detach();
|
|
192
|
+
this.retryCount++;
|
|
193
|
+
this.delayMs = Math.min(this.delayMs * this.factor, this.maxMs);
|
|
194
|
+
for (const handler of [...this.errorHandlers])
|
|
195
|
+
handler(error, { scope, network: this });
|
|
196
|
+
this.phase = 'backoff';
|
|
197
|
+
this.reconnectTimer = setTimeout(() => this.attemptReconnect(), this.delayMs);
|
|
198
|
+
}
|
|
199
|
+
/** the candidate opened: only now reset the backoff/retry budget and notify onReconnect */
|
|
200
|
+
settleReconnected() {
|
|
201
|
+
var _a;
|
|
202
|
+
(_a = this.unsubscribeCandidateOpen) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
203
|
+
this.unsubscribeCandidateOpen = undefined;
|
|
204
|
+
this.phase = 'connected';
|
|
205
|
+
this._generation++;
|
|
206
|
+
this.retryCount = 0;
|
|
207
|
+
this.delayMs = this.baseMs;
|
|
208
|
+
this.lastMessageAt = Date.now();
|
|
209
|
+
for (const handler of [...this.reconnectHandlers])
|
|
210
|
+
handler();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/** create the L1 wire translator decorator over a raw string, same slot as `createFilteredNetwork` */
|
|
214
|
+
const createTranslatedNetwork = (source, translator) => new TranslatedNetwork(source, translator);
|
|
215
|
+
exports.createTranslatedNetwork = createTranslatedNetwork;
|
|
216
|
+
/** `NetworkSupportable` decorator that translates raw strings at the wire boundary */
|
|
217
|
+
class TranslatedNetwork {
|
|
218
|
+
constructor(source, translator) {
|
|
219
|
+
this.source = source;
|
|
220
|
+
this.translator = translator;
|
|
221
|
+
this.errorHandlers = new Set();
|
|
222
|
+
this.unsubscribeSourceError = source.onError((error, context) => this.emitError(error, context));
|
|
223
|
+
}
|
|
224
|
+
get readyState() {
|
|
225
|
+
return this.source.readyState;
|
|
226
|
+
}
|
|
227
|
+
ready() {
|
|
228
|
+
var _a, _b, _c;
|
|
229
|
+
return (_c = (_b = (_a = this.source).ready) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : Promise.resolve();
|
|
230
|
+
}
|
|
231
|
+
onOpen(handler) {
|
|
232
|
+
var _a, _b, _c;
|
|
233
|
+
return (_c = (_b = (_a = this.source).onOpen) === null || _b === void 0 ? void 0 : _b.call(_a, handler)) !== null && _c !== void 0 ? _c : (() => undefined);
|
|
234
|
+
}
|
|
235
|
+
send(data) {
|
|
236
|
+
this.source.send(this.translator.outbound ? this.translator.outbound(data) : data);
|
|
237
|
+
}
|
|
238
|
+
onMessage(handler) {
|
|
239
|
+
return this.source.onMessage(raw => {
|
|
240
|
+
let translated;
|
|
241
|
+
try {
|
|
242
|
+
translated = this.translator.inbound ? this.translator.inbound(raw) : raw;
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
this.emitError(e, { scope: 'translatedNetwork.inbound' });
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (translated === undefined)
|
|
249
|
+
return; // dropped by translator
|
|
250
|
+
handler(translated);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
configure(options) {
|
|
254
|
+
var _a, _b;
|
|
255
|
+
(_b = (_a = this.source).configure) === null || _b === void 0 ? void 0 : _b.call(_a, options);
|
|
256
|
+
}
|
|
257
|
+
onError(handler) {
|
|
258
|
+
this.errorHandlers.add(handler);
|
|
259
|
+
return () => this.errorHandlers.delete(handler);
|
|
260
|
+
}
|
|
261
|
+
close(code, reason) {
|
|
262
|
+
this.unsubscribeSourceError();
|
|
263
|
+
this.errorHandlers.clear();
|
|
264
|
+
this.source.close(code, reason);
|
|
265
|
+
}
|
|
266
|
+
emitError(error, context) {
|
|
267
|
+
for (const handler of [...this.errorHandlers])
|
|
268
|
+
handler(error, Object.assign(Object.assign({}, context), { network: this }));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/socket/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/socket/index.d.ts
CHANGED
package/dist/socket/index.js
CHANGED
|
@@ -23,6 +23,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
23
23
|
__exportStar(require("./types"), exports);
|
|
24
24
|
__exportStar(require("./transport"), exports);
|
|
25
25
|
__exportStar(require("./websocket"), exports);
|
|
26
|
+
__exportStar(require("./decorators"), exports);
|
|
27
|
+
__exportStar(require("./multi"), exports);
|
|
26
28
|
//! NOTE: the in-memory peer simulator (`./socket`) is intentionally NOT re-exported here.
|
|
27
29
|
//! It is a test/dev utility — import it via the isolated `lemon-model/socket/testing` entry
|
|
28
30
|
//! so production (esp. frontend) bundles do not pull in the simulator runtime.
|
package/dist/socket/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/socket/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/socket/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAC5B,+CAA6B;AAC7B,0CAAwB;AAExB,0FAA0F;AAC1F,4FAA4F;AAC5F,+EAA+E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `socket/multi.ts`
|
|
3
|
+
* - `NetworkSupportable` composite that pairs N (>=2) networks — a main plus one or more backups.
|
|
4
|
+
* - `send`/`onMessage`/etc follow the main (index 0); `sendAll` is the only multi-transport extension call.
|
|
5
|
+
*
|
|
6
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
7
|
+
*/
|
|
8
|
+
import { NetworkSupportable, SocketErrorContext } from './types';
|
|
9
|
+
/** `scope` values `MultiSocketNetwork` puts on `SocketErrorContext` */
|
|
10
|
+
export declare const MULTI_NETWORK_SCOPE: {
|
|
11
|
+
readonly send: "network.multi.send";
|
|
12
|
+
};
|
|
13
|
+
/** `SocketErrorContext` extended with the origin socket index (0 = main); `types.ts` stays untouched */
|
|
14
|
+
export interface MultiSocketErrorContext extends SocketErrorContext {
|
|
15
|
+
/** which socket the error originated from; 0 is the main socket */
|
|
16
|
+
index: number;
|
|
17
|
+
}
|
|
18
|
+
/** `NetworkSupportable` plus the multi-transport extension call */
|
|
19
|
+
export interface MultiNetworkSupportable extends NetworkSupportable {
|
|
20
|
+
/** send the same raw string to every socket; never throws, failures surface via onError */
|
|
21
|
+
sendAll(data: string): void;
|
|
22
|
+
}
|
|
23
|
+
/** per-index network factory for the `{ count, networkFactory }` convenience overload */
|
|
24
|
+
export interface MultiSocketNetworkFactory {
|
|
25
|
+
(index: number): NetworkSupportable;
|
|
26
|
+
}
|
|
27
|
+
/** create a `NetworkSupportable` composite over an array of networks (>=2) */
|
|
28
|
+
export declare function createMultiSocketNetwork(networks: NetworkSupportable[]): MultiNetworkSupportable;
|
|
29
|
+
/** create a `NetworkSupportable` composite by calling `networkFactory` `count` times (>=2) */
|
|
30
|
+
export declare function createMultiSocketNetwork(options: {
|
|
31
|
+
count: number;
|
|
32
|
+
networkFactory: MultiSocketNetworkFactory;
|
|
33
|
+
}): MultiNetworkSupportable;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMultiSocketNetwork = exports.MULTI_NETWORK_SCOPE = void 0;
|
|
4
|
+
/** `scope` values `MultiSocketNetwork` puts on `SocketErrorContext` */
|
|
5
|
+
exports.MULTI_NETWORK_SCOPE = {
|
|
6
|
+
send: 'network.multi.send',
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* `NetworkSupportable` composite over N (>=2) sockets.
|
|
10
|
+
*
|
|
11
|
+
* `send`/`readyState`/`ready`/`onOpen` delegate to the main socket (index 0) only (01 no-breakage).
|
|
12
|
+
* `sendAll` is the only member that touches every socket; failures never throw and are only
|
|
13
|
+
* observable via `onError`.
|
|
14
|
+
*/
|
|
15
|
+
class MultiSocketNetwork {
|
|
16
|
+
constructor(networks) {
|
|
17
|
+
this.networks = networks;
|
|
18
|
+
/** array (not Set) so a handler subscribed twice fires twice, matching the underlying delegation path */
|
|
19
|
+
this.errorHandlers = [];
|
|
20
|
+
}
|
|
21
|
+
get readyState() {
|
|
22
|
+
return this.networks[0].readyState;
|
|
23
|
+
}
|
|
24
|
+
ready() {
|
|
25
|
+
var _a, _b, _c;
|
|
26
|
+
return (_c = (_b = (_a = this.networks[0]).ready) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : Promise.resolve();
|
|
27
|
+
}
|
|
28
|
+
onOpen(handler) {
|
|
29
|
+
var _a, _b, _c;
|
|
30
|
+
return (_c = (_b = (_a = this.networks[0]).onOpen) === null || _b === void 0 ? void 0 : _b.call(_a, handler)) !== null && _c !== void 0 ? _c : (() => undefined);
|
|
31
|
+
}
|
|
32
|
+
send(data) {
|
|
33
|
+
this.networks[0].send(data);
|
|
34
|
+
}
|
|
35
|
+
/** send to every socket independently; each failure is caught and re-emitted with index, never thrown */
|
|
36
|
+
sendAll(data) {
|
|
37
|
+
this.networks.forEach((network, index) => this.trySend(network, data, index));
|
|
38
|
+
}
|
|
39
|
+
onMessage(handler) {
|
|
40
|
+
const unsubscribes = this.networks.map(network => network.onMessage(handler));
|
|
41
|
+
return () => unsubscribes.forEach(unsubscribe => unsubscribe());
|
|
42
|
+
}
|
|
43
|
+
onError(handler) {
|
|
44
|
+
const unsubscribes = this.networks.map((network, index) => network.onError((error, context) => {
|
|
45
|
+
const tagged = Object.assign(Object.assign({}, context), { network: this, index });
|
|
46
|
+
handler(error, tagged);
|
|
47
|
+
}));
|
|
48
|
+
this.errorHandlers.push(handler);
|
|
49
|
+
return () => {
|
|
50
|
+
unsubscribes.forEach(unsubscribe => unsubscribe());
|
|
51
|
+
const index = this.errorHandlers.indexOf(handler);
|
|
52
|
+
if (index >= 0)
|
|
53
|
+
this.errorHandlers.splice(index, 1);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
configure(options) {
|
|
57
|
+
this.networks.forEach(network => { var _a; return (_a = network.configure) === null || _a === void 0 ? void 0 : _a.call(network, options); });
|
|
58
|
+
}
|
|
59
|
+
/** close every socket independently (idempotent); onError subscriptions stay alive so post-close sendAll failures are still observable */
|
|
60
|
+
close(code, reason) {
|
|
61
|
+
this.networks.forEach(network => {
|
|
62
|
+
try {
|
|
63
|
+
network.close(code, reason);
|
|
64
|
+
}
|
|
65
|
+
catch (_a) {
|
|
66
|
+
// ignore; the other sockets must still be closed
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
trySend(network, data, index) {
|
|
71
|
+
try {
|
|
72
|
+
network.send(data);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
const context = { scope: exports.MULTI_NETWORK_SCOPE.send, network: this, index };
|
|
76
|
+
for (const handler of [...this.errorHandlers]) {
|
|
77
|
+
try {
|
|
78
|
+
handler(e, context);
|
|
79
|
+
}
|
|
80
|
+
catch (_a) {
|
|
81
|
+
// sendAll() must never throw; a throwing consumer handler cannot break the other sockets' send
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function createMultiSocketNetwork(input) {
|
|
88
|
+
const count = Array.isArray(input) ? input.length : input.count;
|
|
89
|
+
if (count < 2) {
|
|
90
|
+
throw new Error(`@networks (2+) is required - createMultiSocketNetwork(${count})`);
|
|
91
|
+
}
|
|
92
|
+
const networks = Array.isArray(input)
|
|
93
|
+
? input
|
|
94
|
+
: Array.from({ length: count }, (_, index) => input.networkFactory(index));
|
|
95
|
+
return new MultiSocketNetwork(networks);
|
|
96
|
+
}
|
|
97
|
+
exports.createMultiSocketNetwork = createMultiSocketNetwork;
|
|
98
|
+
//# sourceMappingURL=multi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi.js","sourceRoot":"","sources":["../../src/socket/multi.ts"],"names":[],"mappings":"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"}
|
package/dist/socket/socket.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
6
6
|
*/
|
|
7
7
|
import { NetworkMessageHandler, NetworkSupportable, PeerMessageHandler, PeerSupportable, PeerTargetOptions, SocketErrorHandler, SocketLogger, SocketNetworkOptions, SocketMessage, SocketReadyState, SocketUnsubscribe } from './types';
|
|
8
|
-
import { JSONTransportOptions } from './transport';
|
|
8
|
+
import { JSONTransportOptions, ReliableOptions } from './transport';
|
|
9
9
|
/** options for simulated peers */
|
|
10
10
|
export interface PeerOptions extends SocketNetworkOptions {
|
|
11
11
|
/** peer id */
|
|
@@ -16,8 +16,21 @@ export interface PeerOptions extends SocketNetworkOptions {
|
|
|
16
16
|
networkFactory?: PeerNetworkFactory;
|
|
17
17
|
/** structured logger for peer lifecycle and delivery events */
|
|
18
18
|
logger?: SocketLogger;
|
|
19
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* enable JSON transport chunking for peer message envelopes sent by this peer.
|
|
21
|
+
* for `jsonTransport.reliable`, both the sending and receiving peer must opt in — an
|
|
22
|
+
* asymmetric setup surfaces as `json.reliable.mismatch` on the non-reliable side.
|
|
23
|
+
* onError pattern: `error instanceof JSONTransportReliableError` gives access to `error.tid`.
|
|
24
|
+
*/
|
|
20
25
|
jsonTransport?: boolean | JSONTransportOptions;
|
|
26
|
+
/**
|
|
27
|
+
* shortcut for `jsonTransport: { reliable: true }` — the recommended entry point for reliable
|
|
28
|
+
* delivery, equivalent to setting `reliable` on `jsonTransport` directly. truthy activates JSON
|
|
29
|
+
* transport chunking even when `jsonTransport` is otherwise unset. an explicit `jsonTransport.reliable`
|
|
30
|
+
* takes precedence over this shortcut when both are set. both the sending and receiving peer must
|
|
31
|
+
* opt in — an asymmetric setup surfaces as `json.reliable.mismatch` on the non-reliable side.
|
|
32
|
+
*/
|
|
33
|
+
reliable?: boolean | ReliableOptions;
|
|
21
34
|
}
|
|
22
35
|
/** network creation context independent from peer instances. */
|
|
23
36
|
export interface PeerNetworkFactoryContext {
|
|
@@ -148,11 +161,16 @@ export declare class Peer<SendData = any, MessageData = any> implements PeerSupp
|
|
|
148
161
|
/** close this peer */
|
|
149
162
|
close(): void;
|
|
150
163
|
private accept;
|
|
151
|
-
private
|
|
164
|
+
private attachClientTransport;
|
|
152
165
|
private detachClient;
|
|
153
166
|
private closeLink;
|
|
154
167
|
private static reconnectPair;
|
|
155
|
-
|
|
168
|
+
/**
|
|
169
|
+
* reliable-on locals merge write+read networks into one instance (Peer 통합 절):
|
|
170
|
+
* writeNetwork carries send()+ack/nack/error, receiveNetwork(=readNetwork) carries the onMessage subscription.
|
|
171
|
+
* off (remoteTransportOptions only, or neither) keeps the existing receiver-only/raw paths untouched.
|
|
172
|
+
*/
|
|
173
|
+
private static attachTransport;
|
|
156
174
|
private createPeerNetwork;
|
|
157
175
|
private static createNetworkPair;
|
|
158
176
|
private publish;
|