@korajs/server 0.0.0-canary-20261008174129

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.
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/internal.ts
21
+ var internal_exports = {};
22
+ __export(internal_exports, {
23
+ MemoryServerTransport: () => MemoryServerTransport,
24
+ createServerTransportPair: () => createServerTransportPair
25
+ });
26
+ module.exports = __toCommonJS(internal_exports);
27
+
28
+ // src/transport/memory-server-transport.ts
29
+ var MemoryServerTransport = class {
30
+ connected = true;
31
+ messageHandler = null;
32
+ closeHandler = null;
33
+ errorHandler = null;
34
+ sentMessages = [];
35
+ sendToClient = null;
36
+ clientDisconnect = null;
37
+ /**
38
+ * Wire up the send-to-client function and client disconnect notifier.
39
+ * Called by createServerTransportPair.
40
+ */
41
+ _link(sendToClient, clientDisconnect) {
42
+ this.sendToClient = sendToClient;
43
+ this.clientDisconnect = clientDisconnect;
44
+ }
45
+ /**
46
+ * Deliver a message from the client side into this transport.
47
+ * Called by the linked client transport.
48
+ */
49
+ _receiveFromClient(message) {
50
+ this.messageHandler?.(message);
51
+ }
52
+ /**
53
+ * Notify this transport that the client disconnected.
54
+ */
55
+ _notifyClientDisconnected() {
56
+ if (!this.connected) return;
57
+ this.connected = false;
58
+ this.closeHandler?.(1e3, "client disconnected");
59
+ }
60
+ send(message) {
61
+ if (!this.connected) {
62
+ return;
63
+ }
64
+ this.sentMessages.push(message);
65
+ this.sendToClient?.(message);
66
+ }
67
+ onMessage(handler) {
68
+ this.messageHandler = handler;
69
+ }
70
+ onClose(handler) {
71
+ this.closeHandler = handler;
72
+ }
73
+ onError(handler) {
74
+ this.errorHandler = handler;
75
+ }
76
+ isConnected() {
77
+ return this.connected;
78
+ }
79
+ close(code, reason) {
80
+ if (!this.connected) return;
81
+ this.connected = false;
82
+ this.clientDisconnect?.();
83
+ }
84
+ // --- Testing helpers ---
85
+ /** Get all messages sent through this transport. */
86
+ getSentMessages() {
87
+ return [...this.sentMessages];
88
+ }
89
+ /** Simulate a disconnect from the client side. */
90
+ simulateDisconnect() {
91
+ this._notifyClientDisconnected();
92
+ }
93
+ };
94
+ var MemoryClientTransport = class {
95
+ connected = true;
96
+ messageHandler = null;
97
+ closeHandler = null;
98
+ errorHandler = null;
99
+ sentMessages = [];
100
+ sendToServer = null;
101
+ serverNotifyDisconnect = null;
102
+ _link(sendToServer, serverNotifyDisconnect) {
103
+ this.sendToServer = sendToServer;
104
+ this.serverNotifyDisconnect = serverNotifyDisconnect;
105
+ }
106
+ _receiveFromServer(message) {
107
+ this.messageHandler?.(message);
108
+ }
109
+ _notifyServerDisconnected() {
110
+ if (!this.connected) return;
111
+ this.connected = false;
112
+ this.closeHandler?.("server disconnected");
113
+ }
114
+ async connect(_url) {
115
+ this.connected = true;
116
+ }
117
+ async disconnect() {
118
+ if (!this.connected) return;
119
+ this.connected = false;
120
+ this.serverNotifyDisconnect?.();
121
+ }
122
+ send(message) {
123
+ if (!this.connected) {
124
+ throw new Error("Cannot send message: client transport is not connected");
125
+ }
126
+ this.sentMessages.push(message);
127
+ this.sendToServer?.(message);
128
+ }
129
+ onMessage(handler) {
130
+ this.messageHandler = handler;
131
+ }
132
+ onClose(handler) {
133
+ this.closeHandler = handler;
134
+ }
135
+ onError(handler) {
136
+ this.errorHandler = handler;
137
+ }
138
+ isConnected() {
139
+ return this.connected;
140
+ }
141
+ getSentMessages() {
142
+ return [...this.sentMessages];
143
+ }
144
+ simulateIncoming(message) {
145
+ this.messageHandler?.(message);
146
+ }
147
+ simulateDisconnect(reason) {
148
+ this.connected = false;
149
+ this.closeHandler?.(reason);
150
+ }
151
+ simulateError(error) {
152
+ this.errorHandler?.(error);
153
+ }
154
+ clearSentMessages() {
155
+ this.sentMessages.length = 0;
156
+ }
157
+ };
158
+ function createServerTransportPair() {
159
+ const client = new MemoryClientTransport();
160
+ const server = new MemoryServerTransport();
161
+ client._link(
162
+ (msg) => server._receiveFromClient(msg),
163
+ () => server._notifyClientDisconnected()
164
+ );
165
+ server._link(
166
+ (msg) => client._receiveFromServer(msg),
167
+ () => client._notifyServerDisconnected()
168
+ );
169
+ return { client, server };
170
+ }
171
+ // Annotate the CommonJS export names for ESM import in node:
172
+ 0 && (module.exports = {
173
+ MemoryServerTransport,
174
+ createServerTransportPair
175
+ });
176
+ //# sourceMappingURL=internal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal.ts","../src/transport/memory-server-transport.ts"],"sourcesContent":["// Internal exports — shared within @kora packages but NOT part of the public API.\n// Other @kora packages can import from '@korajs/server/internal' if needed.\n\nexport {\n\tMemoryServerTransport,\n\tcreateServerTransportPair,\n} from './transport/memory-server-transport'\n","import type { SyncMessage } from '@korajs/sync'\nimport type {\n\tServerCloseHandler,\n\tServerErrorHandler,\n\tServerMessageHandler,\n\tServerTransport,\n} from './server-transport'\n\n/**\n * In-memory server transport for testing. Wraps the server side of a\n * MemoryTransport pair, adapting it to the ServerTransport interface.\n *\n * Messages sent through this transport arrive at the linked client MemoryTransport.\n */\nexport class MemoryServerTransport implements ServerTransport {\n\tprivate connected = true\n\tprivate messageHandler: ServerMessageHandler | null = null\n\tprivate closeHandler: ServerCloseHandler | null = null\n\tprivate errorHandler: ServerErrorHandler | null = null\n\tprivate readonly sentMessages: SyncMessage[] = []\n\tprivate sendToClient: ((message: SyncMessage) => void) | null = null\n\tprivate clientDisconnect: (() => void) | null = null\n\n\t/**\n\t * Wire up the send-to-client function and client disconnect notifier.\n\t * Called by createServerTransportPair.\n\t */\n\t_link(sendToClient: (message: SyncMessage) => void, clientDisconnect: () => void): void {\n\t\tthis.sendToClient = sendToClient\n\t\tthis.clientDisconnect = clientDisconnect\n\t}\n\n\t/**\n\t * Deliver a message from the client side into this transport.\n\t * Called by the linked client transport.\n\t */\n\t_receiveFromClient(message: SyncMessage): void {\n\t\tthis.messageHandler?.(message)\n\t}\n\n\t/**\n\t * Notify this transport that the client disconnected.\n\t */\n\t_notifyClientDisconnected(): void {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.closeHandler?.(1000, 'client disconnected')\n\t}\n\n\tsend(message: SyncMessage): void {\n\t\tif (!this.connected) {\n\t\t\treturn\n\t\t}\n\t\tthis.sentMessages.push(message)\n\t\tthis.sendToClient?.(message)\n\t}\n\n\tonMessage(handler: ServerMessageHandler): void {\n\t\tthis.messageHandler = handler\n\t}\n\n\tonClose(handler: ServerCloseHandler): void {\n\t\tthis.closeHandler = handler\n\t}\n\n\tonError(handler: ServerErrorHandler): void {\n\t\tthis.errorHandler = handler\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.clientDisconnect?.()\n\t}\n\n\t// --- Testing helpers ---\n\n\t/** Get all messages sent through this transport. */\n\tgetSentMessages(): SyncMessage[] {\n\t\treturn [...this.sentMessages]\n\t}\n\n\t/** Simulate a disconnect from the client side. */\n\tsimulateDisconnect(): void {\n\t\tthis._notifyClientDisconnected()\n\t}\n}\n\n/**\n * Minimal client-side transport that pairs with MemoryServerTransport.\n * Implements the same interface shape as @korajs/sync MemoryTransport but\n * specifically designed for server testing without importing internal modules.\n */\nclass MemoryClientTransport {\n\tprivate connected = true\n\tprivate messageHandler: ((message: SyncMessage) => void) | null = null\n\tprivate closeHandler: ((reason: string) => void) | null = null\n\tprivate errorHandler: ((error: Error) => void) | null = null\n\tprivate readonly sentMessages: SyncMessage[] = []\n\tprivate sendToServer: ((message: SyncMessage) => void) | null = null\n\tprivate serverNotifyDisconnect: (() => void) | null = null\n\n\t_link(sendToServer: (message: SyncMessage) => void, serverNotifyDisconnect: () => void): void {\n\t\tthis.sendToServer = sendToServer\n\t\tthis.serverNotifyDisconnect = serverNotifyDisconnect\n\t}\n\n\t_receiveFromServer(message: SyncMessage): void {\n\t\tthis.messageHandler?.(message)\n\t}\n\n\t_notifyServerDisconnected(): void {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.closeHandler?.('server disconnected')\n\t}\n\n\tasync connect(_url: string): Promise<void> {\n\t\tthis.connected = true\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.serverNotifyDisconnect?.()\n\t}\n\n\tsend(message: SyncMessage): void {\n\t\tif (!this.connected) {\n\t\t\tthrow new Error('Cannot send message: client transport is not connected')\n\t\t}\n\t\tthis.sentMessages.push(message)\n\t\tthis.sendToServer?.(message)\n\t}\n\n\tonMessage(handler: (message: SyncMessage) => void): void {\n\t\tthis.messageHandler = handler\n\t}\n\n\tonClose(handler: (reason: string) => void): void {\n\t\tthis.closeHandler = handler\n\t}\n\n\tonError(handler: (error: Error) => void): void {\n\t\tthis.errorHandler = handler\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected\n\t}\n\n\tgetSentMessages(): SyncMessage[] {\n\t\treturn [...this.sentMessages]\n\t}\n\n\tsimulateIncoming(message: SyncMessage): void {\n\t\tthis.messageHandler?.(message)\n\t}\n\n\tsimulateDisconnect(reason: string): void {\n\t\tthis.connected = false\n\t\tthis.closeHandler?.(reason)\n\t}\n\n\tsimulateError(error: Error): void {\n\t\tthis.errorHandler?.(error)\n\t}\n\n\tclearSentMessages(): void {\n\t\tthis.sentMessages.length = 0\n\t}\n}\n\n/**\n * Create a linked pair of memory transports for server testing.\n * Messages sent on `client` arrive at `server` and vice versa.\n * The client transport implements SyncTransport-compatible interface.\n */\nexport function createServerTransportPair(): {\n\tclient: MemoryClientTransport\n\tserver: MemoryServerTransport\n} {\n\tconst client = new MemoryClientTransport()\n\tconst server = new MemoryServerTransport()\n\n\t// Wire: client.send → server._receiveFromClient\n\t// Wire: server.send → client._receiveFromServer\n\tclient._link(\n\t\t(msg) => server._receiveFromClient(msg),\n\t\t() => server._notifyClientDisconnected(),\n\t)\n\tserver._link(\n\t\t(msg) => client._receiveFromServer(msg),\n\t\t() => client._notifyServerDisconnected(),\n\t)\n\n\treturn { client, server }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,82 @@
1
+ import { SyncMessage } from '@korajs/sync';
2
+ import { S as ServerTransport, a as ServerMessageHandler, b as ServerCloseHandler, c as ServerErrorHandler } from './server-transport-BGQkRCI4.cjs';
3
+
4
+ /**
5
+ * In-memory server transport for testing. Wraps the server side of a
6
+ * MemoryTransport pair, adapting it to the ServerTransport interface.
7
+ *
8
+ * Messages sent through this transport arrive at the linked client MemoryTransport.
9
+ */
10
+ declare class MemoryServerTransport implements ServerTransport {
11
+ private connected;
12
+ private messageHandler;
13
+ private closeHandler;
14
+ private errorHandler;
15
+ private readonly sentMessages;
16
+ private sendToClient;
17
+ private clientDisconnect;
18
+ /**
19
+ * Wire up the send-to-client function and client disconnect notifier.
20
+ * Called by createServerTransportPair.
21
+ */
22
+ _link(sendToClient: (message: SyncMessage) => void, clientDisconnect: () => void): void;
23
+ /**
24
+ * Deliver a message from the client side into this transport.
25
+ * Called by the linked client transport.
26
+ */
27
+ _receiveFromClient(message: SyncMessage): void;
28
+ /**
29
+ * Notify this transport that the client disconnected.
30
+ */
31
+ _notifyClientDisconnected(): void;
32
+ send(message: SyncMessage): void;
33
+ onMessage(handler: ServerMessageHandler): void;
34
+ onClose(handler: ServerCloseHandler): void;
35
+ onError(handler: ServerErrorHandler): void;
36
+ isConnected(): boolean;
37
+ close(code?: number, reason?: string): void;
38
+ /** Get all messages sent through this transport. */
39
+ getSentMessages(): SyncMessage[];
40
+ /** Simulate a disconnect from the client side. */
41
+ simulateDisconnect(): void;
42
+ }
43
+ /**
44
+ * Minimal client-side transport that pairs with MemoryServerTransport.
45
+ * Implements the same interface shape as @korajs/sync MemoryTransport but
46
+ * specifically designed for server testing without importing internal modules.
47
+ */
48
+ declare class MemoryClientTransport {
49
+ private connected;
50
+ private messageHandler;
51
+ private closeHandler;
52
+ private errorHandler;
53
+ private readonly sentMessages;
54
+ private sendToServer;
55
+ private serverNotifyDisconnect;
56
+ _link(sendToServer: (message: SyncMessage) => void, serverNotifyDisconnect: () => void): void;
57
+ _receiveFromServer(message: SyncMessage): void;
58
+ _notifyServerDisconnected(): void;
59
+ connect(_url: string): Promise<void>;
60
+ disconnect(): Promise<void>;
61
+ send(message: SyncMessage): void;
62
+ onMessage(handler: (message: SyncMessage) => void): void;
63
+ onClose(handler: (reason: string) => void): void;
64
+ onError(handler: (error: Error) => void): void;
65
+ isConnected(): boolean;
66
+ getSentMessages(): SyncMessage[];
67
+ simulateIncoming(message: SyncMessage): void;
68
+ simulateDisconnect(reason: string): void;
69
+ simulateError(error: Error): void;
70
+ clearSentMessages(): void;
71
+ }
72
+ /**
73
+ * Create a linked pair of memory transports for server testing.
74
+ * Messages sent on `client` arrive at `server` and vice versa.
75
+ * The client transport implements SyncTransport-compatible interface.
76
+ */
77
+ declare function createServerTransportPair(): {
78
+ client: MemoryClientTransport;
79
+ server: MemoryServerTransport;
80
+ };
81
+
82
+ export { MemoryServerTransport, createServerTransportPair };
@@ -0,0 +1,82 @@
1
+ import { SyncMessage } from '@korajs/sync';
2
+ import { S as ServerTransport, a as ServerMessageHandler, b as ServerCloseHandler, c as ServerErrorHandler } from './server-transport-BGQkRCI4.js';
3
+
4
+ /**
5
+ * In-memory server transport for testing. Wraps the server side of a
6
+ * MemoryTransport pair, adapting it to the ServerTransport interface.
7
+ *
8
+ * Messages sent through this transport arrive at the linked client MemoryTransport.
9
+ */
10
+ declare class MemoryServerTransport implements ServerTransport {
11
+ private connected;
12
+ private messageHandler;
13
+ private closeHandler;
14
+ private errorHandler;
15
+ private readonly sentMessages;
16
+ private sendToClient;
17
+ private clientDisconnect;
18
+ /**
19
+ * Wire up the send-to-client function and client disconnect notifier.
20
+ * Called by createServerTransportPair.
21
+ */
22
+ _link(sendToClient: (message: SyncMessage) => void, clientDisconnect: () => void): void;
23
+ /**
24
+ * Deliver a message from the client side into this transport.
25
+ * Called by the linked client transport.
26
+ */
27
+ _receiveFromClient(message: SyncMessage): void;
28
+ /**
29
+ * Notify this transport that the client disconnected.
30
+ */
31
+ _notifyClientDisconnected(): void;
32
+ send(message: SyncMessage): void;
33
+ onMessage(handler: ServerMessageHandler): void;
34
+ onClose(handler: ServerCloseHandler): void;
35
+ onError(handler: ServerErrorHandler): void;
36
+ isConnected(): boolean;
37
+ close(code?: number, reason?: string): void;
38
+ /** Get all messages sent through this transport. */
39
+ getSentMessages(): SyncMessage[];
40
+ /** Simulate a disconnect from the client side. */
41
+ simulateDisconnect(): void;
42
+ }
43
+ /**
44
+ * Minimal client-side transport that pairs with MemoryServerTransport.
45
+ * Implements the same interface shape as @korajs/sync MemoryTransport but
46
+ * specifically designed for server testing without importing internal modules.
47
+ */
48
+ declare class MemoryClientTransport {
49
+ private connected;
50
+ private messageHandler;
51
+ private closeHandler;
52
+ private errorHandler;
53
+ private readonly sentMessages;
54
+ private sendToServer;
55
+ private serverNotifyDisconnect;
56
+ _link(sendToServer: (message: SyncMessage) => void, serverNotifyDisconnect: () => void): void;
57
+ _receiveFromServer(message: SyncMessage): void;
58
+ _notifyServerDisconnected(): void;
59
+ connect(_url: string): Promise<void>;
60
+ disconnect(): Promise<void>;
61
+ send(message: SyncMessage): void;
62
+ onMessage(handler: (message: SyncMessage) => void): void;
63
+ onClose(handler: (reason: string) => void): void;
64
+ onError(handler: (error: Error) => void): void;
65
+ isConnected(): boolean;
66
+ getSentMessages(): SyncMessage[];
67
+ simulateIncoming(message: SyncMessage): void;
68
+ simulateDisconnect(reason: string): void;
69
+ simulateError(error: Error): void;
70
+ clearSentMessages(): void;
71
+ }
72
+ /**
73
+ * Create a linked pair of memory transports for server testing.
74
+ * Messages sent on `client` arrive at `server` and vice versa.
75
+ * The client transport implements SyncTransport-compatible interface.
76
+ */
77
+ declare function createServerTransportPair(): {
78
+ client: MemoryClientTransport;
79
+ server: MemoryServerTransport;
80
+ };
81
+
82
+ export { MemoryServerTransport, createServerTransportPair };
@@ -0,0 +1,148 @@
1
+ // src/transport/memory-server-transport.ts
2
+ var MemoryServerTransport = class {
3
+ connected = true;
4
+ messageHandler = null;
5
+ closeHandler = null;
6
+ errorHandler = null;
7
+ sentMessages = [];
8
+ sendToClient = null;
9
+ clientDisconnect = null;
10
+ /**
11
+ * Wire up the send-to-client function and client disconnect notifier.
12
+ * Called by createServerTransportPair.
13
+ */
14
+ _link(sendToClient, clientDisconnect) {
15
+ this.sendToClient = sendToClient;
16
+ this.clientDisconnect = clientDisconnect;
17
+ }
18
+ /**
19
+ * Deliver a message from the client side into this transport.
20
+ * Called by the linked client transport.
21
+ */
22
+ _receiveFromClient(message) {
23
+ this.messageHandler?.(message);
24
+ }
25
+ /**
26
+ * Notify this transport that the client disconnected.
27
+ */
28
+ _notifyClientDisconnected() {
29
+ if (!this.connected) return;
30
+ this.connected = false;
31
+ this.closeHandler?.(1e3, "client disconnected");
32
+ }
33
+ send(message) {
34
+ if (!this.connected) {
35
+ return;
36
+ }
37
+ this.sentMessages.push(message);
38
+ this.sendToClient?.(message);
39
+ }
40
+ onMessage(handler) {
41
+ this.messageHandler = handler;
42
+ }
43
+ onClose(handler) {
44
+ this.closeHandler = handler;
45
+ }
46
+ onError(handler) {
47
+ this.errorHandler = handler;
48
+ }
49
+ isConnected() {
50
+ return this.connected;
51
+ }
52
+ close(code, reason) {
53
+ if (!this.connected) return;
54
+ this.connected = false;
55
+ this.clientDisconnect?.();
56
+ }
57
+ // --- Testing helpers ---
58
+ /** Get all messages sent through this transport. */
59
+ getSentMessages() {
60
+ return [...this.sentMessages];
61
+ }
62
+ /** Simulate a disconnect from the client side. */
63
+ simulateDisconnect() {
64
+ this._notifyClientDisconnected();
65
+ }
66
+ };
67
+ var MemoryClientTransport = class {
68
+ connected = true;
69
+ messageHandler = null;
70
+ closeHandler = null;
71
+ errorHandler = null;
72
+ sentMessages = [];
73
+ sendToServer = null;
74
+ serverNotifyDisconnect = null;
75
+ _link(sendToServer, serverNotifyDisconnect) {
76
+ this.sendToServer = sendToServer;
77
+ this.serverNotifyDisconnect = serverNotifyDisconnect;
78
+ }
79
+ _receiveFromServer(message) {
80
+ this.messageHandler?.(message);
81
+ }
82
+ _notifyServerDisconnected() {
83
+ if (!this.connected) return;
84
+ this.connected = false;
85
+ this.closeHandler?.("server disconnected");
86
+ }
87
+ async connect(_url) {
88
+ this.connected = true;
89
+ }
90
+ async disconnect() {
91
+ if (!this.connected) return;
92
+ this.connected = false;
93
+ this.serverNotifyDisconnect?.();
94
+ }
95
+ send(message) {
96
+ if (!this.connected) {
97
+ throw new Error("Cannot send message: client transport is not connected");
98
+ }
99
+ this.sentMessages.push(message);
100
+ this.sendToServer?.(message);
101
+ }
102
+ onMessage(handler) {
103
+ this.messageHandler = handler;
104
+ }
105
+ onClose(handler) {
106
+ this.closeHandler = handler;
107
+ }
108
+ onError(handler) {
109
+ this.errorHandler = handler;
110
+ }
111
+ isConnected() {
112
+ return this.connected;
113
+ }
114
+ getSentMessages() {
115
+ return [...this.sentMessages];
116
+ }
117
+ simulateIncoming(message) {
118
+ this.messageHandler?.(message);
119
+ }
120
+ simulateDisconnect(reason) {
121
+ this.connected = false;
122
+ this.closeHandler?.(reason);
123
+ }
124
+ simulateError(error) {
125
+ this.errorHandler?.(error);
126
+ }
127
+ clearSentMessages() {
128
+ this.sentMessages.length = 0;
129
+ }
130
+ };
131
+ function createServerTransportPair() {
132
+ const client = new MemoryClientTransport();
133
+ const server = new MemoryServerTransport();
134
+ client._link(
135
+ (msg) => server._receiveFromClient(msg),
136
+ () => server._notifyClientDisconnected()
137
+ );
138
+ server._link(
139
+ (msg) => client._receiveFromServer(msg),
140
+ () => client._notifyServerDisconnected()
141
+ );
142
+ return { client, server };
143
+ }
144
+ export {
145
+ MemoryServerTransport,
146
+ createServerTransportPair
147
+ };
148
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transport/memory-server-transport.ts"],"sourcesContent":["import type { SyncMessage } from '@korajs/sync'\nimport type {\n\tServerCloseHandler,\n\tServerErrorHandler,\n\tServerMessageHandler,\n\tServerTransport,\n} from './server-transport'\n\n/**\n * In-memory server transport for testing. Wraps the server side of a\n * MemoryTransport pair, adapting it to the ServerTransport interface.\n *\n * Messages sent through this transport arrive at the linked client MemoryTransport.\n */\nexport class MemoryServerTransport implements ServerTransport {\n\tprivate connected = true\n\tprivate messageHandler: ServerMessageHandler | null = null\n\tprivate closeHandler: ServerCloseHandler | null = null\n\tprivate errorHandler: ServerErrorHandler | null = null\n\tprivate readonly sentMessages: SyncMessage[] = []\n\tprivate sendToClient: ((message: SyncMessage) => void) | null = null\n\tprivate clientDisconnect: (() => void) | null = null\n\n\t/**\n\t * Wire up the send-to-client function and client disconnect notifier.\n\t * Called by createServerTransportPair.\n\t */\n\t_link(sendToClient: (message: SyncMessage) => void, clientDisconnect: () => void): void {\n\t\tthis.sendToClient = sendToClient\n\t\tthis.clientDisconnect = clientDisconnect\n\t}\n\n\t/**\n\t * Deliver a message from the client side into this transport.\n\t * Called by the linked client transport.\n\t */\n\t_receiveFromClient(message: SyncMessage): void {\n\t\tthis.messageHandler?.(message)\n\t}\n\n\t/**\n\t * Notify this transport that the client disconnected.\n\t */\n\t_notifyClientDisconnected(): void {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.closeHandler?.(1000, 'client disconnected')\n\t}\n\n\tsend(message: SyncMessage): void {\n\t\tif (!this.connected) {\n\t\t\treturn\n\t\t}\n\t\tthis.sentMessages.push(message)\n\t\tthis.sendToClient?.(message)\n\t}\n\n\tonMessage(handler: ServerMessageHandler): void {\n\t\tthis.messageHandler = handler\n\t}\n\n\tonClose(handler: ServerCloseHandler): void {\n\t\tthis.closeHandler = handler\n\t}\n\n\tonError(handler: ServerErrorHandler): void {\n\t\tthis.errorHandler = handler\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected\n\t}\n\n\tclose(code?: number, reason?: string): void {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.clientDisconnect?.()\n\t}\n\n\t// --- Testing helpers ---\n\n\t/** Get all messages sent through this transport. */\n\tgetSentMessages(): SyncMessage[] {\n\t\treturn [...this.sentMessages]\n\t}\n\n\t/** Simulate a disconnect from the client side. */\n\tsimulateDisconnect(): void {\n\t\tthis._notifyClientDisconnected()\n\t}\n}\n\n/**\n * Minimal client-side transport that pairs with MemoryServerTransport.\n * Implements the same interface shape as @korajs/sync MemoryTransport but\n * specifically designed for server testing without importing internal modules.\n */\nclass MemoryClientTransport {\n\tprivate connected = true\n\tprivate messageHandler: ((message: SyncMessage) => void) | null = null\n\tprivate closeHandler: ((reason: string) => void) | null = null\n\tprivate errorHandler: ((error: Error) => void) | null = null\n\tprivate readonly sentMessages: SyncMessage[] = []\n\tprivate sendToServer: ((message: SyncMessage) => void) | null = null\n\tprivate serverNotifyDisconnect: (() => void) | null = null\n\n\t_link(sendToServer: (message: SyncMessage) => void, serverNotifyDisconnect: () => void): void {\n\t\tthis.sendToServer = sendToServer\n\t\tthis.serverNotifyDisconnect = serverNotifyDisconnect\n\t}\n\n\t_receiveFromServer(message: SyncMessage): void {\n\t\tthis.messageHandler?.(message)\n\t}\n\n\t_notifyServerDisconnected(): void {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.closeHandler?.('server disconnected')\n\t}\n\n\tasync connect(_url: string): Promise<void> {\n\t\tthis.connected = true\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (!this.connected) return\n\t\tthis.connected = false\n\t\tthis.serverNotifyDisconnect?.()\n\t}\n\n\tsend(message: SyncMessage): void {\n\t\tif (!this.connected) {\n\t\t\tthrow new Error('Cannot send message: client transport is not connected')\n\t\t}\n\t\tthis.sentMessages.push(message)\n\t\tthis.sendToServer?.(message)\n\t}\n\n\tonMessage(handler: (message: SyncMessage) => void): void {\n\t\tthis.messageHandler = handler\n\t}\n\n\tonClose(handler: (reason: string) => void): void {\n\t\tthis.closeHandler = handler\n\t}\n\n\tonError(handler: (error: Error) => void): void {\n\t\tthis.errorHandler = handler\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected\n\t}\n\n\tgetSentMessages(): SyncMessage[] {\n\t\treturn [...this.sentMessages]\n\t}\n\n\tsimulateIncoming(message: SyncMessage): void {\n\t\tthis.messageHandler?.(message)\n\t}\n\n\tsimulateDisconnect(reason: string): void {\n\t\tthis.connected = false\n\t\tthis.closeHandler?.(reason)\n\t}\n\n\tsimulateError(error: Error): void {\n\t\tthis.errorHandler?.(error)\n\t}\n\n\tclearSentMessages(): void {\n\t\tthis.sentMessages.length = 0\n\t}\n}\n\n/**\n * Create a linked pair of memory transports for server testing.\n * Messages sent on `client` arrive at `server` and vice versa.\n * The client transport implements SyncTransport-compatible interface.\n */\nexport function createServerTransportPair(): {\n\tclient: MemoryClientTransport\n\tserver: MemoryServerTransport\n} {\n\tconst client = new MemoryClientTransport()\n\tconst server = new MemoryServerTransport()\n\n\t// Wire: client.send → server._receiveFromClient\n\t// Wire: server.send → client._receiveFromServer\n\tclient._link(\n\t\t(msg) => server._receiveFromClient(msg),\n\t\t() => server._notifyClientDisconnected(),\n\t)\n\tserver._link(\n\t\t(msg) => client._receiveFromServer(msg),\n\t\t() => client._notifyServerDisconnected(),\n\t)\n\n\treturn { client, server }\n}\n"],"mappings":"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","names":[]}