@voidhash/mimic 0.0.2 → 0.0.4

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 (273) hide show
  1. package/.turbo/turbo-build.log +257 -42
  2. package/dist/Document.cjs +152 -0
  3. package/dist/Document.d.cts +67 -0
  4. package/dist/Document.d.cts.map +1 -0
  5. package/dist/Document.d.mts +68 -0
  6. package/dist/Document.d.mts.map +1 -0
  7. package/dist/Document.mjs +147 -0
  8. package/dist/Document.mjs.map +1 -0
  9. package/dist/EffectSchema.cjs +180 -0
  10. package/dist/EffectSchema.d.cts +84 -0
  11. package/dist/EffectSchema.d.cts.map +1 -0
  12. package/dist/EffectSchema.d.mts +84 -0
  13. package/dist/EffectSchema.d.mts.map +1 -0
  14. package/dist/EffectSchema.mjs +176 -0
  15. package/dist/EffectSchema.mjs.map +1 -0
  16. package/dist/FractionalIndex.cjs +365 -0
  17. package/dist/FractionalIndex.mjs +364 -0
  18. package/dist/FractionalIndex.mjs.map +1 -0
  19. package/dist/Operation.cjs +53 -0
  20. package/dist/Operation.d.cts +39 -0
  21. package/dist/Operation.d.cts.map +1 -0
  22. package/dist/Operation.d.mts +39 -0
  23. package/dist/Operation.d.mts.map +1 -0
  24. package/dist/Operation.mjs +46 -0
  25. package/dist/Operation.mjs.map +1 -0
  26. package/dist/OperationDefinition.cjs +13 -0
  27. package/dist/OperationDefinition.d.cts +12 -0
  28. package/dist/OperationDefinition.d.cts.map +1 -0
  29. package/dist/OperationDefinition.d.mts +12 -0
  30. package/dist/OperationDefinition.d.mts.map +1 -0
  31. package/dist/OperationDefinition.mjs +13 -0
  32. package/dist/OperationDefinition.mjs.map +1 -0
  33. package/dist/OperationPath.cjs +148 -0
  34. package/dist/OperationPath.d.cts +60 -0
  35. package/dist/OperationPath.d.cts.map +1 -0
  36. package/dist/OperationPath.d.mts +60 -0
  37. package/dist/OperationPath.d.mts.map +1 -0
  38. package/dist/OperationPath.mjs +138 -0
  39. package/dist/OperationPath.mjs.map +1 -0
  40. package/dist/{Presence-gWrmGBeu.cjs → Presence.cjs} +4 -39
  41. package/dist/{Presence-N8u7Eppr.d.mts → Presence.d.cts} +2 -2
  42. package/dist/Presence.d.cts.map +1 -0
  43. package/dist/{Presence-DKKP4v5X.d.cts → Presence.d.mts} +2 -2
  44. package/dist/Presence.d.mts.map +1 -0
  45. package/dist/{Presence-DdMVKcOv.mjs → Presence.mjs} +3 -28
  46. package/dist/Presence.mjs.map +1 -0
  47. package/dist/Primitive.cjs +52 -0
  48. package/dist/Primitive.d.cts +20 -0
  49. package/dist/Primitive.d.cts.map +1 -0
  50. package/dist/Primitive.d.mts +20 -0
  51. package/dist/Primitive.d.mts.map +1 -0
  52. package/dist/Primitive.mjs +48 -0
  53. package/dist/Primitive.mjs.map +1 -0
  54. package/dist/ProxyEnvironment.cjs +34 -0
  55. package/dist/ProxyEnvironment.d.cts +31 -0
  56. package/dist/ProxyEnvironment.d.cts.map +1 -0
  57. package/dist/ProxyEnvironment.d.mts +31 -0
  58. package/dist/ProxyEnvironment.d.mts.map +1 -0
  59. package/dist/ProxyEnvironment.mjs +29 -0
  60. package/dist/ProxyEnvironment.mjs.map +1 -0
  61. package/dist/Transaction.cjs +66 -0
  62. package/dist/Transaction.d.cts +56 -0
  63. package/dist/Transaction.d.cts.map +1 -0
  64. package/dist/Transaction.d.mts +56 -0
  65. package/dist/Transaction.d.mts.map +1 -0
  66. package/dist/Transaction.mjs +58 -0
  67. package/dist/Transaction.mjs.map +1 -0
  68. package/dist/Transform.cjs +11 -0
  69. package/dist/Transform.d.cts +21 -0
  70. package/dist/Transform.d.cts.map +1 -0
  71. package/dist/Transform.d.mts +21 -0
  72. package/dist/Transform.d.mts.map +1 -0
  73. package/dist/Transform.mjs +6 -0
  74. package/dist/Transform.mjs.map +1 -0
  75. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs +14 -0
  76. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs +14 -0
  77. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs +27 -0
  78. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs +27 -0
  79. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs +16 -0
  80. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs +16 -0
  81. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs +11 -0
  82. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs +11 -0
  83. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs +18 -0
  84. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs +12 -0
  85. package/dist/_virtual/rolldown_runtime.cjs +43 -0
  86. package/dist/{chunk-CLMFDpHK.mjs → _virtual/rolldown_runtime.mjs} +1 -1
  87. package/dist/client/ClientDocument.cjs +590 -0
  88. package/dist/client/ClientDocument.d.cts +161 -0
  89. package/dist/client/ClientDocument.d.cts.map +1 -0
  90. package/dist/client/ClientDocument.d.mts +162 -0
  91. package/dist/client/ClientDocument.d.mts.map +1 -0
  92. package/dist/client/ClientDocument.mjs +586 -0
  93. package/dist/client/ClientDocument.mjs.map +1 -0
  94. package/dist/client/Rebase.cjs +204 -0
  95. package/dist/client/Rebase.d.cts +87 -0
  96. package/dist/client/Rebase.d.cts.map +1 -0
  97. package/dist/client/Rebase.d.mts +88 -0
  98. package/dist/client/Rebase.d.mts.map +1 -0
  99. package/dist/client/Rebase.mjs +198 -0
  100. package/dist/client/Rebase.mjs.map +1 -0
  101. package/dist/client/StateMonitor.cjs +133 -0
  102. package/dist/client/StateMonitor.d.cts +122 -0
  103. package/dist/client/StateMonitor.d.cts.map +1 -0
  104. package/dist/client/StateMonitor.d.mts +122 -0
  105. package/dist/client/StateMonitor.d.mts.map +1 -0
  106. package/dist/client/StateMonitor.mjs +129 -0
  107. package/dist/client/StateMonitor.mjs.map +1 -0
  108. package/dist/client/Transport.cjs +11 -0
  109. package/dist/client/Transport.d.cts +237 -0
  110. package/dist/client/Transport.d.cts.map +1 -0
  111. package/dist/client/Transport.d.mts +237 -0
  112. package/dist/client/Transport.d.mts.map +1 -0
  113. package/dist/client/Transport.mjs +6 -0
  114. package/dist/client/Transport.mjs.map +1 -0
  115. package/dist/client/WebSocketTransport.cjs +396 -0
  116. package/dist/client/WebSocketTransport.d.cts +29 -0
  117. package/dist/client/WebSocketTransport.d.cts.map +1 -0
  118. package/dist/client/WebSocketTransport.d.mts +29 -0
  119. package/dist/client/WebSocketTransport.d.mts.map +1 -0
  120. package/dist/client/WebSocketTransport.mjs +392 -0
  121. package/dist/client/WebSocketTransport.mjs.map +1 -0
  122. package/dist/client/errors.cjs +135 -0
  123. package/dist/client/errors.d.cts +87 -0
  124. package/dist/client/errors.d.cts.map +1 -0
  125. package/dist/client/errors.d.mts +87 -0
  126. package/dist/client/errors.d.mts.map +1 -0
  127. package/dist/client/errors.mjs +127 -0
  128. package/dist/client/errors.mjs.map +1 -0
  129. package/dist/client/index.cjs +22 -1424
  130. package/dist/client/index.d.cts +8 -692
  131. package/dist/client/index.d.mts +8 -692
  132. package/dist/client/index.mjs +9 -1413
  133. package/dist/index.cjs +20 -2973
  134. package/dist/index.d.cts +12 -419
  135. package/dist/index.d.mts +12 -419
  136. package/dist/index.mjs +13 -2968
  137. package/dist/primitives/Array.cjs +302 -0
  138. package/dist/primitives/Array.d.cts +95 -0
  139. package/dist/primitives/Array.d.cts.map +1 -0
  140. package/dist/primitives/Array.d.mts +95 -0
  141. package/dist/primitives/Array.d.mts.map +1 -0
  142. package/dist/primitives/Array.mjs +301 -0
  143. package/dist/primitives/Array.mjs.map +1 -0
  144. package/dist/primitives/Boolean.cjs +95 -0
  145. package/dist/primitives/Boolean.d.cts +44 -0
  146. package/dist/primitives/Boolean.d.cts.map +1 -0
  147. package/dist/primitives/Boolean.d.mts +44 -0
  148. package/dist/primitives/Boolean.d.mts.map +1 -0
  149. package/dist/primitives/Boolean.mjs +94 -0
  150. package/dist/primitives/Boolean.mjs.map +1 -0
  151. package/dist/primitives/Either.cjs +200 -0
  152. package/dist/primitives/Either.d.cts +113 -0
  153. package/dist/primitives/Either.d.cts.map +1 -0
  154. package/dist/primitives/Either.d.mts +113 -0
  155. package/dist/primitives/Either.d.mts.map +1 -0
  156. package/dist/primitives/Either.mjs +199 -0
  157. package/dist/primitives/Either.mjs.map +1 -0
  158. package/dist/primitives/Lazy.cjs +46 -0
  159. package/dist/primitives/Lazy.d.cts +46 -0
  160. package/dist/primitives/Lazy.d.cts.map +1 -0
  161. package/dist/primitives/Lazy.d.mts +46 -0
  162. package/dist/primitives/Lazy.d.mts.map +1 -0
  163. package/dist/primitives/Lazy.mjs +46 -0
  164. package/dist/primitives/Lazy.mjs.map +1 -0
  165. package/dist/primitives/Literal.cjs +91 -0
  166. package/dist/primitives/Literal.d.cts +46 -0
  167. package/dist/primitives/Literal.d.cts.map +1 -0
  168. package/dist/primitives/Literal.d.mts +46 -0
  169. package/dist/primitives/Literal.d.mts.map +1 -0
  170. package/dist/primitives/Literal.mjs +90 -0
  171. package/dist/primitives/Literal.mjs.map +1 -0
  172. package/dist/primitives/Number.cjs +115 -0
  173. package/dist/primitives/Number.d.cts +54 -0
  174. package/dist/primitives/Number.d.cts.map +1 -0
  175. package/dist/primitives/Number.d.mts +54 -0
  176. package/dist/primitives/Number.d.mts.map +1 -0
  177. package/dist/primitives/Number.mjs +114 -0
  178. package/dist/primitives/Number.mjs.map +1 -0
  179. package/dist/primitives/String.cjs +127 -0
  180. package/dist/primitives/String.d.cts +56 -0
  181. package/dist/primitives/String.d.cts.map +1 -0
  182. package/dist/primitives/String.d.mts +56 -0
  183. package/dist/primitives/String.d.mts.map +1 -0
  184. package/dist/primitives/String.mjs +126 -0
  185. package/dist/primitives/String.mjs.map +1 -0
  186. package/dist/primitives/Struct.cjs +207 -0
  187. package/dist/primitives/Struct.d.cts +96 -0
  188. package/dist/primitives/Struct.d.cts.map +1 -0
  189. package/dist/primitives/Struct.d.mts +97 -0
  190. package/dist/primitives/Struct.d.mts.map +1 -0
  191. package/dist/primitives/Struct.mjs +206 -0
  192. package/dist/primitives/Struct.mjs.map +1 -0
  193. package/dist/primitives/Tree.cjs +575 -0
  194. package/dist/primitives/Tree.d.cts +185 -0
  195. package/dist/primitives/Tree.d.cts.map +1 -0
  196. package/dist/primitives/Tree.d.mts +185 -0
  197. package/dist/primitives/Tree.d.mts.map +1 -0
  198. package/dist/primitives/Tree.mjs +574 -0
  199. package/dist/primitives/Tree.mjs.map +1 -0
  200. package/dist/primitives/TreeNode.cjs +73 -0
  201. package/dist/primitives/TreeNode.d.cts +92 -0
  202. package/dist/primitives/TreeNode.d.cts.map +1 -0
  203. package/dist/primitives/TreeNode.d.mts +93 -0
  204. package/dist/primitives/TreeNode.d.mts.map +1 -0
  205. package/dist/primitives/TreeNode.mjs +72 -0
  206. package/dist/primitives/TreeNode.mjs.map +1 -0
  207. package/dist/primitives/Union.cjs +170 -0
  208. package/dist/primitives/Union.d.cts +81 -0
  209. package/dist/primitives/Union.d.cts.map +1 -0
  210. package/dist/primitives/Union.d.mts +81 -0
  211. package/dist/primitives/Union.d.mts.map +1 -0
  212. package/dist/primitives/Union.mjs +169 -0
  213. package/dist/primitives/Union.mjs.map +1 -0
  214. package/dist/primitives/shared.cjs +60 -0
  215. package/dist/primitives/shared.d.cts +147 -0
  216. package/dist/primitives/shared.d.cts.map +1 -0
  217. package/dist/primitives/shared.d.mts +147 -0
  218. package/dist/primitives/shared.d.mts.map +1 -0
  219. package/dist/primitives/shared.mjs +58 -0
  220. package/dist/primitives/shared.mjs.map +1 -0
  221. package/dist/server/ServerDocument.cjs +110 -0
  222. package/dist/server/ServerDocument.d.cts +98 -0
  223. package/dist/server/ServerDocument.d.cts.map +1 -0
  224. package/dist/server/ServerDocument.d.mts +99 -0
  225. package/dist/server/ServerDocument.d.mts.map +1 -0
  226. package/dist/server/ServerDocument.mjs +106 -0
  227. package/dist/server/ServerDocument.mjs.map +1 -0
  228. package/dist/server/errors.cjs +85 -0
  229. package/dist/server/errors.d.cts +53 -0
  230. package/dist/server/errors.d.cts.map +1 -0
  231. package/dist/server/errors.d.mts +53 -0
  232. package/dist/server/errors.d.mts.map +1 -0
  233. package/dist/server/errors.mjs +81 -0
  234. package/dist/server/errors.mjs.map +1 -0
  235. package/dist/server/index.cjs +9 -185
  236. package/dist/server/index.d.cts +3 -148
  237. package/dist/server/index.d.mts +3 -148
  238. package/dist/server/index.mjs +3 -181
  239. package/dist/types/index.cjs +16 -0
  240. package/dist/types/index.d.cts +16 -0
  241. package/dist/types/index.d.cts.map +1 -0
  242. package/dist/types/index.d.mts +16 -0
  243. package/dist/types/index.d.mts.map +1 -0
  244. package/dist/types/index.mjs +12 -0
  245. package/dist/types/index.mjs.map +1 -0
  246. package/dist/utils/tree-helpers.cjs +443 -0
  247. package/dist/utils/tree-helpers.d.cts +280 -0
  248. package/dist/utils/tree-helpers.d.cts.map +1 -0
  249. package/dist/utils/tree-helpers.d.mts +280 -0
  250. package/dist/utils/tree-helpers.d.mts.map +1 -0
  251. package/dist/utils/tree-helpers.mjs +439 -0
  252. package/dist/utils/tree-helpers.mjs.map +1 -0
  253. package/package.json +2 -2
  254. package/tsdown.config.ts +1 -1
  255. package/dist/Document-ChuFrTk1.cjs +0 -571
  256. package/dist/Document-CwiAFTIq.mjs +0 -438
  257. package/dist/Document-CwiAFTIq.mjs.map +0 -1
  258. package/dist/Presence-DKKP4v5X.d.cts.map +0 -1
  259. package/dist/Presence-DdMVKcOv.mjs.map +0 -1
  260. package/dist/Presence-N8u7Eppr.d.mts.map +0 -1
  261. package/dist/Primitive-DqQFc3Gu.d.mts +0 -1180
  262. package/dist/Primitive-DqQFc3Gu.d.mts.map +0 -1
  263. package/dist/Primitive-awpEjnKL.d.cts +0 -1180
  264. package/dist/Primitive-awpEjnKL.d.cts.map +0 -1
  265. package/dist/client/index.d.cts.map +0 -1
  266. package/dist/client/index.d.mts.map +0 -1
  267. package/dist/client/index.mjs.map +0 -1
  268. package/dist/index.d.cts.map +0 -1
  269. package/dist/index.d.mts.map +0 -1
  270. package/dist/index.mjs.map +0 -1
  271. package/dist/server/index.d.cts.map +0 -1
  272. package/dist/server/index.d.mts.map +0 -1
  273. package/dist/server/index.mjs.map +0 -1
