@voidhash/mimic 0.0.2 → 0.0.3
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/.turbo/turbo-build.log +257 -42
- package/dist/Document.cjs +152 -0
- package/dist/Document.d.cts +67 -0
- package/dist/Document.d.cts.map +1 -0
- package/dist/Document.d.mts +68 -0
- package/dist/Document.d.mts.map +1 -0
- package/dist/Document.mjs +147 -0
- package/dist/Document.mjs.map +1 -0
- package/dist/EffectSchema.cjs +180 -0
- package/dist/EffectSchema.d.cts +84 -0
- package/dist/EffectSchema.d.cts.map +1 -0
- package/dist/EffectSchema.d.mts +84 -0
- package/dist/EffectSchema.d.mts.map +1 -0
- package/dist/EffectSchema.mjs +176 -0
- package/dist/EffectSchema.mjs.map +1 -0
- package/dist/FractionalIndex.cjs +365 -0
- package/dist/FractionalIndex.mjs +364 -0
- package/dist/FractionalIndex.mjs.map +1 -0
- package/dist/Operation.cjs +53 -0
- package/dist/Operation.d.cts +39 -0
- package/dist/Operation.d.cts.map +1 -0
- package/dist/Operation.d.mts +39 -0
- package/dist/Operation.d.mts.map +1 -0
- package/dist/Operation.mjs +46 -0
- package/dist/Operation.mjs.map +1 -0
- package/dist/OperationDefinition.cjs +13 -0
- package/dist/OperationDefinition.d.cts +12 -0
- package/dist/OperationDefinition.d.cts.map +1 -0
- package/dist/OperationDefinition.d.mts +12 -0
- package/dist/OperationDefinition.d.mts.map +1 -0
- package/dist/OperationDefinition.mjs +13 -0
- package/dist/OperationDefinition.mjs.map +1 -0
- package/dist/OperationPath.cjs +148 -0
- package/dist/OperationPath.d.cts +60 -0
- package/dist/OperationPath.d.cts.map +1 -0
- package/dist/OperationPath.d.mts +60 -0
- package/dist/OperationPath.d.mts.map +1 -0
- package/dist/OperationPath.mjs +138 -0
- package/dist/OperationPath.mjs.map +1 -0
- package/dist/{Presence-gWrmGBeu.cjs → Presence.cjs} +4 -39
- package/dist/{Presence-N8u7Eppr.d.mts → Presence.d.cts} +2 -2
- package/dist/Presence.d.cts.map +1 -0
- package/dist/{Presence-DKKP4v5X.d.cts → Presence.d.mts} +2 -2
- package/dist/Presence.d.mts.map +1 -0
- package/dist/{Presence-DdMVKcOv.mjs → Presence.mjs} +3 -28
- package/dist/Presence.mjs.map +1 -0
- package/dist/Primitive.cjs +52 -0
- package/dist/Primitive.d.cts +20 -0
- package/dist/Primitive.d.cts.map +1 -0
- package/dist/Primitive.d.mts +20 -0
- package/dist/Primitive.d.mts.map +1 -0
- package/dist/Primitive.mjs +48 -0
- package/dist/Primitive.mjs.map +1 -0
- package/dist/ProxyEnvironment.cjs +34 -0
- package/dist/ProxyEnvironment.d.cts +31 -0
- package/dist/ProxyEnvironment.d.cts.map +1 -0
- package/dist/ProxyEnvironment.d.mts +31 -0
- package/dist/ProxyEnvironment.d.mts.map +1 -0
- package/dist/ProxyEnvironment.mjs +29 -0
- package/dist/ProxyEnvironment.mjs.map +1 -0
- package/dist/Transaction.cjs +66 -0
- package/dist/Transaction.d.cts +56 -0
- package/dist/Transaction.d.cts.map +1 -0
- package/dist/Transaction.d.mts +56 -0
- package/dist/Transaction.d.mts.map +1 -0
- package/dist/Transaction.mjs +58 -0
- package/dist/Transaction.mjs.map +1 -0
- package/dist/Transform.cjs +11 -0
- package/dist/Transform.d.cts +21 -0
- package/dist/Transform.d.cts.map +1 -0
- package/dist/Transform.d.mts +21 -0
- package/dist/Transform.d.mts.map +1 -0
- package/dist/Transform.mjs +6 -0
- package/dist/Transform.mjs.map +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs +18 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs +12 -0
- package/dist/_virtual/rolldown_runtime.cjs +43 -0
- package/dist/{chunk-CLMFDpHK.mjs → _virtual/rolldown_runtime.mjs} +1 -1
- package/dist/client/ClientDocument.cjs +590 -0
- package/dist/client/ClientDocument.d.cts +161 -0
- package/dist/client/ClientDocument.d.cts.map +1 -0
- package/dist/client/ClientDocument.d.mts +162 -0
- package/dist/client/ClientDocument.d.mts.map +1 -0
- package/dist/client/ClientDocument.mjs +586 -0
- package/dist/client/ClientDocument.mjs.map +1 -0
- package/dist/client/Rebase.cjs +204 -0
- package/dist/client/Rebase.d.cts +87 -0
- package/dist/client/Rebase.d.cts.map +1 -0
- package/dist/client/Rebase.d.mts +88 -0
- package/dist/client/Rebase.d.mts.map +1 -0
- package/dist/client/Rebase.mjs +198 -0
- package/dist/client/Rebase.mjs.map +1 -0
- package/dist/client/StateMonitor.cjs +133 -0
- package/dist/client/StateMonitor.d.cts +122 -0
- package/dist/client/StateMonitor.d.cts.map +1 -0
- package/dist/client/StateMonitor.d.mts +122 -0
- package/dist/client/StateMonitor.d.mts.map +1 -0
- package/dist/client/StateMonitor.mjs +129 -0
- package/dist/client/StateMonitor.mjs.map +1 -0
- package/dist/client/Transport.cjs +11 -0
- package/dist/client/Transport.d.cts +237 -0
- package/dist/client/Transport.d.cts.map +1 -0
- package/dist/client/Transport.d.mts +237 -0
- package/dist/client/Transport.d.mts.map +1 -0
- package/dist/client/Transport.mjs +6 -0
- package/dist/client/Transport.mjs.map +1 -0
- package/dist/client/WebSocketTransport.cjs +396 -0
- package/dist/client/WebSocketTransport.d.cts +29 -0
- package/dist/client/WebSocketTransport.d.cts.map +1 -0
- package/dist/client/WebSocketTransport.d.mts +29 -0
- package/dist/client/WebSocketTransport.d.mts.map +1 -0
- package/dist/client/WebSocketTransport.mjs +392 -0
- package/dist/client/WebSocketTransport.mjs.map +1 -0
- package/dist/client/errors.cjs +135 -0
- package/dist/client/errors.d.cts +87 -0
- package/dist/client/errors.d.cts.map +1 -0
- package/dist/client/errors.d.mts +87 -0
- package/dist/client/errors.d.mts.map +1 -0
- package/dist/client/errors.mjs +127 -0
- package/dist/client/errors.mjs.map +1 -0
- package/dist/client/index.cjs +22 -1424
- package/dist/client/index.d.cts +8 -692
- package/dist/client/index.d.mts +8 -692
- package/dist/client/index.mjs +9 -1413
- package/dist/index.cjs +20 -2973
- package/dist/index.d.cts +12 -419
- package/dist/index.d.mts +12 -419
- package/dist/index.mjs +13 -2968
- package/dist/primitives/Array.cjs +302 -0
- package/dist/primitives/Array.d.cts +95 -0
- package/dist/primitives/Array.d.cts.map +1 -0
- package/dist/primitives/Array.d.mts +95 -0
- package/dist/primitives/Array.d.mts.map +1 -0
- package/dist/primitives/Array.mjs +301 -0
- package/dist/primitives/Array.mjs.map +1 -0
- package/dist/primitives/Boolean.cjs +95 -0
- package/dist/primitives/Boolean.d.cts +44 -0
- package/dist/primitives/Boolean.d.cts.map +1 -0
- package/dist/primitives/Boolean.d.mts +44 -0
- package/dist/primitives/Boolean.d.mts.map +1 -0
- package/dist/primitives/Boolean.mjs +94 -0
- package/dist/primitives/Boolean.mjs.map +1 -0
- package/dist/primitives/Either.cjs +200 -0
- package/dist/primitives/Either.d.cts +113 -0
- package/dist/primitives/Either.d.cts.map +1 -0
- package/dist/primitives/Either.d.mts +113 -0
- package/dist/primitives/Either.d.mts.map +1 -0
- package/dist/primitives/Either.mjs +199 -0
- package/dist/primitives/Either.mjs.map +1 -0
- package/dist/primitives/Lazy.cjs +46 -0
- package/dist/primitives/Lazy.d.cts +46 -0
- package/dist/primitives/Lazy.d.cts.map +1 -0
- package/dist/primitives/Lazy.d.mts +46 -0
- package/dist/primitives/Lazy.d.mts.map +1 -0
- package/dist/primitives/Lazy.mjs +46 -0
- package/dist/primitives/Lazy.mjs.map +1 -0
- package/dist/primitives/Literal.cjs +91 -0
- package/dist/primitives/Literal.d.cts +46 -0
- package/dist/primitives/Literal.d.cts.map +1 -0
- package/dist/primitives/Literal.d.mts +46 -0
- package/dist/primitives/Literal.d.mts.map +1 -0
- package/dist/primitives/Literal.mjs +90 -0
- package/dist/primitives/Literal.mjs.map +1 -0
- package/dist/primitives/Number.cjs +115 -0
- package/dist/primitives/Number.d.cts +54 -0
- package/dist/primitives/Number.d.cts.map +1 -0
- package/dist/primitives/Number.d.mts +54 -0
- package/dist/primitives/Number.d.mts.map +1 -0
- package/dist/primitives/Number.mjs +114 -0
- package/dist/primitives/Number.mjs.map +1 -0
- package/dist/primitives/String.cjs +127 -0
- package/dist/primitives/String.d.cts +56 -0
- package/dist/primitives/String.d.cts.map +1 -0
- package/dist/primitives/String.d.mts +56 -0
- package/dist/primitives/String.d.mts.map +1 -0
- package/dist/primitives/String.mjs +126 -0
- package/dist/primitives/String.mjs.map +1 -0
- package/dist/primitives/Struct.cjs +207 -0
- package/dist/primitives/Struct.d.cts +96 -0
- package/dist/primitives/Struct.d.cts.map +1 -0
- package/dist/primitives/Struct.d.mts +97 -0
- package/dist/primitives/Struct.d.mts.map +1 -0
- package/dist/primitives/Struct.mjs +206 -0
- package/dist/primitives/Struct.mjs.map +1 -0
- package/dist/primitives/Tree.cjs +575 -0
- package/dist/primitives/Tree.d.cts +185 -0
- package/dist/primitives/Tree.d.cts.map +1 -0
- package/dist/primitives/Tree.d.mts +185 -0
- package/dist/primitives/Tree.d.mts.map +1 -0
- package/dist/primitives/Tree.mjs +574 -0
- package/dist/primitives/Tree.mjs.map +1 -0
- package/dist/primitives/TreeNode.cjs +73 -0
- package/dist/primitives/TreeNode.d.cts +92 -0
- package/dist/primitives/TreeNode.d.cts.map +1 -0
- package/dist/primitives/TreeNode.d.mts +93 -0
- package/dist/primitives/TreeNode.d.mts.map +1 -0
- package/dist/primitives/TreeNode.mjs +72 -0
- package/dist/primitives/TreeNode.mjs.map +1 -0
- package/dist/primitives/Union.cjs +170 -0
- package/dist/primitives/Union.d.cts +81 -0
- package/dist/primitives/Union.d.cts.map +1 -0
- package/dist/primitives/Union.d.mts +81 -0
- package/dist/primitives/Union.d.mts.map +1 -0
- package/dist/primitives/Union.mjs +169 -0
- package/dist/primitives/Union.mjs.map +1 -0
- package/dist/primitives/shared.cjs +60 -0
- package/dist/primitives/shared.d.cts +147 -0
- package/dist/primitives/shared.d.cts.map +1 -0
- package/dist/primitives/shared.d.mts +147 -0
- package/dist/primitives/shared.d.mts.map +1 -0
- package/dist/primitives/shared.mjs +58 -0
- package/dist/primitives/shared.mjs.map +1 -0
- package/dist/server/ServerDocument.cjs +110 -0
- package/dist/server/ServerDocument.d.cts +98 -0
- package/dist/server/ServerDocument.d.cts.map +1 -0
- package/dist/server/ServerDocument.d.mts +99 -0
- package/dist/server/ServerDocument.d.mts.map +1 -0
- package/dist/server/ServerDocument.mjs +106 -0
- package/dist/server/ServerDocument.mjs.map +1 -0
- package/dist/server/errors.cjs +85 -0
- package/dist/server/errors.d.cts +53 -0
- package/dist/server/errors.d.cts.map +1 -0
- package/dist/server/errors.d.mts +53 -0
- package/dist/server/errors.d.mts.map +1 -0
- package/dist/server/errors.mjs +81 -0
- package/dist/server/errors.mjs.map +1 -0
- package/dist/server/index.cjs +9 -185
- package/dist/server/index.d.cts +3 -148
- package/dist/server/index.d.mts +3 -148
- package/dist/server/index.mjs +3 -181
- package/dist/types/index.cjs +16 -0
- package/dist/types/index.d.cts +16 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.mts +16 -0
- package/dist/types/index.d.mts.map +1 -0
- package/dist/types/index.mjs +12 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/utils/tree-helpers.cjs +443 -0
- package/dist/utils/tree-helpers.d.cts +280 -0
- package/dist/utils/tree-helpers.d.cts.map +1 -0
- package/dist/utils/tree-helpers.d.mts +280 -0
- package/dist/utils/tree-helpers.d.mts.map +1 -0
- package/dist/utils/tree-helpers.mjs +439 -0
- package/dist/utils/tree-helpers.mjs.map +1 -0
- package/package.json +2 -2
- package/tsdown.config.ts +1 -1
- package/dist/Document-ChuFrTk1.cjs +0 -571
- package/dist/Document-CwiAFTIq.mjs +0 -438
- package/dist/Document-CwiAFTIq.mjs.map +0 -1
- package/dist/Presence-DKKP4v5X.d.cts.map +0 -1
- package/dist/Presence-DdMVKcOv.mjs.map +0 -1
- package/dist/Presence-N8u7Eppr.d.mts.map +0 -1
- package/dist/Primitive-DqQFc3Gu.d.mts +0 -1180
- package/dist/Primitive-DqQFc3Gu.d.mts.map +0 -1
- package/dist/Primitive-awpEjnKL.d.cts +0 -1180
- package/dist/Primitive-awpEjnKL.d.cts.map +0 -1
- package/dist/client/index.d.cts.map +0 -1
- package/dist/client/index.d.mts.map +0 -1
- package/dist/client/index.mjs.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/server/index.d.cts.map +0 -1
- package/dist/server/index.d.mts.map +0 -1
- package/dist/server/index.mjs.map +0 -1
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_Transaction = require('../Transaction.cjs');
|
|
3
|
+
const require_errors = require('./errors.cjs');
|
|
4
|
+
|
|
5
|
+
//#region src/client/WebSocketTransport.ts
|
|
6
|
+
var WebSocketTransport_exports = /* @__PURE__ */ require_rolldown_runtime.__export({ make: () => make });
|
|
7
|
+
/**
|
|
8
|
+
* Creates a WebSocket-based transport for real-time server communication.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Build the WebSocket URL with optional document ID path.
|
|
12
|
+
*/
|
|
13
|
+
const buildWebSocketUrl = (baseUrl, documentId) => {
|
|
14
|
+
if (!documentId) return baseUrl;
|
|
15
|
+
return `${baseUrl.replace(/\/+$/, "")}/doc/${encodeURIComponent(documentId)}`;
|
|
16
|
+
};
|
|
17
|
+
const make = (options) => {
|
|
18
|
+
const { url: baseUrl, documentId, protocols, authToken, onEvent, connectionTimeout = 1e4, autoReconnect = true, maxReconnectAttempts = 10, reconnectDelay = 1e3, maxReconnectDelay = 3e4, heartbeatInterval = 3e4, heartbeatTimeout = 1e4 } = options;
|
|
19
|
+
const url = buildWebSocketUrl(baseUrl, documentId);
|
|
20
|
+
let _state = { type: "disconnected" };
|
|
21
|
+
let _ws = null;
|
|
22
|
+
let _messageHandlers = /* @__PURE__ */ new Set();
|
|
23
|
+
let _connectionTimeoutHandle = null;
|
|
24
|
+
let _heartbeatIntervalHandle = null;
|
|
25
|
+
let _heartbeatTimeoutHandle = null;
|
|
26
|
+
let _reconnectTimeoutHandle = null;
|
|
27
|
+
let _messageQueue = [];
|
|
28
|
+
let _connectResolver = null;
|
|
29
|
+
let _connectRejecter = null;
|
|
30
|
+
let _reconnectAttempt = 0;
|
|
31
|
+
const emit = (handler, event) => {
|
|
32
|
+
handler === null || handler === void 0 || handler(event);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Encodes a client message for network transport.
|
|
36
|
+
*/
|
|
37
|
+
const encodeClientMessage = (message) => {
|
|
38
|
+
if (message.type === "submit") return {
|
|
39
|
+
type: "submit",
|
|
40
|
+
transaction: require_Transaction.encode(message.transaction)
|
|
41
|
+
};
|
|
42
|
+
return message;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Decodes a server message from network transport.
|
|
46
|
+
*/
|
|
47
|
+
const decodeServerMessage = (encoded) => {
|
|
48
|
+
if (encoded.type === "transaction") return {
|
|
49
|
+
type: "transaction",
|
|
50
|
+
transaction: require_Transaction.decode(encoded.transaction),
|
|
51
|
+
version: encoded.version
|
|
52
|
+
};
|
|
53
|
+
return encoded;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Sends a raw message over the WebSocket.
|
|
57
|
+
*/
|
|
58
|
+
const sendRaw = (message) => {
|
|
59
|
+
if (_ws && _ws.readyState === WebSocket.OPEN) _ws.send(JSON.stringify(encodeClientMessage(message)));
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Clears all active timers.
|
|
63
|
+
*/
|
|
64
|
+
const clearTimers = () => {
|
|
65
|
+
if (_connectionTimeoutHandle) {
|
|
66
|
+
clearTimeout(_connectionTimeoutHandle);
|
|
67
|
+
_connectionTimeoutHandle = null;
|
|
68
|
+
}
|
|
69
|
+
if (_heartbeatIntervalHandle) {
|
|
70
|
+
clearInterval(_heartbeatIntervalHandle);
|
|
71
|
+
_heartbeatIntervalHandle = null;
|
|
72
|
+
}
|
|
73
|
+
if (_heartbeatTimeoutHandle) {
|
|
74
|
+
clearTimeout(_heartbeatTimeoutHandle);
|
|
75
|
+
_heartbeatTimeoutHandle = null;
|
|
76
|
+
}
|
|
77
|
+
if (_reconnectTimeoutHandle) {
|
|
78
|
+
clearTimeout(_reconnectTimeoutHandle);
|
|
79
|
+
_reconnectTimeoutHandle = null;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Starts the heartbeat mechanism.
|
|
84
|
+
*/
|
|
85
|
+
const startHeartbeat = () => {
|
|
86
|
+
stopHeartbeat();
|
|
87
|
+
_heartbeatIntervalHandle = setInterval(() => {
|
|
88
|
+
if (_state.type !== "connected") return;
|
|
89
|
+
sendRaw({ type: "ping" });
|
|
90
|
+
_heartbeatTimeoutHandle = setTimeout(() => {
|
|
91
|
+
handleConnectionLost("Heartbeat timeout");
|
|
92
|
+
}, heartbeatTimeout);
|
|
93
|
+
}, heartbeatInterval);
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Stops the heartbeat mechanism.
|
|
97
|
+
*/
|
|
98
|
+
const stopHeartbeat = () => {
|
|
99
|
+
if (_heartbeatIntervalHandle) {
|
|
100
|
+
clearInterval(_heartbeatIntervalHandle);
|
|
101
|
+
_heartbeatIntervalHandle = null;
|
|
102
|
+
}
|
|
103
|
+
if (_heartbeatTimeoutHandle) {
|
|
104
|
+
clearTimeout(_heartbeatTimeoutHandle);
|
|
105
|
+
_heartbeatTimeoutHandle = null;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Handles pong response - clears the heartbeat timeout.
|
|
110
|
+
*/
|
|
111
|
+
const handlePong = () => {
|
|
112
|
+
if (_heartbeatTimeoutHandle) {
|
|
113
|
+
clearTimeout(_heartbeatTimeoutHandle);
|
|
114
|
+
_heartbeatTimeoutHandle = null;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Flushes the message queue after reconnection.
|
|
119
|
+
*/
|
|
120
|
+
const flushMessageQueue = () => {
|
|
121
|
+
const queue = _messageQueue;
|
|
122
|
+
_messageQueue = [];
|
|
123
|
+
for (const message of queue) sendRaw(message);
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Calculates reconnection delay with exponential backoff.
|
|
127
|
+
*/
|
|
128
|
+
const getReconnectDelay = (attempt) => {
|
|
129
|
+
const delay = reconnectDelay * Math.pow(2, attempt);
|
|
130
|
+
return Math.min(delay, maxReconnectDelay);
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Resolves the auth token (handles both string and function).
|
|
134
|
+
* Returns empty string if no token is configured.
|
|
135
|
+
*/
|
|
136
|
+
const resolveAuthToken = async () => {
|
|
137
|
+
if (!authToken) return "";
|
|
138
|
+
if (typeof authToken === "string") return authToken;
|
|
139
|
+
return authToken();
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Performs authentication after connection.
|
|
143
|
+
* Always sends an auth message (even with empty token) to trigger server auth flow.
|
|
144
|
+
*/
|
|
145
|
+
const authenticate = async () => {
|
|
146
|
+
const token = await resolveAuthToken();
|
|
147
|
+
_state = { type: "authenticating" };
|
|
148
|
+
sendRaw({
|
|
149
|
+
type: "auth",
|
|
150
|
+
token
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Handles authentication result from server.
|
|
155
|
+
*/
|
|
156
|
+
const handleAuthResult = (success, error) => {
|
|
157
|
+
if (!success) {
|
|
158
|
+
const authError = new require_errors.AuthenticationError(error || "Authentication failed");
|
|
159
|
+
cleanup();
|
|
160
|
+
_connectRejecter === null || _connectRejecter === void 0 || _connectRejecter(authError);
|
|
161
|
+
_connectResolver = null;
|
|
162
|
+
_connectRejecter = null;
|
|
163
|
+
emit(onEvent, {
|
|
164
|
+
type: "error",
|
|
165
|
+
error: authError
|
|
166
|
+
});
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
completeConnection();
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* Completes the connection process.
|
|
173
|
+
*/
|
|
174
|
+
const completeConnection = () => {
|
|
175
|
+
_state = { type: "connected" };
|
|
176
|
+
_reconnectAttempt = 0;
|
|
177
|
+
if (_connectionTimeoutHandle) {
|
|
178
|
+
clearTimeout(_connectionTimeoutHandle);
|
|
179
|
+
_connectionTimeoutHandle = null;
|
|
180
|
+
}
|
|
181
|
+
startHeartbeat();
|
|
182
|
+
flushMessageQueue();
|
|
183
|
+
_connectResolver === null || _connectResolver === void 0 || _connectResolver();
|
|
184
|
+
_connectResolver = null;
|
|
185
|
+
_connectRejecter = null;
|
|
186
|
+
emit(onEvent, { type: "connected" });
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Cleans up WebSocket and related state.
|
|
190
|
+
*/
|
|
191
|
+
const cleanup = () => {
|
|
192
|
+
clearTimers();
|
|
193
|
+
if (_ws) {
|
|
194
|
+
_ws.onopen = null;
|
|
195
|
+
_ws.onclose = null;
|
|
196
|
+
_ws.onerror = null;
|
|
197
|
+
_ws.onmessage = null;
|
|
198
|
+
if (_ws.readyState === WebSocket.OPEN || _ws.readyState === WebSocket.CONNECTING) _ws.close();
|
|
199
|
+
_ws = null;
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Handles connection lost - initiates reconnection if enabled.
|
|
204
|
+
*/
|
|
205
|
+
const handleConnectionLost = (reason) => {
|
|
206
|
+
cleanup();
|
|
207
|
+
if (_state.type === "disconnected") return;
|
|
208
|
+
if (_connectRejecter !== null) {
|
|
209
|
+
_state = { type: "disconnected" };
|
|
210
|
+
_reconnectAttempt = 0;
|
|
211
|
+
_connectRejecter(new require_errors.WebSocketError("Connection failed", void 0, reason));
|
|
212
|
+
_connectResolver = null;
|
|
213
|
+
_connectRejecter = null;
|
|
214
|
+
emit(onEvent, {
|
|
215
|
+
type: "disconnected",
|
|
216
|
+
reason
|
|
217
|
+
});
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (!autoReconnect) {
|
|
221
|
+
_state = { type: "disconnected" };
|
|
222
|
+
_reconnectAttempt = 0;
|
|
223
|
+
emit(onEvent, {
|
|
224
|
+
type: "disconnected",
|
|
225
|
+
reason
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
_reconnectAttempt++;
|
|
230
|
+
if (_reconnectAttempt > maxReconnectAttempts) {
|
|
231
|
+
_state = { type: "disconnected" };
|
|
232
|
+
_reconnectAttempt = 0;
|
|
233
|
+
emit(onEvent, {
|
|
234
|
+
type: "disconnected",
|
|
235
|
+
reason: "Max reconnection attempts reached"
|
|
236
|
+
});
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
_state = {
|
|
240
|
+
type: "reconnecting",
|
|
241
|
+
attempt: _reconnectAttempt
|
|
242
|
+
};
|
|
243
|
+
emit(onEvent, {
|
|
244
|
+
type: "reconnecting",
|
|
245
|
+
attempt: _reconnectAttempt
|
|
246
|
+
});
|
|
247
|
+
const delay = getReconnectDelay(_reconnectAttempt - 1);
|
|
248
|
+
_reconnectTimeoutHandle = setTimeout(() => {
|
|
249
|
+
_reconnectTimeoutHandle = null;
|
|
250
|
+
attemptConnection();
|
|
251
|
+
}, delay);
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Attempts to establish WebSocket connection.
|
|
255
|
+
*/
|
|
256
|
+
const attemptConnection = () => {
|
|
257
|
+
if (_state.type === "connected") return;
|
|
258
|
+
_state = { type: "connecting" };
|
|
259
|
+
try {
|
|
260
|
+
_ws = new WebSocket(url, protocols);
|
|
261
|
+
} catch (error) {
|
|
262
|
+
handleConnectionLost(error.message);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
_connectionTimeoutHandle = setTimeout(() => {
|
|
266
|
+
_connectionTimeoutHandle = null;
|
|
267
|
+
handleConnectionLost("Connection timeout");
|
|
268
|
+
}, connectionTimeout);
|
|
269
|
+
_ws.onopen = async () => {
|
|
270
|
+
if (_connectionTimeoutHandle) {
|
|
271
|
+
clearTimeout(_connectionTimeoutHandle);
|
|
272
|
+
_connectionTimeoutHandle = null;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
await authenticate();
|
|
276
|
+
} catch (error) {
|
|
277
|
+
handleConnectionLost(error.message);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
_ws.onclose = (event) => {
|
|
281
|
+
handleConnectionLost(event.reason || `Connection closed (code: ${event.code})`);
|
|
282
|
+
};
|
|
283
|
+
_ws.onerror = () => {};
|
|
284
|
+
_ws.onmessage = (event) => {
|
|
285
|
+
try {
|
|
286
|
+
handleMessage(decodeServerMessage(JSON.parse(event.data)));
|
|
287
|
+
} catch (_unused) {}
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
/**
|
|
291
|
+
* Handles incoming server messages.
|
|
292
|
+
*/
|
|
293
|
+
const handleMessage = (message) => {
|
|
294
|
+
if (message.type === "pong") {
|
|
295
|
+
handlePong();
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (message.type === "auth_result") {
|
|
299
|
+
handleAuthResult(message.success, message.error);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
for (const handler of _messageHandlers) try {
|
|
303
|
+
handler(message);
|
|
304
|
+
} catch (_unused2) {}
|
|
305
|
+
};
|
|
306
|
+
return {
|
|
307
|
+
send: (transaction) => {
|
|
308
|
+
const message = {
|
|
309
|
+
type: "submit",
|
|
310
|
+
transaction
|
|
311
|
+
};
|
|
312
|
+
if (_state.type === "connected") sendRaw(message);
|
|
313
|
+
else if (_state.type === "reconnecting") _messageQueue.push(message);
|
|
314
|
+
},
|
|
315
|
+
requestSnapshot: () => {
|
|
316
|
+
const message = { type: "request_snapshot" };
|
|
317
|
+
if (_state.type === "connected") sendRaw(message);
|
|
318
|
+
else if (_state.type === "reconnecting") _messageQueue.push(message);
|
|
319
|
+
},
|
|
320
|
+
subscribe: (handler) => {
|
|
321
|
+
_messageHandlers.add(handler);
|
|
322
|
+
return () => {
|
|
323
|
+
_messageHandlers.delete(handler);
|
|
324
|
+
};
|
|
325
|
+
},
|
|
326
|
+
connect: async () => {
|
|
327
|
+
if (_state.type === "connected") return;
|
|
328
|
+
if (_state.type === "connecting" || _state.type === "authenticating") return new Promise((resolve, reject) => {
|
|
329
|
+
const existingResolver = _connectResolver;
|
|
330
|
+
const existingRejecter = _connectRejecter;
|
|
331
|
+
_connectResolver = () => {
|
|
332
|
+
existingResolver === null || existingResolver === void 0 || existingResolver();
|
|
333
|
+
resolve();
|
|
334
|
+
};
|
|
335
|
+
_connectRejecter = (error) => {
|
|
336
|
+
existingRejecter === null || existingRejecter === void 0 || existingRejecter(error);
|
|
337
|
+
reject(error);
|
|
338
|
+
};
|
|
339
|
+
});
|
|
340
|
+
return new Promise((resolve, reject) => {
|
|
341
|
+
_connectResolver = resolve;
|
|
342
|
+
_connectRejecter = reject;
|
|
343
|
+
attemptConnection();
|
|
344
|
+
});
|
|
345
|
+
},
|
|
346
|
+
disconnect: () => {
|
|
347
|
+
if (_reconnectTimeoutHandle) {
|
|
348
|
+
clearTimeout(_reconnectTimeoutHandle);
|
|
349
|
+
_reconnectTimeoutHandle = null;
|
|
350
|
+
}
|
|
351
|
+
if (_connectRejecter) {
|
|
352
|
+
_connectRejecter(new require_errors.WebSocketError("Disconnected by user"));
|
|
353
|
+
_connectResolver = null;
|
|
354
|
+
_connectRejecter = null;
|
|
355
|
+
}
|
|
356
|
+
cleanup();
|
|
357
|
+
_state = { type: "disconnected" };
|
|
358
|
+
_reconnectAttempt = 0;
|
|
359
|
+
_messageQueue = [];
|
|
360
|
+
emit(onEvent, {
|
|
361
|
+
type: "disconnected",
|
|
362
|
+
reason: "User disconnected"
|
|
363
|
+
});
|
|
364
|
+
},
|
|
365
|
+
isConnected: () => {
|
|
366
|
+
return _state.type === "connected";
|
|
367
|
+
},
|
|
368
|
+
sendPresenceSet: (data) => {
|
|
369
|
+
const message = {
|
|
370
|
+
type: "presence_set",
|
|
371
|
+
data
|
|
372
|
+
};
|
|
373
|
+
if (_state.type === "connected") sendRaw(message);
|
|
374
|
+
else if (_state.type === "reconnecting") {
|
|
375
|
+
_messageQueue = _messageQueue.filter((message$1) => message$1.type !== "presence_set");
|
|
376
|
+
_messageQueue.push(message);
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
sendPresenceClear: () => {
|
|
380
|
+
const message = { type: "presence_clear" };
|
|
381
|
+
if (_state.type === "connected") sendRaw(message);
|
|
382
|
+
else if (_state.type === "reconnecting") {
|
|
383
|
+
_messageQueue = _messageQueue.filter((message$1) => message$1.type !== "presence_clear");
|
|
384
|
+
_messageQueue.push(message);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
//#endregion
|
|
391
|
+
Object.defineProperty(exports, 'WebSocketTransport_exports', {
|
|
392
|
+
enumerable: true,
|
|
393
|
+
get: function () {
|
|
394
|
+
return WebSocketTransport_exports;
|
|
395
|
+
}
|
|
396
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Transport, TransportOptions } from "./Transport.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/WebSocketTransport.d.ts
|
|
4
|
+
declare namespace WebSocketTransport_d_exports {
|
|
5
|
+
export { WebSocketTransportOptions, make };
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Options for creating a WebSocket transport.
|
|
9
|
+
*/
|
|
10
|
+
interface WebSocketTransportOptions extends TransportOptions {
|
|
11
|
+
/** WebSocket URL (ws:// or wss://) - base URL without document path */
|
|
12
|
+
readonly url: string;
|
|
13
|
+
/** Document ID to connect to. Will be appended to URL as /doc/{documentId} */
|
|
14
|
+
readonly documentId?: string;
|
|
15
|
+
/** WebSocket subprotocols */
|
|
16
|
+
readonly protocols?: string[];
|
|
17
|
+
/** Authentication token or function that returns a token */
|
|
18
|
+
readonly authToken?: string | (() => string | Promise<string>);
|
|
19
|
+
/** Interval between heartbeat pings (ms). Default: 30000 */
|
|
20
|
+
readonly heartbeatInterval?: number;
|
|
21
|
+
/** Timeout to wait for pong response (ms). Default: 10000 */
|
|
22
|
+
readonly heartbeatTimeout?: number;
|
|
23
|
+
/** Maximum delay between reconnection attempts (ms). Default: 30000 */
|
|
24
|
+
readonly maxReconnectDelay?: number;
|
|
25
|
+
}
|
|
26
|
+
declare const make: (options: WebSocketTransportOptions) => Transport;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { WebSocketTransport_d_exports };
|
|
29
|
+
//# sourceMappingURL=WebSocketTransport.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketTransport.d.cts","names":[],"sources":["../../src/client/WebSocketTransport.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAYiB,yBAAA,SAAkC;;;;EAAlC,SAAA,UAAA,CAAA,EAAA,MAA0B;EAiD9B;;;gDAzCmC;;;;;;;;cAyCnC,gBAAiB,8BAA4B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Transport, TransportOptions } from "./Transport.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/WebSocketTransport.d.ts
|
|
4
|
+
declare namespace WebSocketTransport_d_exports {
|
|
5
|
+
export { WebSocketTransportOptions, make };
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Options for creating a WebSocket transport.
|
|
9
|
+
*/
|
|
10
|
+
interface WebSocketTransportOptions extends TransportOptions {
|
|
11
|
+
/** WebSocket URL (ws:// or wss://) - base URL without document path */
|
|
12
|
+
readonly url: string;
|
|
13
|
+
/** Document ID to connect to. Will be appended to URL as /doc/{documentId} */
|
|
14
|
+
readonly documentId?: string;
|
|
15
|
+
/** WebSocket subprotocols */
|
|
16
|
+
readonly protocols?: string[];
|
|
17
|
+
/** Authentication token or function that returns a token */
|
|
18
|
+
readonly authToken?: string | (() => string | Promise<string>);
|
|
19
|
+
/** Interval between heartbeat pings (ms). Default: 30000 */
|
|
20
|
+
readonly heartbeatInterval?: number;
|
|
21
|
+
/** Timeout to wait for pong response (ms). Default: 10000 */
|
|
22
|
+
readonly heartbeatTimeout?: number;
|
|
23
|
+
/** Maximum delay between reconnection attempts (ms). Default: 30000 */
|
|
24
|
+
readonly maxReconnectDelay?: number;
|
|
25
|
+
}
|
|
26
|
+
declare const make: (options: WebSocketTransportOptions) => Transport;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { WebSocketTransport_d_exports };
|
|
29
|
+
//# sourceMappingURL=WebSocketTransport.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketTransport.d.mts","names":[],"sources":["../../src/client/WebSocketTransport.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAYiB,yBAAA,SAAkC;;;;EAAlC,SAAA,UAAA,CAAA,EAAA,MAA0B;EAiD9B;;;gDAzCmC;;;;;;;;cAyCnC,gBAAiB,8BAA4B"}
|