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.
Files changed (141) hide show
  1. package/dist/esm/index.js +1 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/socket/decorators.js +266 -0
  4. package/dist/esm/socket/decorators.js.map +1 -0
  5. package/dist/esm/socket/index.js +2 -0
  6. package/dist/esm/socket/index.js.map +1 -1
  7. package/dist/esm/socket/multi.js +94 -0
  8. package/dist/esm/socket/multi.js.map +1 -0
  9. package/dist/esm/socket/socket.js +82 -22
  10. package/dist/esm/socket/socket.js.map +1 -1
  11. package/dist/esm/socket/transport.js +385 -3
  12. package/dist/esm/socket/transport.js.map +1 -1
  13. package/dist/esm/sync/client.js +166 -0
  14. package/dist/esm/sync/client.js.map +1 -0
  15. package/dist/esm/sync/index.js +14 -0
  16. package/dist/esm/sync/index.js.map +1 -0
  17. package/dist/esm/sync/machine.js +181 -0
  18. package/dist/esm/sync/machine.js.map +1 -0
  19. package/dist/esm/sync/network.js +273 -0
  20. package/dist/esm/sync/network.js.map +1 -0
  21. package/dist/esm/sync/testing.js +44 -0
  22. package/dist/esm/sync/testing.js.map +1 -0
  23. package/dist/esm/sync/ticker.js +53 -0
  24. package/dist/esm/sync/ticker.js.map +1 -0
  25. package/dist/esm/sync/types.js +2 -0
  26. package/dist/{proxy → esm/sync}/types.js.map +1 -1
  27. package/dist/esm/upload/engine/engine.js +166 -0
  28. package/dist/esm/upload/engine/engine.js.map +1 -0
  29. package/dist/esm/upload/engine/executors.js +57 -0
  30. package/dist/esm/upload/engine/executors.js.map +1 -0
  31. package/dist/esm/upload/engine/index.js +13 -0
  32. package/dist/esm/upload/engine/index.js.map +1 -0
  33. package/dist/esm/upload/engine/progress.js +52 -0
  34. package/dist/esm/upload/engine/progress.js.map +1 -0
  35. package/dist/esm/upload/index.js +11 -0
  36. package/dist/esm/upload/index.js.map +1 -0
  37. package/dist/esm/upload/testing.js +73 -0
  38. package/dist/esm/upload/testing.js.map +1 -0
  39. package/dist/esm/upload/types.js +69 -0
  40. package/dist/esm/upload/types.js.map +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +1 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/socket/client/index.d.ts +9 -0
  45. package/dist/socket/client/index.js +26 -0
  46. package/dist/socket/client/index.js.map +1 -0
  47. package/dist/socket/client/keep-alive-controller.d.ts +35 -0
  48. package/dist/socket/client/keep-alive-controller.js +101 -0
  49. package/dist/socket/client/keep-alive-controller.js.map +1 -0
  50. package/dist/socket/client/message-router.d.ts +15 -0
  51. package/dist/socket/client/message-router.js +52 -0
  52. package/dist/socket/client/message-router.js.map +1 -0
  53. package/dist/socket/client/pending-request-store.d.ts +24 -0
  54. package/dist/socket/client/pending-request-store.js +78 -0
  55. package/dist/socket/client/pending-request-store.js.map +1 -0
  56. package/dist/socket/client/reconnect-controller.d.ts +56 -0
  57. package/dist/socket/client/reconnect-controller.js +177 -0
  58. package/dist/socket/client/reconnect-controller.js.map +1 -0
  59. package/dist/socket/client/rotation-controller.d.ts +32 -0
  60. package/dist/socket/client/rotation-controller.js +76 -0
  61. package/dist/socket/client/rotation-controller.js.map +1 -0
  62. package/dist/socket/client/shared-timer-scheduler.d.ts +17 -0
  63. package/dist/socket/client/shared-timer-scheduler.js +77 -0
  64. package/dist/socket/client/shared-timer-scheduler.js.map +1 -0
  65. package/dist/socket/client/socket-client.d.ts +2 -0
  66. package/dist/socket/client/socket-client.js +219 -0
  67. package/dist/socket/client/socket-client.js.map +1 -0
  68. package/dist/socket/client/types.d.ts +101 -0
  69. package/dist/socket/client/types.js +3 -0
  70. package/dist/socket/client/types.js.map +1 -0
  71. package/dist/socket/client/websocket-client-transport.d.ts +23 -0
  72. package/dist/socket/client/websocket-client-transport.js +152 -0
  73. package/dist/socket/client/websocket-client-transport.js.map +1 -0
  74. package/dist/socket/decorators.d.ts +38 -0
  75. package/dist/socket/decorators.js +271 -0
  76. package/dist/socket/decorators.js.map +1 -0
  77. package/dist/socket/index.d.ts +2 -0
  78. package/dist/socket/index.js +2 -0
  79. package/dist/socket/index.js.map +1 -1
  80. package/dist/socket/multi.d.ts +33 -0
  81. package/dist/socket/multi.js +98 -0
  82. package/dist/socket/multi.js.map +1 -0
  83. package/dist/socket/socket.d.ts +22 -4
  84. package/dist/socket/socket.js +82 -22
  85. package/dist/socket/socket.js.map +1 -1
  86. package/dist/socket/transport.d.ts +124 -6
  87. package/dist/socket/transport.js +389 -4
  88. package/dist/socket/transport.js.map +1 -1
  89. package/dist/sync/client.d.ts +16 -0
  90. package/dist/sync/client.js +171 -0
  91. package/dist/sync/client.js.map +1 -0
  92. package/dist/sync/index.d.ts +10 -0
  93. package/dist/sync/index.js +30 -0
  94. package/dist/sync/index.js.map +1 -0
  95. package/dist/sync/machine.d.ts +3 -0
  96. package/dist/sync/machine.js +185 -0
  97. package/dist/sync/machine.js.map +1 -0
  98. package/dist/sync/network.d.ts +38 -0
  99. package/dist/sync/network.js +278 -0
  100. package/dist/sync/network.js.map +1 -0
  101. package/dist/sync/testing.d.ts +38 -0
  102. package/dist/sync/testing.js +48 -0
  103. package/dist/sync/testing.js.map +1 -0
  104. package/dist/sync/ticker.d.ts +21 -0
  105. package/dist/sync/ticker.js +57 -0
  106. package/dist/sync/ticker.js.map +1 -0
  107. package/dist/sync/types.d.ts +115 -0
  108. package/dist/sync/types.js +3 -0
  109. package/dist/sync/types.js.map +1 -0
  110. package/dist/upload/engine/engine.d.ts +52 -0
  111. package/dist/upload/engine/engine.js +172 -0
  112. package/dist/upload/engine/engine.js.map +1 -0
  113. package/dist/upload/engine/executors.d.ts +44 -0
  114. package/dist/upload/engine/executors.js +62 -0
  115. package/dist/upload/engine/executors.js.map +1 -0
  116. package/dist/upload/engine/index.d.ts +12 -0
  117. package/dist/upload/engine/index.js +29 -0
  118. package/dist/upload/engine/index.js.map +1 -0
  119. package/dist/upload/engine/progress.d.ts +48 -0
  120. package/dist/upload/engine/progress.js +57 -0
  121. package/dist/upload/engine/progress.js.map +1 -0
  122. package/dist/upload/index.d.ts +10 -0
  123. package/dist/{proxy → upload}/index.js +6 -8
  124. package/dist/upload/index.js.map +1 -0
  125. package/dist/upload/testing.d.ts +21 -0
  126. package/dist/upload/testing.js +76 -0
  127. package/dist/upload/testing.js.map +1 -0
  128. package/dist/upload/types.d.ts +230 -0
  129. package/dist/upload/types.js +74 -0
  130. package/dist/upload/types.js.map +1 -0
  131. package/package.json +26 -1
  132. package/dist/proxy/index.d.ts +0 -12
  133. package/dist/proxy/index.js.map +0 -1
  134. package/dist/proxy/proxy.d.ts +0 -75
  135. package/dist/proxy/proxy.js +0 -198
  136. package/dist/proxy/proxy.js.map +0 -1
  137. package/dist/proxy/transport.d.ts +0 -123
  138. package/dist/proxy/transport.js +0 -401
  139. package/dist/proxy/transport.js.map +0 -1
  140. package/dist/proxy/types.d.ts +0 -89
  141. package/dist/proxy/types.js +0 -12
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createSocketClientCore = void 0;
13
+ const message_router_1 = require("./message-router");
14
+ const pending_request_store_1 = require("./pending-request-store");
15
+ const shared_timer_scheduler_1 = require("./shared-timer-scheduler");
16
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
17
+ const DEFAULT_MAX_INFLIGHT_REQUESTS = 32;
18
+ const DEFAULT_MAX_PENDING_REQUESTS = 512;
19
+ const normalizeRequestCap = (value, fallback) => {
20
+ const n = value !== null && value !== void 0 ? value : fallback;
21
+ return n > 0 ? n : Number.POSITIVE_INFINITY;
22
+ };
23
+ class SocketClientCoreImpl {
24
+ constructor(options) {
25
+ var _a, _b;
26
+ this.transportUnsubs = [];
27
+ this.stateListeners = new Set();
28
+ this.errorListeners = new Set();
29
+ this.messageListeners = new Set();
30
+ this.requestQueue = [];
31
+ this.inflightRequests = 0;
32
+ this.transport = options.transport;
33
+ this.codec = options.codec;
34
+ this.settlement = options.settlement;
35
+ this.getMessageType = options.getMessageType;
36
+ this.requestTimeoutMs = (_a = options.requestTimeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_REQUEST_TIMEOUT_MS;
37
+ this.maxInflightRequests = normalizeRequestCap(options.maxInflightRequests, DEFAULT_MAX_INFLIGHT_REQUESTS);
38
+ this.maxPendingRequests = normalizeRequestCap(options.maxPendingRequests, DEFAULT_MAX_PENDING_REQUESTS);
39
+ this.ownsTimerScheduler = !options.timerScheduler;
40
+ this.timerScheduler = (_b = options.timerScheduler) !== null && _b !== void 0 ? _b : new shared_timer_scheduler_1.InMemorySharedTimerScheduler();
41
+ this.pending = new pending_request_store_1.PendingRequestStore({ timerScheduler: this.timerScheduler });
42
+ this.router = new message_router_1.MessageRouter({ getMessageType: options.getMessageType });
43
+ this._state = options.transport.state;
44
+ this.transportUnsubs.push(this.transport.on('open', () => this.setState('connected')));
45
+ this.transportUnsubs.push(this.transport.on('close', () => {
46
+ this.rejectQueuedRequests(new Error(`499 CLIENT CLOSED REQUEST - socket closed`));
47
+ this.pending.clear(new Error(`499 CLIENT CLOSED REQUEST - socket closed`));
48
+ this.setState('closed');
49
+ }));
50
+ this.transportUnsubs.push(this.transport.on('error', event => this.emitError({ error: event.error, phase: 'transport' })));
51
+ this.transportUnsubs.push(this.transport.on('message', event => this.handleRawMessage(event.data)));
52
+ }
53
+ get state() {
54
+ return this._state;
55
+ }
56
+ connect() {
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ if (this._state === 'connected' || this._state === 'connecting')
59
+ return;
60
+ this.setState('connecting');
61
+ try {
62
+ yield this.transport.connect();
63
+ }
64
+ catch (error) {
65
+ this.emitError({ error, phase: 'connect' });
66
+ this.setState('closed');
67
+ throw error;
68
+ }
69
+ });
70
+ }
71
+ disconnect(code, reason) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ if (this._state === 'closed' || this._state === 'idle')
74
+ return;
75
+ this.setState('closing');
76
+ try {
77
+ yield this.transport.disconnect(code, reason);
78
+ }
79
+ catch (error) {
80
+ this.emitError({ error, phase: 'disconnect' });
81
+ throw error;
82
+ }
83
+ });
84
+ }
85
+ send(message) {
86
+ this.transport.send(this.codec.serialize(message));
87
+ }
88
+ request(message, options = {}) {
89
+ const mid = this.settlement.getId(message);
90
+ if (!mid)
91
+ return Promise.reject(new Error(`@request id (string) is required - SocketClientCore.request()`));
92
+ const totalAccepted = this.inflightRequests + this.requestQueue.length;
93
+ if (totalAccepted >= this.maxPendingRequests) {
94
+ return Promise.reject(new Error(`429 TOO MANY REQUESTS - pending queue full (${totalAccepted}/${this.maxPendingRequests})`));
95
+ }
96
+ return new Promise((resolve, reject) => {
97
+ var _a;
98
+ const job = {
99
+ mid,
100
+ message,
101
+ timeoutMs: (_a = options.timeoutMs) !== null && _a !== void 0 ? _a : this.requestTimeoutMs,
102
+ resolve: resolve,
103
+ reject,
104
+ };
105
+ if (this.inflightRequests < this.maxInflightRequests) {
106
+ this.dispatchRequest(job);
107
+ return;
108
+ }
109
+ this.requestQueue.push(job);
110
+ });
111
+ }
112
+ onState(listener) {
113
+ this.stateListeners.add(listener);
114
+ return () => this.stateListeners.delete(listener);
115
+ }
116
+ onError(listener) {
117
+ this.errorListeners.add(listener);
118
+ return () => this.errorListeners.delete(listener);
119
+ }
120
+ onMessage(listener) {
121
+ this.messageListeners.add(listener);
122
+ return () => this.messageListeners.delete(listener);
123
+ }
124
+ onType(type, listener) {
125
+ return this.router.onType(type, listener);
126
+ }
127
+ destroy() {
128
+ this.transportUnsubs.splice(0).forEach(unsub => unsub());
129
+ this.rejectQueuedRequests(new Error(`499 CLIENT CLOSED REQUEST - client destroyed`));
130
+ this.pending.clear(new Error(`499 CLIENT CLOSED REQUEST - client destroyed`));
131
+ this.router.clear();
132
+ this.stateListeners.clear();
133
+ this.errorListeners.clear();
134
+ this.messageListeners.clear();
135
+ if (this.ownsTimerScheduler)
136
+ this.timerScheduler.cancelAll();
137
+ this.setState('closed');
138
+ }
139
+ dispatchRequest(job) {
140
+ this.inflightRequests += 1;
141
+ let released = false;
142
+ const release = () => {
143
+ if (released)
144
+ return;
145
+ released = true;
146
+ this.inflightRequests = Math.max(0, this.inflightRequests - 1);
147
+ this.dispatchNextQueuedRequest();
148
+ };
149
+ const pending = this.pending.create(job.mid, {
150
+ timeoutMs: job.timeoutMs,
151
+ onTimeout: mid => new Error(`408 REQUEST TIMEOUT - pending[${mid}]`),
152
+ });
153
+ void pending.then(value => {
154
+ job.resolve(value);
155
+ release();
156
+ }, error => {
157
+ job.reject(error);
158
+ release();
159
+ });
160
+ try {
161
+ this.transport.send(this.codec.serialize(job.message));
162
+ }
163
+ catch (error) {
164
+ this.pending.reject(job.mid, error);
165
+ release();
166
+ this.emitError({ error, phase: 'request' });
167
+ }
168
+ }
169
+ dispatchNextQueuedRequest() {
170
+ while (this.inflightRequests < this.maxInflightRequests && this.requestQueue.length) {
171
+ const next = this.requestQueue.shift();
172
+ if (!next)
173
+ return;
174
+ this.dispatchRequest(next);
175
+ }
176
+ }
177
+ rejectQueuedRequests(reason) {
178
+ const queued = this.requestQueue.splice(0);
179
+ queued.forEach(job => job.reject(reason));
180
+ return queued.length;
181
+ }
182
+ handleRawMessage(raw) {
183
+ try {
184
+ const message = this.codec.parse(raw);
185
+ const handled = this.settle(message);
186
+ const event = { message, raw };
187
+ this.messageListeners.forEach(listener => listener(event));
188
+ if (!handled)
189
+ this.router.route(message);
190
+ }
191
+ catch (error) {
192
+ this.emitError({ error, phase: 'message', raw });
193
+ }
194
+ }
195
+ settle(message) {
196
+ const mid = this.settlement.getId(message);
197
+ if (!mid)
198
+ return false;
199
+ if (this.settlement.isSuccess(message))
200
+ return this.pending.resolve(mid, this.settlement.getSuccessData(message));
201
+ if (this.settlement.isFailure(message))
202
+ return this.pending.reject(mid, this.settlement.getFailureError(message));
203
+ return false;
204
+ }
205
+ setState(next) {
206
+ const prev = this._state;
207
+ this._state = next;
208
+ if (prev === next)
209
+ return;
210
+ const event = { prev, next };
211
+ this.stateListeners.forEach(listener => listener(event));
212
+ }
213
+ emitError(event) {
214
+ this.errorListeners.forEach(listener => listener(event));
215
+ }
216
+ }
217
+ const createSocketClientCore = (options) => new SocketClientCoreImpl(options);
218
+ exports.createSocketClientCore = createSocketClientCore;
219
+ //# sourceMappingURL=socket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../../../src/socket/client/socket-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { SocketUnsubscribe } from '../types';
2
+ import type { WebSocketCompartible } from '../websocket';
3
+ export type { SocketUnsubscribe } from '../types';
4
+ export declare type SocketClientState = 'idle' | 'connecting' | 'connected' | 'closing' | 'closed';
5
+ export interface SocketClientStateEvent {
6
+ prev: SocketClientState;
7
+ next: SocketClientState;
8
+ }
9
+ export interface SocketClientErrorEvent {
10
+ error: unknown;
11
+ phase: 'connect' | 'disconnect' | 'message' | 'request' | 'transport';
12
+ raw?: unknown;
13
+ }
14
+ export interface SocketClientMessageEvent<TMessage> {
15
+ message: TMessage;
16
+ raw: string;
17
+ }
18
+ export interface SocketMessageCodec<TMessage> {
19
+ parse(raw: string): TMessage;
20
+ serialize(message: TMessage): string;
21
+ }
22
+ export interface RequestSettlementStrategy<TMessage> {
23
+ getId(message: TMessage): string | undefined;
24
+ isSuccess(message: TMessage): boolean;
25
+ isFailure(message: TMessage): boolean;
26
+ getSuccessData(message: TMessage): unknown;
27
+ getFailureError(message: TMessage): unknown;
28
+ }
29
+ export interface SocketClientTransportEventMap {
30
+ open: void;
31
+ close: {
32
+ code?: number;
33
+ reason?: string;
34
+ wasClean?: boolean;
35
+ };
36
+ error: {
37
+ error?: unknown;
38
+ };
39
+ message: {
40
+ data: string;
41
+ };
42
+ }
43
+ export interface SocketClientTransport {
44
+ readonly state: SocketClientState;
45
+ connect(): Promise<void>;
46
+ disconnect(code?: number, reason?: string): Promise<void>;
47
+ send(raw: string): void;
48
+ on<TType extends keyof SocketClientTransportEventMap>(type: TType, listener: (event: SocketClientTransportEventMap[TType]) => void): SocketUnsubscribe;
49
+ }
50
+ export interface SharedTimerScheduler {
51
+ schedule(key: string, delayMs: number, task: () => unknown | Promise<unknown>): void;
52
+ cancel(key: string): void;
53
+ cancelAll(prefix?: string): void;
54
+ }
55
+ export interface SocketClientCore<TMessage> {
56
+ readonly state: SocketClientState;
57
+ connect(): Promise<void>;
58
+ disconnect(code?: number, reason?: string): Promise<void>;
59
+ send(message: TMessage): void;
60
+ request<TResult = unknown>(message: TMessage, options?: {
61
+ timeoutMs?: number;
62
+ }): Promise<TResult>;
63
+ onState(listener: (event: SocketClientStateEvent) => void): SocketUnsubscribe;
64
+ onError(listener: (event: SocketClientErrorEvent) => void): SocketUnsubscribe;
65
+ onMessage(listener: (event: SocketClientMessageEvent<TMessage>) => void): SocketUnsubscribe;
66
+ onType(type: string, listener: (message: TMessage) => void): SocketUnsubscribe;
67
+ destroy(): void;
68
+ }
69
+ export interface SocketClientCoreOptions<TMessage> {
70
+ transport: SocketClientTransport;
71
+ codec: SocketMessageCodec<TMessage>;
72
+ settlement: RequestSettlementStrategy<TMessage>;
73
+ getMessageType(message: TMessage): string | undefined;
74
+ requestTimeoutMs?: number;
75
+ maxInflightRequests?: number;
76
+ maxPendingRequests?: number;
77
+ timerScheduler?: SharedTimerScheduler;
78
+ }
79
+ export interface SocketRuntimePort<TMessage = unknown> {
80
+ readonly state: SocketClientState;
81
+ connect(): Promise<void>;
82
+ disconnect(code?: number, reason?: string): Promise<void>;
83
+ send(message: TMessage): void;
84
+ request<TResult = unknown>(message: TMessage, options?: {
85
+ timeoutMs?: number;
86
+ }): Promise<TResult>;
87
+ onState(listener: (event: SocketClientStateEvent) => void): SocketUnsubscribe;
88
+ onError(listener: (event: SocketClientErrorEvent) => void): SocketUnsubscribe;
89
+ }
90
+ export interface WebSocketClientTransportSocket extends WebSocketCompartible {
91
+ close(code?: number, reason?: string): void;
92
+ }
93
+ export interface WebSocketClientTransportOptions {
94
+ url: string;
95
+ protocols?: string | string[];
96
+ socketFactory: (context: {
97
+ url: string;
98
+ protocols?: string | string[];
99
+ }) => WebSocketClientTransportSocket;
100
+ connectTimeoutMs?: number;
101
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/socket/client/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { SocketClientState, SocketClientTransport, SocketClientTransportEventMap, WebSocketClientTransportOptions } from './types';
2
+ export declare class WebSocketClientTransport implements SocketClientTransport {
3
+ private _state;
4
+ private socket?;
5
+ private connecting?;
6
+ private cancelConnecting?;
7
+ private readonly listeners;
8
+ private readonly unbinders;
9
+ private readonly url;
10
+ private readonly protocols;
11
+ private readonly socketFactory;
12
+ private readonly connectTimeoutMs;
13
+ constructor(options: WebSocketClientTransportOptions);
14
+ get state(): SocketClientState;
15
+ connect(): Promise<void>;
16
+ disconnect(code?: number, reason?: string): Promise<void>;
17
+ send(raw: string): void;
18
+ on<TType extends keyof SocketClientTransportEventMap>(type: TType, listener: (event: SocketClientTransportEventMap[TType]) => void): () => void;
19
+ private bindSocketListener;
20
+ private emit;
21
+ private cleanupSocket;
22
+ private stateValue;
23
+ }
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.WebSocketClientTransport = void 0;
13
+ const DEFAULT_CONNECT_TIMEOUT_MS = 10000;
14
+ class WebSocketClientTransport {
15
+ constructor(options) {
16
+ var _a;
17
+ this._state = 'idle';
18
+ this.listeners = new Map();
19
+ this.unbinders = [];
20
+ this.url = options.url;
21
+ this.protocols = options.protocols;
22
+ this.socketFactory = options.socketFactory;
23
+ this.connectTimeoutMs = (_a = options.connectTimeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_CONNECT_TIMEOUT_MS;
24
+ }
25
+ get state() {
26
+ return this._state;
27
+ }
28
+ connect() {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ if (this._state === 'connected')
31
+ return;
32
+ if (this.connecting)
33
+ return this.connecting;
34
+ this.cleanupSocket();
35
+ this._state = 'connecting';
36
+ const socket = this.socketFactory({ url: this.url, protocols: this.protocols });
37
+ this.socket = socket;
38
+ this.connecting = new Promise((resolve, reject) => {
39
+ let settled = false;
40
+ let timeoutTimer;
41
+ const settle = (handler) => {
42
+ if (settled)
43
+ return;
44
+ settled = true;
45
+ if (timeoutTimer)
46
+ clearTimeout(timeoutTimer);
47
+ this.connecting = undefined;
48
+ this.cancelConnecting = undefined;
49
+ handler();
50
+ };
51
+ this.cancelConnecting = error => settle(() => reject(error));
52
+ if (this.connectTimeoutMs > 0) {
53
+ timeoutTimer = setTimeout(() => {
54
+ const error = new Error(`408 CONNECT TIMEOUT - WebSocketClientTransport.connect() after ${this.connectTimeoutMs}ms`);
55
+ this._state = 'closed';
56
+ settle(() => reject(error));
57
+ try {
58
+ socket.close(1000, 'connect-timeout');
59
+ }
60
+ catch (_a) {
61
+ undefined;
62
+ }
63
+ }, this.connectTimeoutMs);
64
+ }
65
+ this.unbinders.push(this.bindSocketListener(socket, 'open', () => {
66
+ this._state = 'connected';
67
+ this.emit('open', undefined);
68
+ settle(() => resolve());
69
+ }), this.bindSocketListener(socket, 'close', event => {
70
+ this._state = 'closed';
71
+ this.emit('close', {
72
+ code: event === null || event === void 0 ? void 0 : event.code,
73
+ reason: event === null || event === void 0 ? void 0 : event.reason,
74
+ wasClean: event === null || event === void 0 ? void 0 : event.wasClean,
75
+ });
76
+ if (!settled)
77
+ settle(() => reject(new Error(`WebSocket closed before open`)));
78
+ }), this.bindSocketListener(socket, 'error', event => {
79
+ var _a, _b;
80
+ const error = (_b = (_a = event === null || event === void 0 ? void 0 : event.error) !== null && _a !== void 0 ? _a : event) !== null && _b !== void 0 ? _b : new Error(`socket transport error`);
81
+ this.emit('error', { error });
82
+ if (this._state !== 'connected')
83
+ this._state = 'closed';
84
+ if (!settled)
85
+ settle(() => reject(error));
86
+ }), this.bindSocketListener(socket, 'message', event => {
87
+ const data = event === null || event === void 0 ? void 0 : event.data;
88
+ if (typeof data === 'string')
89
+ this.emit('message', { data });
90
+ }));
91
+ });
92
+ return this.connecting;
93
+ });
94
+ }
95
+ disconnect(code, reason) {
96
+ var _a;
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ if (!this.socket) {
99
+ this._state = 'closed';
100
+ return;
101
+ }
102
+ this._state = 'closing';
103
+ const socket = this.socket;
104
+ let didEmitClose = false;
105
+ const unsubscribeClose = this.on('close', () => {
106
+ didEmitClose = true;
107
+ });
108
+ socket.close(code, reason);
109
+ unsubscribeClose();
110
+ (_a = this.cancelConnecting) === null || _a === void 0 ? void 0 : _a.call(this, new Error(`499 CLIENT CLOSED REQUEST - disconnect during connecting`));
111
+ this.cleanupSocket();
112
+ if (!didEmitClose) {
113
+ this._state = 'closed';
114
+ this.emit('close', { code, reason, wasClean: true });
115
+ }
116
+ });
117
+ }
118
+ send(raw) {
119
+ if (!this.socket || this.socket.readyState !== this.stateValue(this.socket, 'OPEN', 1)) {
120
+ throw new Error(`503 SOCKET NOT CONNECTED - WebSocketClientTransport.send()`);
121
+ }
122
+ this.socket.send(raw);
123
+ }
124
+ on(type, listener) {
125
+ var _a;
126
+ const bucket = (_a = this.listeners.get(type)) !== null && _a !== void 0 ? _a : new Set();
127
+ bucket.add(listener);
128
+ this.listeners.set(type, bucket);
129
+ return () => {
130
+ bucket.delete(listener);
131
+ if (!bucket.size)
132
+ this.listeners.delete(type);
133
+ };
134
+ }
135
+ bindSocketListener(socket, type, listener) {
136
+ socket.addEventListener(type, listener);
137
+ return () => socket.removeEventListener(type, listener);
138
+ }
139
+ emit(type, event) {
140
+ var _a;
141
+ (_a = this.listeners.get(type)) === null || _a === void 0 ? void 0 : _a.forEach(listener => listener(event));
142
+ }
143
+ cleanupSocket() {
144
+ this.unbinders.splice(0).forEach(unbind => unbind());
145
+ this.socket = undefined;
146
+ }
147
+ stateValue(socket, key, fallback) {
148
+ return typeof socket[key] === 'number' ? socket[key] : fallback;
149
+ }
150
+ }
151
+ exports.WebSocketClientTransport = WebSocketClientTransport;
152
+ //# sourceMappingURL=websocket-client-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client-transport.js","sourceRoot":"","sources":["../../../src/socket/client/websocket-client-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `socket/decorators.ts`
3
+ * - L1 `NetworkSupportable` decorators: reconnect-on-death wrapper and raw wire translator.
4
+ * - same slot as `createFilteredNetwork`; compose freely: filtered(translated(reconnecting(factory))).
5
+ *
6
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
7
+ */
8
+ import { NetworkSupportable, SocketUnsubscribe } from './types';
9
+ export interface ReconnectOptions {
10
+ /** first retry delay (default 1_000ms) */
11
+ baseMs?: number;
12
+ /** exponential backoff multiplier (default 2) */
13
+ factor?: number;
14
+ /** retry delay cap (default 30_000ms) */
15
+ maxMs?: number;
16
+ /** retry count cap (default unlimited). onError notified then permanently closed once reached */
17
+ maxRetries?: number;
18
+ /** force a reconnect when nothing has been received for this long (default off) */
19
+ idleTimeoutMs?: number;
20
+ /** readyState watchdog cadence (default 1_000ms). fallback for networks that close without notifying */
21
+ watchdogMs?: number;
22
+ }
23
+ export interface ReconnectingNetworkSupportable extends NetworkSupportable {
24
+ /** notified on every successful reconnect (initial connect excluded). the service catches up here with machine.tick() */
25
+ onReconnect(handler: () => void): SocketUnsubscribe;
26
+ /** internal network generation (0 initially, +1 per reconnect) */
27
+ readonly generation: number;
28
+ }
29
+ /** create the L1 reconnect decorator: swaps the internal network on death, keeping instance identity for L3 */
30
+ export declare const createReconnectingNetwork: (factory: () => NetworkSupportable, options?: ReconnectOptions) => ReconnectingNetworkSupportable;
31
+ export interface WireTranslator {
32
+ /** outbound raw transform (default passthrough) */
33
+ outbound?: (raw: string) => string;
34
+ /** inbound raw transform. returning undefined drops the raw (default passthrough) */
35
+ inbound?: (raw: string) => string | undefined;
36
+ }
37
+ /** create the L1 wire translator decorator over a raw string, same slot as `createFilteredNetwork` */
38
+ export declare const createTranslatedNetwork: (source: NetworkSupportable, translator: WireTranslator) => NetworkSupportable;