@@ -0,0 +1,392 @@
1
+ import { __export } from "../_virtual/rolldown_runtime.mjs";
2
+ import { decode, encode } from "../Transaction.mjs";
3
+ import { AuthenticationError, WebSocketError } from "./errors.mjs";
4
+
5
+ //#region src/client/WebSocketTransport.ts
6
+ var WebSocketTransport_exports = /* @__PURE__ */ __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: 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: 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 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 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 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
+ export { WebSocketTransport_exports };
392
+ //# sourceMappingURL=WebSocketTransport.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketTransport.mjs","names":["_state: ConnectionState","_ws: WebSocket | null","_messageHandlers: Set<(message: Transport.ServerMessage) => void>","_connectionTimeoutHandle: ReturnType<typeof setTimeout> | null","_heartbeatIntervalHandle: ReturnType<typeof setInterval> | null","_heartbeatTimeoutHandle: ReturnType<typeof setTimeout> | null","_reconnectTimeoutHandle: ReturnType<typeof setTimeout> | null","_messageQueue: Transport.ClientMessage[]","_connectResolver: (() => void) | null","_connectRejecter: ((error: Error) => void) | null","Transaction.encode","Transaction.decode","message: Transport.ClientMessage","message"],"sources":["../../src/client/WebSocketTransport.ts"],"sourcesContent":["import * as Transaction from \"../Transaction\";\n\nimport * as Transport from \"./Transport\";\nimport { WebSocketError, AuthenticationError } from \"./errors\";\n\n// =============================================================================\n// WebSocket Transport Options\n// =============================================================================\n\n/**\n * Options for creating a WebSocket transport.\n */\nexport interface WebSocketTransportOptions extends Transport.TransportOptions {\n /** WebSocket URL (ws:// or wss://) - base URL without document path */\n readonly url: string;\n /** Document ID to connect to. Will be appended to URL as /doc/{documentId} */\n readonly documentId?: string;\n /** WebSocket subprotocols */\n readonly protocols?: string[];\n /** Authentication token or function that returns a token */\n readonly authToken?: string | (() => string | Promise<string>);\n /** Interval between heartbeat pings (ms). Default: 30000 */\n readonly heartbeatInterval?: number;\n /** Timeout to wait for pong response (ms). Default: 10000 */\n readonly heartbeatTimeout?: number;\n /** Maximum delay between reconnection attempts (ms). Default: 30000 */\n readonly maxReconnectDelay?: number;\n}\n\n// =============================================================================\n// Connection State\n// =============================================================================\n\ntype ConnectionState =\n | { type: \"disconnected\" }\n | { type: \"connecting\" }\n | { type: \"authenticating\" }\n | { type: \"connected\" }\n | { type: \"reconnecting\"; attempt: number };\n\n// =============================================================================\n// WebSocket Transport Implementation\n// =============================================================================\n\n/**\n * Creates a WebSocket-based transport for real-time server communication.\n */\n/**\n * Build the WebSocket URL with optional document ID path.\n */\nconst buildWebSocketUrl = (baseUrl: string, documentId?: string): string => {\n if (!documentId) {\n return baseUrl;\n }\n // Remove trailing slash from base URL\n const normalizedBase = baseUrl.replace(/\\/+$/, \"\");\n // Encode the document ID for URL safety\n const encodedDocId = encodeURIComponent(documentId);\n return `${normalizedBase}/doc/${encodedDocId}`;\n};\n\nexport const make = (options: WebSocketTransportOptions): Transport.Transport => {\n const {\n url: baseUrl,\n documentId,\n protocols,\n authToken,\n onEvent,\n connectionTimeout = 10000,\n autoReconnect = true,\n maxReconnectAttempts = 10,\n reconnectDelay = 1000,\n maxReconnectDelay = 30000,\n heartbeatInterval = 30000,\n heartbeatTimeout = 10000,\n } = options;\n\n // Build the full URL with document ID if provided\n const url = buildWebSocketUrl(baseUrl, documentId);\n\n // ==========================================================================\n // Internal State\n // ==========================================================================\n\n let _state: ConnectionState = { type: \"disconnected\" };\n let _ws: WebSocket | null = null;\n let _messageHandlers: Set<(message: Transport.ServerMessage) => void> = new Set();\n\n // Timers\n let _connectionTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n let _heartbeatIntervalHandle: ReturnType<typeof setInterval> | null = null;\n let _heartbeatTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n let _reconnectTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n\n // Message queue for messages sent while reconnecting\n let _messageQueue: Transport.ClientMessage[] = [];\n\n // Promise resolvers for connect()\n let _connectResolver: (() => void) | null = null;\n let _connectRejecter: ((error: Error) => void) | null = null;\n\n // Track reconnection attempt count (persists through connecting state)\n let _reconnectAttempt = 0;\n\n // ==========================================================================\n // Helper Functions\n // ==========================================================================\n\n const emit = (handler: Transport.TransportEventHandler | undefined, event: Parameters<Transport.TransportEventHandler>[0]) => {\n handler?.(event);\n };\n\n /**\n * Encodes a client message for network transport.\n */\n const encodeClientMessage = (message: Transport.ClientMessage): Transport.EncodedClientMessage => {\n if (message.type === \"submit\") {\n return {\n type: \"submit\",\n transaction: Transaction.encode(message.transaction),\n };\n }\n return message;\n };\n\n /**\n * Decodes a server message from network transport.\n */\n const decodeServerMessage = (encoded: Transport.EncodedServerMessage): Transport.ServerMessage => {\n if (encoded.type === \"transaction\") {\n return {\n type: \"transaction\",\n transaction: Transaction.decode(encoded.transaction),\n version: encoded.version,\n };\n }\n return encoded;\n };\n\n /**\n * Sends a raw message over the WebSocket.\n */\n const sendRaw = (message: Transport.ClientMessage): void => {\n if (_ws && _ws.readyState === WebSocket.OPEN) {\n _ws.send(JSON.stringify(encodeClientMessage(message)));\n }\n };\n\n /**\n * Clears all active timers.\n */\n const clearTimers = (): void => {\n if (_connectionTimeoutHandle) {\n clearTimeout(_connectionTimeoutHandle);\n _connectionTimeoutHandle = null;\n }\n if (_heartbeatIntervalHandle) {\n clearInterval(_heartbeatIntervalHandle);\n _heartbeatIntervalHandle = null;\n }\n if (_heartbeatTimeoutHandle) {\n clearTimeout(_heartbeatTimeoutHandle);\n _heartbeatTimeoutHandle = null;\n }\n if (_reconnectTimeoutHandle) {\n clearTimeout(_reconnectTimeoutHandle);\n _reconnectTimeoutHandle = null;\n }\n };\n\n /**\n * Starts the heartbeat mechanism.\n */\n const startHeartbeat = (): void => {\n stopHeartbeat();\n\n _heartbeatIntervalHandle = setInterval(() => {\n if (_state.type !== \"connected\") return;\n\n // Send ping\n sendRaw({ type: \"ping\" });\n\n // Set timeout for pong response\n _heartbeatTimeoutHandle = setTimeout(() => {\n // No pong received - connection is dead\n handleConnectionLost(\"Heartbeat timeout\");\n }, heartbeatTimeout);\n }, heartbeatInterval);\n };\n\n /**\n * Stops the heartbeat mechanism.\n */\n const stopHeartbeat = (): void => {\n if (_heartbeatIntervalHandle) {\n clearInterval(_heartbeatIntervalHandle);\n _heartbeatIntervalHandle = null;\n }\n if (_heartbeatTimeoutHandle) {\n clearTimeout(_heartbeatTimeoutHandle);\n _heartbeatTimeoutHandle = null;\n }\n };\n\n /**\n * Handles pong response - clears the heartbeat timeout.\n */\n const handlePong = (): void => {\n if (_heartbeatTimeoutHandle) {\n clearTimeout(_heartbeatTimeoutHandle);\n _heartbeatTimeoutHandle = null;\n }\n };\n\n /**\n * Flushes the message queue after reconnection.\n */\n const flushMessageQueue = (): void => {\n const queue = _messageQueue;\n _messageQueue = [];\n for (const message of queue) {\n sendRaw(message);\n }\n };\n\n /**\n * Calculates reconnection delay with exponential backoff.\n */\n const getReconnectDelay = (attempt: number): number => {\n const delay = reconnectDelay * Math.pow(2, attempt);\n return Math.min(delay, maxReconnectDelay);\n };\n\n /**\n * Resolves the auth token (handles both string and function).\n * Returns empty string if no token is configured.\n */\n const resolveAuthToken = async (): Promise<string> => {\n if (!authToken) return \"\";\n if (typeof authToken === \"string\") return authToken;\n return authToken();\n };\n\n /**\n * Performs authentication after connection.\n * Always sends an auth message (even with empty token) to trigger server auth flow.\n */\n const authenticate = async (): Promise<void> => {\n const token = await resolveAuthToken();\n _state = { type: \"authenticating\" };\n sendRaw({ type: \"auth\", token });\n };\n\n /**\n * Handles authentication result from server.\n */\n const handleAuthResult = (success: boolean, error?: string): void => {\n if (!success) {\n const authError = new AuthenticationError(error || \"Authentication failed\");\n cleanup();\n _connectRejecter?.(authError);\n _connectResolver = null;\n _connectRejecter = null;\n emit(onEvent, { type: \"error\", error: authError });\n return;\n }\n\n // Auth successful - complete connection\n completeConnection();\n };\n\n /**\n * Completes the connection process.\n */\n const completeConnection = (): void => {\n _state = { type: \"connected\" };\n\n // Reset reconnection attempt counter on successful connection\n _reconnectAttempt = 0;\n\n // Clear connection timeout\n if (_connectionTimeoutHandle) {\n clearTimeout(_connectionTimeoutHandle);\n _connectionTimeoutHandle = null;\n }\n\n // Start heartbeat\n startHeartbeat();\n\n // Flush any queued messages\n flushMessageQueue();\n\n // Resolve connect promise\n _connectResolver?.();\n _connectResolver = null;\n _connectRejecter = null;\n\n emit(onEvent, { type: \"connected\" });\n };\n\n /**\n * Cleans up WebSocket and related state.\n */\n const cleanup = (): void => {\n clearTimers();\n\n if (_ws) {\n // Remove listeners to prevent callbacks\n _ws.onopen = null;\n _ws.onclose = null;\n _ws.onerror = null;\n _ws.onmessage = null;\n \n if (_ws.readyState === WebSocket.OPEN || _ws.readyState === WebSocket.CONNECTING) {\n _ws.close();\n }\n _ws = null;\n }\n };\n\n /**\n * Handles connection lost - initiates reconnection if enabled.\n */\n const handleConnectionLost = (reason?: string): void => {\n cleanup();\n\n if (_state.type === \"disconnected\") return;\n\n const wasInitialConnect = _connectRejecter !== null;\n\n if (wasInitialConnect) {\n // Failed during initial connection\n _state = { type: \"disconnected\" };\n _reconnectAttempt = 0;\n _connectRejecter!(new WebSocketError(\"Connection failed\", undefined, reason));\n _connectResolver = null;\n _connectRejecter = null;\n emit(onEvent, { type: \"disconnected\", reason });\n return;\n }\n\n if (!autoReconnect) {\n _state = { type: \"disconnected\" };\n _reconnectAttempt = 0;\n emit(onEvent, { type: \"disconnected\", reason });\n return;\n }\n\n _reconnectAttempt++;\n\n if (_reconnectAttempt > maxReconnectAttempts) {\n _state = { type: \"disconnected\" };\n _reconnectAttempt = 0;\n emit(onEvent, { type: \"disconnected\", reason: \"Max reconnection attempts reached\" });\n return;\n }\n\n // Enter reconnecting state\n _state = { type: \"reconnecting\", attempt: _reconnectAttempt };\n emit(onEvent, { type: \"reconnecting\", attempt: _reconnectAttempt });\n\n // Schedule reconnection\n const delay = getReconnectDelay(_reconnectAttempt - 1);\n _reconnectTimeoutHandle = setTimeout(() => {\n _reconnectTimeoutHandle = null;\n attemptConnection();\n }, delay);\n };\n\n /**\n * Attempts to establish WebSocket connection.\n */\n const attemptConnection = (): void => {\n if (_state.type === \"connected\") return;\n\n _state = { type: \"connecting\" };\n\n try {\n _ws = new WebSocket(url, protocols);\n } catch (error) {\n handleConnectionLost((error as Error).message);\n return;\n }\n\n // Set connection timeout\n _connectionTimeoutHandle = setTimeout(() => {\n _connectionTimeoutHandle = null;\n handleConnectionLost(\"Connection timeout\");\n }, connectionTimeout);\n\n _ws.onopen = async () => {\n // Clear connection timeout\n if (_connectionTimeoutHandle) {\n clearTimeout(_connectionTimeoutHandle);\n _connectionTimeoutHandle = null;\n }\n\n try {\n // Always authenticate (even with empty token) to trigger server auth flow\n await authenticate();\n // Connection completes after auth_result is received\n } catch (error) {\n handleConnectionLost((error as Error).message);\n }\n };\n\n _ws.onclose = (event) => {\n handleConnectionLost(event.reason || `Connection closed (code: ${event.code})`);\n };\n\n _ws.onerror = () => {\n // Error details come through onclose\n };\n\n _ws.onmessage = (event) => {\n try {\n const encoded = JSON.parse(event.data as string) as Transport.EncodedServerMessage;\n const message = decodeServerMessage(encoded);\n handleMessage(message);\n } catch {\n // Invalid message - ignore\n }\n };\n };\n\n /**\n * Handles incoming server messages.\n */\n const handleMessage = (message: Transport.ServerMessage): void => {\n // Handle internal messages\n if (message.type === \"pong\") {\n handlePong();\n return;\n }\n\n if (message.type === \"auth_result\") {\n handleAuthResult(message.success, message.error);\n return;\n }\n\n // Forward to subscribers\n for (const handler of _messageHandlers) {\n try {\n handler(message);\n } catch {\n // Ignore handler errors\n }\n }\n };\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n\n const transport: Transport.Transport = {\n send: (transaction: Transaction.Transaction): void => {\n const message: Transport.ClientMessage = { type: \"submit\", transaction };\n\n if (_state.type === \"connected\") {\n sendRaw(message);\n } else if (_state.type === \"reconnecting\") {\n // Queue message for when we reconnect\n _messageQueue.push(message);\n }\n // If disconnected, silently drop (caller should check isConnected)\n },\n\n requestSnapshot: (): void => {\n const message: Transport.ClientMessage = { type: \"request_snapshot\" };\n\n if (_state.type === \"connected\") {\n sendRaw(message);\n } else if (_state.type === \"reconnecting\") {\n _messageQueue.push(message);\n }\n },\n\n subscribe: (handler: (message: Transport.ServerMessage) => void): (() => void) => {\n _messageHandlers.add(handler);\n return () => {\n _messageHandlers.delete(handler);\n };\n },\n\n connect: async (): Promise<void> => {\n if (_state.type === \"connected\") {\n return;\n }\n\n if (_state.type === \"connecting\" || _state.type === \"authenticating\") {\n // Already connecting - wait for existing promise\n return new Promise((resolve, reject) => {\n const existingResolver = _connectResolver;\n const existingRejecter = _connectRejecter;\n _connectResolver = () => {\n existingResolver?.();\n resolve();\n };\n _connectRejecter = (error) => {\n existingRejecter?.(error);\n reject(error);\n };\n });\n }\n\n return new Promise((resolve, reject) => {\n _connectResolver = resolve;\n _connectRejecter = reject;\n attemptConnection();\n });\n },\n\n disconnect: (): void => {\n // Cancel any pending reconnection\n if (_reconnectTimeoutHandle) {\n clearTimeout(_reconnectTimeoutHandle);\n _reconnectTimeoutHandle = null;\n }\n\n // Reject any pending connect promise\n if (_connectRejecter) {\n _connectRejecter(new WebSocketError(\"Disconnected by user\"));\n _connectResolver = null;\n _connectRejecter = null;\n }\n\n // Clean up\n cleanup();\n _state = { type: \"disconnected\" };\n _reconnectAttempt = 0;\n _messageQueue = [];\n\n emit(onEvent, { type: \"disconnected\", reason: \"User disconnected\" });\n },\n\n isConnected: (): boolean => {\n return _state.type === \"connected\";\n },\n\n // =========================================================================\n // Presence Methods\n // =========================================================================\n\n sendPresenceSet: (data: unknown): void => {\n const message: Transport.ClientMessage = { type: \"presence_set\", data };\n\n if (_state.type === \"connected\") {\n sendRaw(message);\n } else if (_state.type === \"reconnecting\") {\n // Remove all set messages from the message queue\n _messageQueue = _messageQueue.filter((message) => message.type !== \"presence_set\");\n // Add the new presence set message to the queue\n _messageQueue.push(message);\n }\n },\n\n sendPresenceClear: (): void => {\n const message: Transport.ClientMessage = { type: \"presence_clear\" };\n\n if (_state.type === \"connected\") {\n sendRaw(message);\n } else if (_state.type === \"reconnecting\") {\n // Remove all clear messages from the message queue\n _messageQueue = _messageQueue.filter((message) => message.type !== \"presence_clear\");\n // Add the new presence clear message to the queue\n _messageQueue.push(message);\n }\n },\n };\n\n return transport;\n};\n"],"mappings":";;;;;;;;;;;;AAkDA,MAAM,qBAAqB,SAAiB,eAAgC;AAC1E,KAAI,CAAC,WACH,QAAO;AAMT,QAAO,GAHgB,QAAQ,QAAQ,QAAQ,GAAG,CAGzB,OADJ,mBAAmB,WAAW;;AAIrD,MAAa,QAAQ,YAA4D;CAC/E,MAAM,EACJ,KAAK,SACL,YACA,WACA,WACA,SACA,oBAAoB,KACpB,gBAAgB,MAChB,uBAAuB,IACvB,iBAAiB,KACjB,oBAAoB,KACpB,oBAAoB,KACpB,mBAAmB,QACjB;CAGJ,MAAM,MAAM,kBAAkB,SAAS,WAAW;CAMlD,IAAIA,SAA0B,EAAE,MAAM,gBAAgB;CACtD,IAAIC,MAAwB;CAC5B,IAAIC,mCAAoE,IAAI,KAAK;CAGjF,IAAIC,2BAAiE;CACrE,IAAIC,2BAAkE;CACtE,IAAIC,0BAAgE;CACpE,IAAIC,0BAAgE;CAGpE,IAAIC,gBAA2C,EAAE;CAGjD,IAAIC,mBAAwC;CAC5C,IAAIC,mBAAoD;CAGxD,IAAI,oBAAoB;CAMxB,MAAM,QAAQ,SAAsD,UAA0D;AAC5H,oDAAU,MAAM;;;;;CAMlB,MAAM,uBAAuB,YAAqE;AAChG,MAAI,QAAQ,SAAS,SACnB,QAAO;GACL,MAAM;GACN,aAAaC,OAAmB,QAAQ,YAAY;GACrD;AAEH,SAAO;;;;;CAMT,MAAM,uBAAuB,YAAqE;AAChG,MAAI,QAAQ,SAAS,cACnB,QAAO;GACL,MAAM;GACN,aAAaC,OAAmB,QAAQ,YAAY;GACpD,SAAS,QAAQ;GAClB;AAEH,SAAO;;;;;CAMT,MAAM,WAAW,YAA2C;AAC1D,MAAI,OAAO,IAAI,eAAe,UAAU,KACtC,KAAI,KAAK,KAAK,UAAU,oBAAoB,QAAQ,CAAC,CAAC;;;;;CAO1D,MAAM,oBAA0B;AAC9B,MAAI,0BAA0B;AAC5B,gBAAa,yBAAyB;AACtC,8BAA2B;;AAE7B,MAAI,0BAA0B;AAC5B,iBAAc,yBAAyB;AACvC,8BAA2B;;AAE7B,MAAI,yBAAyB;AAC3B,gBAAa,wBAAwB;AACrC,6BAA0B;;AAE5B,MAAI,yBAAyB;AAC3B,gBAAa,wBAAwB;AACrC,6BAA0B;;;;;;CAO9B,MAAM,uBAA6B;AACjC,iBAAe;AAEf,6BAA2B,kBAAkB;AAC3C,OAAI,OAAO,SAAS,YAAa;AAGjC,WAAQ,EAAE,MAAM,QAAQ,CAAC;AAGzB,6BAA0B,iBAAiB;AAEzC,yBAAqB,oBAAoB;MACxC,iBAAiB;KACnB,kBAAkB;;;;;CAMvB,MAAM,sBAA4B;AAChC,MAAI,0BAA0B;AAC5B,iBAAc,yBAAyB;AACvC,8BAA2B;;AAE7B,MAAI,yBAAyB;AAC3B,gBAAa,wBAAwB;AACrC,6BAA0B;;;;;;CAO9B,MAAM,mBAAyB;AAC7B,MAAI,yBAAyB;AAC3B,gBAAa,wBAAwB;AACrC,6BAA0B;;;;;;CAO9B,MAAM,0BAAgC;EACpC,MAAM,QAAQ;AACd,kBAAgB,EAAE;AAClB,OAAK,MAAM,WAAW,MACpB,SAAQ,QAAQ;;;;;CAOpB,MAAM,qBAAqB,YAA4B;EACrD,MAAM,QAAQ,iBAAiB,KAAK,IAAI,GAAG,QAAQ;AACnD,SAAO,KAAK,IAAI,OAAO,kBAAkB;;;;;;CAO3C,MAAM,mBAAmB,YAA6B;AACpD,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,OAAO,cAAc,SAAU,QAAO;AAC1C,SAAO,WAAW;;;;;;CAOpB,MAAM,eAAe,YAA2B;EAC9C,MAAM,QAAQ,MAAM,kBAAkB;AACtC,WAAS,EAAE,MAAM,kBAAkB;AACnC,UAAQ;GAAE,MAAM;GAAQ;GAAO,CAAC;;;;;CAMlC,MAAM,oBAAoB,SAAkB,UAAyB;AACnE,MAAI,CAAC,SAAS;GACZ,MAAM,YAAY,IAAI,oBAAoB,SAAS,wBAAwB;AAC3E,YAAS;AACT,gFAAmB,UAAU;AAC7B,sBAAmB;AACnB,sBAAmB;AACnB,QAAK,SAAS;IAAE,MAAM;IAAS,OAAO;IAAW,CAAC;AAClD;;AAIF,sBAAoB;;;;;CAMtB,MAAM,2BAAiC;AACrC,WAAS,EAAE,MAAM,aAAa;AAG9B,sBAAoB;AAGpB,MAAI,0BAA0B;AAC5B,gBAAa,yBAAyB;AACtC,8BAA2B;;AAI7B,kBAAgB;AAGhB,qBAAmB;AAGnB,gFAAoB;AACpB,qBAAmB;AACnB,qBAAmB;AAEnB,OAAK,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;CAMtC,MAAM,gBAAsB;AAC1B,eAAa;AAEb,MAAI,KAAK;AAEP,OAAI,SAAS;AACb,OAAI,UAAU;AACd,OAAI,UAAU;AACd,OAAI,YAAY;AAEhB,OAAI,IAAI,eAAe,UAAU,QAAQ,IAAI,eAAe,UAAU,WACpE,KAAI,OAAO;AAEb,SAAM;;;;;;CAOV,MAAM,wBAAwB,WAA0B;AACtD,WAAS;AAET,MAAI,OAAO,SAAS,eAAgB;AAIpC,MAF0B,qBAAqB,MAExB;AAErB,YAAS,EAAE,MAAM,gBAAgB;AACjC,uBAAoB;AACpB,oBAAkB,IAAI,eAAe,qBAAqB,QAAW,OAAO,CAAC;AAC7E,sBAAmB;AACnB,sBAAmB;AACnB,QAAK,SAAS;IAAE,MAAM;IAAgB;IAAQ,CAAC;AAC/C;;AAGF,MAAI,CAAC,eAAe;AAClB,YAAS,EAAE,MAAM,gBAAgB;AACjC,uBAAoB;AACpB,QAAK,SAAS;IAAE,MAAM;IAAgB;IAAQ,CAAC;AAC/C;;AAGF;AAEA,MAAI,oBAAoB,sBAAsB;AAC5C,YAAS,EAAE,MAAM,gBAAgB;AACjC,uBAAoB;AACpB,QAAK,SAAS;IAAE,MAAM;IAAgB,QAAQ;IAAqC,CAAC;AACpF;;AAIF,WAAS;GAAE,MAAM;GAAgB,SAAS;GAAmB;AAC7D,OAAK,SAAS;GAAE,MAAM;GAAgB,SAAS;GAAmB,CAAC;EAGnE,MAAM,QAAQ,kBAAkB,oBAAoB,EAAE;AACtD,4BAA0B,iBAAiB;AACzC,6BAA0B;AAC1B,sBAAmB;KAClB,MAAM;;;;;CAMX,MAAM,0BAAgC;AACpC,MAAI,OAAO,SAAS,YAAa;AAEjC,WAAS,EAAE,MAAM,cAAc;AAE/B,MAAI;AACF,SAAM,IAAI,UAAU,KAAK,UAAU;WAC5B,OAAO;AACd,wBAAsB,MAAgB,QAAQ;AAC9C;;AAIF,6BAA2B,iBAAiB;AAC1C,8BAA2B;AAC3B,wBAAqB,qBAAqB;KACzC,kBAAkB;AAErB,MAAI,SAAS,YAAY;AAEvB,OAAI,0BAA0B;AAC5B,iBAAa,yBAAyB;AACtC,+BAA2B;;AAG7B,OAAI;AAEF,UAAM,cAAc;YAEb,OAAO;AACd,yBAAsB,MAAgB,QAAQ;;;AAIlD,MAAI,WAAW,UAAU;AACvB,wBAAqB,MAAM,UAAU,4BAA4B,MAAM,KAAK,GAAG;;AAGjF,MAAI,gBAAgB;AAIpB,MAAI,aAAa,UAAU;AACzB,OAAI;AAGF,kBADgB,oBADA,KAAK,MAAM,MAAM,KAAe,CACJ,CACtB;qBAChB;;;;;;CASZ,MAAM,iBAAiB,YAA2C;AAEhE,MAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAY;AACZ;;AAGF,MAAI,QAAQ,SAAS,eAAe;AAClC,oBAAiB,QAAQ,SAAS,QAAQ,MAAM;AAChD;;AAIF,OAAK,MAAM,WAAW,iBACpB,KAAI;AACF,WAAQ,QAAQ;qBACV;;AA8HZ,QApHuC;EACrC,OAAO,gBAA+C;GACpD,MAAMC,UAAmC;IAAE,MAAM;IAAU;IAAa;AAExE,OAAI,OAAO,SAAS,YAClB,SAAQ,QAAQ;YACP,OAAO,SAAS,eAEzB,eAAc,KAAK,QAAQ;;EAK/B,uBAA6B;GAC3B,MAAMA,UAAmC,EAAE,MAAM,oBAAoB;AAErE,OAAI,OAAO,SAAS,YAClB,SAAQ,QAAQ;YACP,OAAO,SAAS,eACzB,eAAc,KAAK,QAAQ;;EAI/B,YAAY,YAAsE;AAChF,oBAAiB,IAAI,QAAQ;AAC7B,gBAAa;AACX,qBAAiB,OAAO,QAAQ;;;EAIpC,SAAS,YAA2B;AAClC,OAAI,OAAO,SAAS,YAClB;AAGF,OAAI,OAAO,SAAS,gBAAgB,OAAO,SAAS,iBAElD,QAAO,IAAI,SAAS,SAAS,WAAW;IACtC,MAAM,mBAAmB;IACzB,MAAM,mBAAmB;AACzB,6BAAyB;AACvB,mFAAoB;AACpB,cAAS;;AAEX,wBAAoB,UAAU;AAC5B,kFAAmB,MAAM;AACzB,YAAO,MAAM;;KAEf;AAGJ,UAAO,IAAI,SAAS,SAAS,WAAW;AACtC,uBAAmB;AACnB,uBAAmB;AACnB,uBAAmB;KACnB;;EAGJ,kBAAwB;AAEtB,OAAI,yBAAyB;AAC3B,iBAAa,wBAAwB;AACrC,8BAA0B;;AAI5B,OAAI,kBAAkB;AACpB,qBAAiB,IAAI,eAAe,uBAAuB,CAAC;AAC5D,uBAAmB;AACnB,uBAAmB;;AAIrB,YAAS;AACT,YAAS,EAAE,MAAM,gBAAgB;AACjC,uBAAoB;AACpB,mBAAgB,EAAE;AAElB,QAAK,SAAS;IAAE,MAAM;IAAgB,QAAQ;IAAqB,CAAC;;EAGtE,mBAA4B;AAC1B,UAAO,OAAO,SAAS;;EAOzB,kBAAkB,SAAwB;GACxC,MAAMA,UAAmC;IAAE,MAAM;IAAgB;IAAM;AAEvE,OAAI,OAAO,SAAS,YAClB,SAAQ,QAAQ;YACP,OAAO,SAAS,gBAAgB;AAEzC,oBAAgB,cAAc,QAAQ,cAAYC,UAAQ,SAAS,eAAe;AAElF,kBAAc,KAAK,QAAQ;;;EAI/B,yBAA+B;GAC7B,MAAMD,UAAmC,EAAE,MAAM,kBAAkB;AAEnE,OAAI,OAAO,SAAS,YAClB,SAAQ,QAAQ;YACP,OAAO,SAAS,gBAAgB;AAEzC,oBAAgB,cAAc,QAAQ,cAAYC,UAAQ,SAAS,iBAAiB;AAEpF,kBAAc,KAAK,QAAQ;;;EAGhC"}
@@ -0,0 +1,135 @@
1
+ const require_defineProperty = require('../_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs');
2
+
3
+ //#region src/client/errors.ts
4
+ /**
5
+ * Base error class for all mimic-client errors.
6
+ */
7
+ var MimicClientError = class extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ require_defineProperty._defineProperty(this, "_tag", "MimicClientError");
11
+ this.name = "MimicClientError";
12
+ }
13
+ };
14
+ /**
15
+ * Error thrown when a transaction is rejected by the server.
16
+ */
17
+ var TransactionRejectedError = class extends MimicClientError {
18
+ constructor(transaction, reason) {
19
+ super(`Transaction ${transaction.id} rejected: ${reason}`);
20
+ require_defineProperty._defineProperty(this, "_tag", "TransactionRejectedError");
21
+ require_defineProperty._defineProperty(this, "transaction", void 0);
22
+ require_defineProperty._defineProperty(this, "reason", void 0);
23
+ this.name = "TransactionRejectedError";
24
+ this.transaction = transaction;
25
+ this.reason = reason;
26
+ }
27
+ };
28
+ /**
29
+ * Error thrown when the transport is not connected.
30
+ */
31
+ var NotConnectedError = class extends MimicClientError {
32
+ constructor() {
33
+ super("Transport is not connected");
34
+ require_defineProperty._defineProperty(this, "_tag", "NotConnectedError");
35
+ this.name = "NotConnectedError";
36
+ }
37
+ };
38
+ /**
39
+ * Error thrown when connection to the server fails.
40
+ */
41
+ var ConnectionError = class extends MimicClientError {
42
+ constructor(message, cause) {
43
+ super(message);
44
+ require_defineProperty._defineProperty(this, "_tag", "ConnectionError");
45
+ require_defineProperty._defineProperty(this, "cause", void 0);
46
+ this.name = "ConnectionError";
47
+ this.cause = cause;
48
+ }
49
+ };
50
+ /**
51
+ * Error thrown when state drift is detected and cannot be recovered.
52
+ */
53
+ var StateDriftError = class extends MimicClientError {
54
+ constructor(expectedVersion, receivedVersion) {
55
+ super(`State drift detected: expected version ${expectedVersion}, received ${receivedVersion}`);
56
+ require_defineProperty._defineProperty(this, "_tag", "StateDriftError");
57
+ require_defineProperty._defineProperty(this, "expectedVersion", void 0);
58
+ require_defineProperty._defineProperty(this, "receivedVersion", void 0);
59
+ this.name = "StateDriftError";
60
+ this.expectedVersion = expectedVersion;
61
+ this.receivedVersion = receivedVersion;
62
+ }
63
+ };
64
+ /**
65
+ * Error thrown when a pending transaction times out waiting for confirmation.
66
+ */
67
+ var TransactionTimeoutError = class extends MimicClientError {
68
+ constructor(transaction, timeoutMs) {
69
+ super(`Transaction ${transaction.id} timed out after ${timeoutMs}ms waiting for confirmation`);
70
+ require_defineProperty._defineProperty(this, "_tag", "TransactionTimeoutError");
71
+ require_defineProperty._defineProperty(this, "transaction", void 0);
72
+ require_defineProperty._defineProperty(this, "timeoutMs", void 0);
73
+ this.name = "TransactionTimeoutError";
74
+ this.transaction = transaction;
75
+ this.timeoutMs = timeoutMs;
76
+ }
77
+ };
78
+ /**
79
+ * Error thrown when rebasing operations fails.
80
+ */
81
+ var RebaseError = class extends MimicClientError {
82
+ constructor(transactionId, message) {
83
+ super(`Failed to rebase transaction ${transactionId}: ${message}`);
84
+ require_defineProperty._defineProperty(this, "_tag", "RebaseError");
85
+ require_defineProperty._defineProperty(this, "transactionId", void 0);
86
+ this.name = "RebaseError";
87
+ this.transactionId = transactionId;
88
+ }
89
+ };
90
+ /**
91
+ * Error thrown when the client document is in an invalid state.
92
+ */
93
+ var InvalidStateError = class extends MimicClientError {
94
+ constructor(message) {
95
+ super(message);
96
+ require_defineProperty._defineProperty(this, "_tag", "InvalidStateError");
97
+ this.name = "InvalidStateError";
98
+ }
99
+ };
100
+ /**
101
+ * Error thrown when WebSocket connection or communication fails.
102
+ */
103
+ var WebSocketError = class extends MimicClientError {
104
+ constructor(message, code, reason) {
105
+ super(message);
106
+ require_defineProperty._defineProperty(this, "_tag", "WebSocketError");
107
+ require_defineProperty._defineProperty(this, "code", void 0);
108
+ require_defineProperty._defineProperty(this, "reason", void 0);
109
+ this.name = "WebSocketError";
110
+ this.code = code;
111
+ this.reason = reason;
112
+ }
113
+ };
114
+ /**
115
+ * Error thrown when authentication fails.
116
+ */
117
+ var AuthenticationError = class extends MimicClientError {
118
+ constructor(message) {
119
+ super(message);
120
+ require_defineProperty._defineProperty(this, "_tag", "AuthenticationError");
121
+ this.name = "AuthenticationError";
122
+ }
123
+ };
124
+
125
+ //#endregion
126
+ exports.AuthenticationError = AuthenticationError;
127
+ exports.ConnectionError = ConnectionError;
128
+ exports.InvalidStateError = InvalidStateError;
129
+ exports.MimicClientError = MimicClientError;
130
+ exports.NotConnectedError = NotConnectedError;
131
+ exports.RebaseError = RebaseError;
132
+ exports.StateDriftError = StateDriftError;
133
+ exports.TransactionRejectedError = TransactionRejectedError;
134
+ exports.TransactionTimeoutError = TransactionTimeoutError;
135
+ exports.WebSocketError = WebSocketError;
@@ -0,0 +1,87 @@
1
+ import { Transaction } from "../Transaction.cjs";
2
+
3
+ //#region src/client/errors.d.ts
4
+
5
+ /**
6
+ * Base error class for all mimic-client errors.
7
+ */
8
+ declare class MimicClientError extends Error {
9
+ readonly _tag: string;
10
+ constructor(message: string);
11
+ }
12
+ /**
13
+ * Error thrown when a transaction is rejected by the server.
14
+ */
15
+ declare class TransactionRejectedError extends MimicClientError {
16
+ readonly _tag = "TransactionRejectedError";
17
+ readonly transaction: Transaction;
18
+ readonly reason: string;
19
+ constructor(transaction: Transaction, reason: string);
20
+ }
21
+ /**
22
+ * Error thrown when the transport is not connected.
23
+ */
24
+ declare class NotConnectedError extends MimicClientError {
25
+ readonly _tag = "NotConnectedError";
26
+ constructor();
27
+ }
28
+ /**
29
+ * Error thrown when connection to the server fails.
30
+ */
31
+ declare class ConnectionError extends MimicClientError {
32
+ readonly _tag = "ConnectionError";
33
+ readonly cause?: Error;
34
+ constructor(message: string, cause?: Error);
35
+ }
36
+ /**
37
+ * Error thrown when state drift is detected and cannot be recovered.
38
+ */
39
+ declare class StateDriftError extends MimicClientError {
40
+ readonly _tag = "StateDriftError";
41
+ readonly expectedVersion: number;
42
+ readonly receivedVersion: number;
43
+ constructor(expectedVersion: number, receivedVersion: number);
44
+ }
45
+ /**
46
+ * Error thrown when a pending transaction times out waiting for confirmation.
47
+ */
48
+ declare class TransactionTimeoutError extends MimicClientError {
49
+ readonly _tag = "TransactionTimeoutError";
50
+ readonly transaction: Transaction;
51
+ readonly timeoutMs: number;
52
+ constructor(transaction: Transaction, timeoutMs: number);
53
+ }
54
+ /**
55
+ * Error thrown when rebasing operations fails.
56
+ */
57
+ declare class RebaseError extends MimicClientError {
58
+ readonly _tag = "RebaseError";
59
+ readonly transactionId: string;
60
+ constructor(transactionId: string, message: string);
61
+ }
62
+ /**
63
+ * Error thrown when the client document is in an invalid state.
64
+ */
65
+ declare class InvalidStateError extends MimicClientError {
66
+ readonly _tag = "InvalidStateError";
67
+ constructor(message: string);
68
+ }
69
+ /**
70
+ * Error thrown when WebSocket connection or communication fails.
71
+ */
72
+ declare class WebSocketError extends MimicClientError {
73
+ readonly _tag = "WebSocketError";
74
+ readonly code?: number;
75
+ readonly reason?: string;
76
+ constructor(message: string, code?: number, reason?: string);
77
+ }
78
+ /**
79
+ * Error thrown when authentication fails.
80
+ */
81
+ declare class AuthenticationError extends MimicClientError {
82
+ readonly _tag = "AuthenticationError";
83
+ constructor(message: string);
84
+ }
85
+ //#endregion
86
+ export { AuthenticationError, ConnectionError, InvalidStateError, MimicClientError, NotConnectedError, RebaseError, StateDriftError, TransactionRejectedError, TransactionTimeoutError, WebSocketError };
87
+ //# sourceMappingURL=errors.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.cts","names":[],"sources":["../../src/client/errors.ts"],"sourcesContent":[],"mappings":";;;;;;AASA;AAWa,cAXA,gBAAA,SAAyB,KAAA,CAWA;EAEd,SAAA,IAAA,EAAA,MAAA;EAGG,WAAA,CAAA,OAAA,EAAA,MAAA;;;AAW3B;AAWA;AAE4B,cA7Bf,wBAAA,SAAiC,gBAAA,CA6BlB;EAEW,SAAA,IAAA,GAAA,0BAAA;EAJF,SAAA,WAAA,EAzBb,WAyBa;EAAgB,SAAA,MAAA,EAAA,MAAA;EAcxC,WAAA,CAAA,WAAgB,EApCF,WAoC0B,EAAA,MAAA,EAAA,MAAA;AAkBrD;;;;AAA6D,cA3ChD,iBAAA,SAA0B,gBAAA,CA2CsB;EAkBhD,SAAA,IAAA,GAAY,mBAAQ;EAcpB,WAAA,CAAA;AAWb;AAgBA;;;cA3Fa,eAAA,SAAwB,gBAAA;;mBAET;uCAEW;;;;;cAU1B,eAAA,SAAwB,gBAAA;;;;;;;;;cAkBxB,uBAAA,SAAgC,gBAAA;;wBAErB;;2BAGG;;;;;cAad,WAAA,SAAoB,gBAAA;;;;;;;;cAcpB,iBAAA,SAA0B,gBAAA;;;;;;;cAW1B,cAAA,SAAuB,gBAAA;;;;;;;;;cAgBvB,mBAAA,SAA4B,gBAAA"}