@voidhash/mimic-effect 0.0.9 → 1.0.0-beta.2

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 (227) hide show
  1. package/.turbo/turbo-build.log +136 -90
  2. package/README.md +385 -0
  3. package/dist/ColdStorage.cjs +60 -0
  4. package/dist/ColdStorage.d.cts +53 -0
  5. package/dist/ColdStorage.d.cts.map +1 -0
  6. package/dist/ColdStorage.d.mts +53 -0
  7. package/dist/ColdStorage.d.mts.map +1 -0
  8. package/dist/ColdStorage.mjs +60 -0
  9. package/dist/ColdStorage.mjs.map +1 -0
  10. package/dist/DocumentManager.cjs +263 -82
  11. package/dist/DocumentManager.d.cts +44 -22
  12. package/dist/DocumentManager.d.cts.map +1 -1
  13. package/dist/DocumentManager.d.mts +44 -22
  14. package/dist/DocumentManager.d.mts.map +1 -1
  15. package/dist/DocumentManager.mjs +259 -67
  16. package/dist/DocumentManager.mjs.map +1 -1
  17. package/dist/Errors.cjs +54 -0
  18. package/dist/Errors.d.cts +96 -0
  19. package/dist/Errors.d.cts.map +1 -0
  20. package/dist/Errors.d.mts +96 -0
  21. package/dist/Errors.d.mts.map +1 -0
  22. package/dist/Errors.mjs +48 -0
  23. package/dist/Errors.mjs.map +1 -0
  24. package/dist/HotStorage.cjs +100 -0
  25. package/dist/HotStorage.d.cts +70 -0
  26. package/dist/HotStorage.d.cts.map +1 -0
  27. package/dist/HotStorage.d.mts +70 -0
  28. package/dist/HotStorage.d.mts.map +1 -0
  29. package/dist/HotStorage.mjs +100 -0
  30. package/dist/HotStorage.mjs.map +1 -0
  31. package/dist/Metrics.cjs +143 -0
  32. package/dist/Metrics.d.cts +31 -0
  33. package/dist/Metrics.d.cts.map +1 -0
  34. package/dist/Metrics.d.mts +31 -0
  35. package/dist/Metrics.d.mts.map +1 -0
  36. package/dist/Metrics.mjs +126 -0
  37. package/dist/Metrics.mjs.map +1 -0
  38. package/dist/MimicAuthService.cjs +61 -45
  39. package/dist/MimicAuthService.d.cts +61 -48
  40. package/dist/MimicAuthService.d.cts.map +1 -1
  41. package/dist/MimicAuthService.d.mts +61 -48
  42. package/dist/MimicAuthService.d.mts.map +1 -1
  43. package/dist/MimicAuthService.mjs +60 -36
  44. package/dist/MimicAuthService.mjs.map +1 -1
  45. package/dist/MimicClusterServerEngine.cjs +521 -0
  46. package/dist/MimicClusterServerEngine.d.cts +17 -0
  47. package/dist/MimicClusterServerEngine.d.cts.map +1 -0
  48. package/dist/MimicClusterServerEngine.d.mts +17 -0
  49. package/dist/MimicClusterServerEngine.d.mts.map +1 -0
  50. package/dist/MimicClusterServerEngine.mjs +523 -0
  51. package/dist/MimicClusterServerEngine.mjs.map +1 -0
  52. package/dist/MimicServer.cjs +205 -96
  53. package/dist/MimicServer.d.cts +9 -110
  54. package/dist/MimicServer.d.cts.map +1 -1
  55. package/dist/MimicServer.d.mts +9 -110
  56. package/dist/MimicServer.d.mts.map +1 -1
  57. package/dist/MimicServer.mjs +206 -90
  58. package/dist/MimicServer.mjs.map +1 -1
  59. package/dist/MimicServerEngine.cjs +97 -0
  60. package/dist/MimicServerEngine.d.cts +78 -0
  61. package/dist/MimicServerEngine.d.cts.map +1 -0
  62. package/dist/MimicServerEngine.d.mts +78 -0
  63. package/dist/MimicServerEngine.d.mts.map +1 -0
  64. package/dist/MimicServerEngine.mjs +97 -0
  65. package/dist/MimicServerEngine.mjs.map +1 -0
  66. package/dist/PresenceManager.cjs +75 -91
  67. package/dist/PresenceManager.d.cts +17 -66
  68. package/dist/PresenceManager.d.cts.map +1 -1
  69. package/dist/PresenceManager.d.mts +17 -66
  70. package/dist/PresenceManager.d.mts.map +1 -1
  71. package/dist/PresenceManager.mjs +74 -78
  72. package/dist/PresenceManager.mjs.map +1 -1
  73. package/dist/Protocol.cjs +146 -0
  74. package/dist/Protocol.d.cts +203 -0
  75. package/dist/Protocol.d.cts.map +1 -0
  76. package/dist/Protocol.d.mts +203 -0
  77. package/dist/Protocol.d.mts.map +1 -0
  78. package/dist/Protocol.mjs +132 -0
  79. package/dist/Protocol.mjs.map +1 -0
  80. package/dist/Types.d.cts +172 -0
  81. package/dist/Types.d.cts.map +1 -0
  82. package/dist/Types.d.mts +172 -0
  83. package/dist/Types.d.mts.map +1 -0
  84. package/dist/_virtual/rolldown_runtime.cjs +1 -25
  85. package/dist/_virtual/rolldown_runtime.mjs +4 -1
  86. package/dist/index.cjs +37 -75
  87. package/dist/index.d.cts +13 -12
  88. package/dist/index.d.mts +13 -12
  89. package/dist/index.mjs +12 -12
  90. package/dist/testing/ColdStorageTestSuite.cjs +508 -0
  91. package/dist/testing/ColdStorageTestSuite.d.cts +36 -0
  92. package/dist/testing/ColdStorageTestSuite.d.cts.map +1 -0
  93. package/dist/testing/ColdStorageTestSuite.d.mts +36 -0
  94. package/dist/testing/ColdStorageTestSuite.d.mts.map +1 -0
  95. package/dist/testing/ColdStorageTestSuite.mjs +508 -0
  96. package/dist/testing/ColdStorageTestSuite.mjs.map +1 -0
  97. package/dist/testing/FailingStorage.cjs +135 -0
  98. package/dist/testing/FailingStorage.d.cts +43 -0
  99. package/dist/testing/FailingStorage.d.cts.map +1 -0
  100. package/dist/testing/FailingStorage.d.mts +43 -0
  101. package/dist/testing/FailingStorage.d.mts.map +1 -0
  102. package/dist/testing/FailingStorage.mjs +136 -0
  103. package/dist/testing/FailingStorage.mjs.map +1 -0
  104. package/dist/testing/HotStorageTestSuite.cjs +585 -0
  105. package/dist/testing/HotStorageTestSuite.d.cts +40 -0
  106. package/dist/testing/HotStorageTestSuite.d.cts.map +1 -0
  107. package/dist/testing/HotStorageTestSuite.d.mts +40 -0
  108. package/dist/testing/HotStorageTestSuite.d.mts.map +1 -0
  109. package/dist/testing/HotStorageTestSuite.mjs +585 -0
  110. package/dist/testing/HotStorageTestSuite.mjs.map +1 -0
  111. package/dist/testing/StorageIntegrationTestSuite.cjs +349 -0
  112. package/dist/testing/StorageIntegrationTestSuite.d.cts +35 -0
  113. package/dist/testing/StorageIntegrationTestSuite.d.cts.map +1 -0
  114. package/dist/testing/StorageIntegrationTestSuite.d.mts +35 -0
  115. package/dist/testing/StorageIntegrationTestSuite.d.mts.map +1 -0
  116. package/dist/testing/StorageIntegrationTestSuite.mjs +349 -0
  117. package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -0
  118. package/dist/testing/assertions.cjs +114 -0
  119. package/dist/testing/assertions.mjs +109 -0
  120. package/dist/testing/assertions.mjs.map +1 -0
  121. package/dist/testing/index.cjs +14 -0
  122. package/dist/testing/index.d.cts +6 -0
  123. package/dist/testing/index.d.mts +6 -0
  124. package/dist/testing/index.mjs +7 -0
  125. package/dist/testing/types.cjs +15 -0
  126. package/dist/testing/types.d.cts +90 -0
  127. package/dist/testing/types.d.cts.map +1 -0
  128. package/dist/testing/types.d.mts +90 -0
  129. package/dist/testing/types.d.mts.map +1 -0
  130. package/dist/testing/types.mjs +16 -0
  131. package/dist/testing/types.mjs.map +1 -0
  132. package/package.json +18 -3
  133. package/src/ColdStorage.ts +136 -0
  134. package/src/DocumentManager.ts +550 -190
  135. package/src/Errors.ts +114 -0
  136. package/src/HotStorage.ts +239 -0
  137. package/src/Metrics.ts +187 -0
  138. package/src/MimicAuthService.ts +126 -64
  139. package/src/MimicClusterServerEngine.ts +946 -0
  140. package/src/MimicServer.ts +448 -195
  141. package/src/MimicServerEngine.ts +276 -0
  142. package/src/PresenceManager.ts +169 -240
  143. package/src/Protocol.ts +350 -0
  144. package/src/Types.ts +231 -0
  145. package/src/index.ts +57 -23
  146. package/src/testing/ColdStorageTestSuite.ts +589 -0
  147. package/src/testing/FailingStorage.ts +286 -0
  148. package/src/testing/HotStorageTestSuite.ts +762 -0
  149. package/src/testing/StorageIntegrationTestSuite.ts +504 -0
  150. package/src/testing/assertions.ts +181 -0
  151. package/src/testing/index.ts +83 -0
  152. package/src/testing/types.ts +100 -0
  153. package/tests/ColdStorage.test.ts +24 -0
  154. package/tests/DocumentManager.test.ts +158 -287
  155. package/tests/HotStorage.test.ts +24 -0
  156. package/tests/MimicAuthService.test.ts +102 -134
  157. package/tests/MimicClusterServerEngine.test.ts +587 -0
  158. package/tests/MimicServer.test.ts +90 -226
  159. package/tests/MimicServerEngine.test.ts +521 -0
  160. package/tests/PresenceManager.test.ts +22 -63
  161. package/tests/Protocol.test.ts +190 -0
  162. package/tests/StorageIntegration.test.ts +259 -0
  163. package/tsconfig.json +1 -1
  164. package/tsdown.config.ts +1 -1
  165. package/dist/DocumentProtocol.cjs +0 -94
  166. package/dist/DocumentProtocol.d.cts +0 -113
  167. package/dist/DocumentProtocol.d.cts.map +0 -1
  168. package/dist/DocumentProtocol.d.mts +0 -113
  169. package/dist/DocumentProtocol.d.mts.map +0 -1
  170. package/dist/DocumentProtocol.mjs +0 -89
  171. package/dist/DocumentProtocol.mjs.map +0 -1
  172. package/dist/MimicConfig.cjs +0 -60
  173. package/dist/MimicConfig.d.cts +0 -141
  174. package/dist/MimicConfig.d.cts.map +0 -1
  175. package/dist/MimicConfig.d.mts +0 -141
  176. package/dist/MimicConfig.d.mts.map +0 -1
  177. package/dist/MimicConfig.mjs +0 -50
  178. package/dist/MimicConfig.mjs.map +0 -1
  179. package/dist/MimicDataStorage.cjs +0 -83
  180. package/dist/MimicDataStorage.d.cts +0 -113
  181. package/dist/MimicDataStorage.d.cts.map +0 -1
  182. package/dist/MimicDataStorage.d.mts +0 -113
  183. package/dist/MimicDataStorage.d.mts.map +0 -1
  184. package/dist/MimicDataStorage.mjs +0 -74
  185. package/dist/MimicDataStorage.mjs.map +0 -1
  186. package/dist/WebSocketHandler.cjs +0 -365
  187. package/dist/WebSocketHandler.d.cts +0 -34
  188. package/dist/WebSocketHandler.d.cts.map +0 -1
  189. package/dist/WebSocketHandler.d.mts +0 -34
  190. package/dist/WebSocketHandler.d.mts.map +0 -1
  191. package/dist/WebSocketHandler.mjs +0 -355
  192. package/dist/WebSocketHandler.mjs.map +0 -1
  193. package/dist/auth/NoAuth.cjs +0 -43
  194. package/dist/auth/NoAuth.d.cts +0 -22
  195. package/dist/auth/NoAuth.d.cts.map +0 -1
  196. package/dist/auth/NoAuth.d.mts +0 -22
  197. package/dist/auth/NoAuth.d.mts.map +0 -1
  198. package/dist/auth/NoAuth.mjs +0 -36
  199. package/dist/auth/NoAuth.mjs.map +0 -1
  200. package/dist/errors.cjs +0 -74
  201. package/dist/errors.d.cts +0 -89
  202. package/dist/errors.d.cts.map +0 -1
  203. package/dist/errors.d.mts +0 -89
  204. package/dist/errors.d.mts.map +0 -1
  205. package/dist/errors.mjs +0 -67
  206. package/dist/errors.mjs.map +0 -1
  207. package/dist/storage/InMemoryDataStorage.cjs +0 -57
  208. package/dist/storage/InMemoryDataStorage.d.cts +0 -19
  209. package/dist/storage/InMemoryDataStorage.d.cts.map +0 -1
  210. package/dist/storage/InMemoryDataStorage.d.mts +0 -19
  211. package/dist/storage/InMemoryDataStorage.d.mts.map +0 -1
  212. package/dist/storage/InMemoryDataStorage.mjs +0 -48
  213. package/dist/storage/InMemoryDataStorage.mjs.map +0 -1
  214. package/src/DocumentProtocol.ts +0 -112
  215. package/src/MimicConfig.ts +0 -211
  216. package/src/MimicDataStorage.ts +0 -157
  217. package/src/WebSocketHandler.ts +0 -735
  218. package/src/auth/NoAuth.ts +0 -46
  219. package/src/errors.ts +0 -113
  220. package/src/storage/InMemoryDataStorage.ts +0 -66
  221. package/tests/DocumentProtocol.test.ts +0 -113
  222. package/tests/InMemoryDataStorage.test.ts +0 -190
  223. package/tests/MimicConfig.test.ts +0 -290
  224. package/tests/MimicDataStorage.test.ts +0 -190
  225. package/tests/NoAuth.test.ts +0 -94
  226. package/tests/WebSocketHandler.test.ts +0 -321
  227. package/tests/errors.test.ts +0 -77
@@ -0,0 +1,203 @@
1
+ import { Permission, PresenceEntry } from "./Types.mjs";
2
+ import { MessageParseError } from "./Errors.mjs";
3
+ import { Effect } from "effect";
4
+ import { Transaction } from "@voidhash/mimic";
5
+
6
+ //#region src/Protocol.d.ts
7
+ declare namespace Protocol_d_exports {
8
+ export { AuthMessage, AuthResultMessage, ClientMessage, EncodedClientMessage, EncodedServerMessage, ErrorMessage, PingMessage, PongMessage, PresenceClearMessage, PresenceRemoveMessage, PresenceSetMessage, PresenceSnapshotMessage, PresenceUpdateMessage, RequestSnapshotMessage, ServerBroadcast, ServerMessage, SnapshotMessage, SubmitMessage, TransactionMessage, authResultFailure, authResultSuccess, decodeClientMessage, encodeServerMessage, errorMessage, parseClientMessage, pong, presenceRemoveMessage, presenceSnapshotMessage, presenceUpdateMessage, snapshotMessage, transactionMessage };
9
+ }
10
+ /**
11
+ * Authentication request
12
+ */
13
+ interface AuthMessage {
14
+ readonly type: "auth";
15
+ readonly token: string;
16
+ }
17
+ /**
18
+ * Heartbeat ping
19
+ */
20
+ interface PingMessage {
21
+ readonly type: "ping";
22
+ }
23
+ /**
24
+ * Submit a transaction
25
+ */
26
+ interface SubmitMessage {
27
+ readonly type: "submit";
28
+ readonly transaction: Transaction.Transaction;
29
+ }
30
+ /**
31
+ * Request current document snapshot
32
+ */
33
+ interface RequestSnapshotMessage {
34
+ readonly type: "request_snapshot";
35
+ }
36
+ /**
37
+ * Set presence data
38
+ */
39
+ interface PresenceSetMessage {
40
+ readonly type: "presence_set";
41
+ readonly data: unknown;
42
+ }
43
+ /**
44
+ * Clear presence data
45
+ */
46
+ interface PresenceClearMessage {
47
+ readonly type: "presence_clear";
48
+ }
49
+ /**
50
+ * Union of all client messages
51
+ */
52
+ type ClientMessage = AuthMessage | PingMessage | SubmitMessage | RequestSnapshotMessage | PresenceSetMessage | PresenceClearMessage;
53
+ /**
54
+ * Authentication result
55
+ */
56
+ interface AuthResultMessage {
57
+ readonly type: "auth_result";
58
+ readonly success: boolean;
59
+ readonly error?: string;
60
+ readonly userId?: string;
61
+ readonly permission?: Permission;
62
+ }
63
+ /**
64
+ * Heartbeat pong
65
+ */
66
+ interface PongMessage {
67
+ readonly type: "pong";
68
+ }
69
+ /**
70
+ * Transaction broadcast
71
+ */
72
+ interface TransactionMessage {
73
+ readonly type: "transaction";
74
+ readonly transaction: Transaction.Transaction;
75
+ readonly version: number;
76
+ }
77
+ /**
78
+ * Document snapshot
79
+ */
80
+ interface SnapshotMessage {
81
+ readonly type: "snapshot";
82
+ readonly state: unknown;
83
+ readonly version: number;
84
+ }
85
+ /**
86
+ * Transaction error
87
+ */
88
+ interface ErrorMessage {
89
+ readonly type: "error";
90
+ readonly transactionId: string;
91
+ readonly reason: string;
92
+ }
93
+ /**
94
+ * Presence update broadcast
95
+ */
96
+ interface PresenceUpdateMessage {
97
+ readonly type: "presence_update";
98
+ readonly id: string;
99
+ readonly data: unknown;
100
+ readonly userId?: string;
101
+ }
102
+ /**
103
+ * Presence removal broadcast
104
+ */
105
+ interface PresenceRemoveMessage {
106
+ readonly type: "presence_remove";
107
+ readonly id: string;
108
+ }
109
+ /**
110
+ * Presence snapshot (sent after auth)
111
+ */
112
+ interface PresenceSnapshotMessage {
113
+ readonly type: "presence_snapshot";
114
+ readonly selfId: string;
115
+ readonly presences: Record<string, PresenceEntry>;
116
+ }
117
+ /**
118
+ * Union of all server messages
119
+ */
120
+ type ServerMessage = AuthResultMessage | PongMessage | TransactionMessage | SnapshotMessage | ErrorMessage | PresenceUpdateMessage | PresenceRemoveMessage | PresenceSnapshotMessage;
121
+ /**
122
+ * Server broadcast messages (transaction or error)
123
+ */
124
+ type ServerBroadcast = TransactionMessage | ErrorMessage;
125
+ /**
126
+ * Encoded client message (with encoded transaction)
127
+ */
128
+ interface EncodedClientMessage {
129
+ readonly type: string;
130
+ readonly token?: string;
131
+ readonly transaction?: Transaction.EncodedTransaction;
132
+ readonly data?: unknown;
133
+ }
134
+ /**
135
+ * Encoded server message (with encoded transaction)
136
+ */
137
+ interface EncodedServerMessage {
138
+ readonly type: string;
139
+ readonly success?: boolean;
140
+ readonly error?: string;
141
+ readonly userId?: string;
142
+ readonly permission?: Permission;
143
+ readonly transaction?: Transaction.EncodedTransaction;
144
+ readonly version?: number;
145
+ readonly state?: unknown;
146
+ readonly transactionId?: string;
147
+ readonly reason?: string;
148
+ readonly id?: string;
149
+ readonly data?: unknown;
150
+ readonly selfId?: string;
151
+ readonly presences?: Record<string, PresenceEntry>;
152
+ }
153
+ /**
154
+ * Decode an encoded client message to a ClientMessage
155
+ */
156
+ declare const decodeClientMessage: (encoded: EncodedClientMessage) => ClientMessage;
157
+ /**
158
+ * Encode a server message for wire format
159
+ */
160
+ declare const encodeServerMessage: (message: ServerMessage) => string;
161
+ /**
162
+ * Parse a raw WebSocket message to a ClientMessage
163
+ */
164
+ declare const parseClientMessage: (data: string | ArrayBuffer | Uint8Array) => Effect.Effect<ClientMessage, MessageParseError>;
165
+ /**
166
+ * Create an auth result success message
167
+ */
168
+ declare const authResultSuccess: (userId: string, permission: Permission) => AuthResultMessage;
169
+ /**
170
+ * Create an auth result failure message
171
+ */
172
+ declare const authResultFailure: (error: string) => AuthResultMessage;
173
+ /**
174
+ * Create a pong message
175
+ */
176
+ declare const pong: () => PongMessage;
177
+ /**
178
+ * Create a transaction message
179
+ */
180
+ declare const transactionMessage: (transaction: Transaction.Transaction, version: number) => TransactionMessage;
181
+ /**
182
+ * Create a snapshot message
183
+ */
184
+ declare const snapshotMessage: (state: unknown, version: number) => SnapshotMessage;
185
+ /**
186
+ * Create an error message
187
+ */
188
+ declare const errorMessage: (transactionId: string, reason: string) => ErrorMessage;
189
+ /**
190
+ * Create a presence update message
191
+ */
192
+ declare const presenceUpdateMessage: (id: string, data: unknown, userId?: string) => PresenceUpdateMessage;
193
+ /**
194
+ * Create a presence remove message
195
+ */
196
+ declare const presenceRemoveMessage: (id: string) => PresenceRemoveMessage;
197
+ /**
198
+ * Create a presence snapshot message
199
+ */
200
+ declare const presenceSnapshotMessage: (selfId: string, presences: Record<string, PresenceEntry>) => PresenceSnapshotMessage;
201
+ //#endregion
202
+ export { Protocol_d_exports, ServerBroadcast, ServerMessage, SnapshotMessage };
203
+ //# sourceMappingURL=Protocol.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.d.mts","names":[],"sources":["../src/Protocol.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAiBiB,WAAA;;;;;;;UAQA,WAAA;;;;;;UAOA,aAAA;;wBAEO,WAAA,CAAY;;;;;UAMnB,sBAAA;;;;;;UAOA,kBAAA;;EA9BA,SAAA,IAAA,EAAW,OAAA;AAQ5B;AAOA;AAQA;AAOA;AAQiB,UAAA,oBAAA,CAAoB;EAOzB,SAAA,IAAA,EAAA,gBAAa;;;;;AAKrB,KALQ,aAAA,GACR,WAIA,GAHA,WAGA,GAFA,aAEA,GADA,sBACA,GAAA,kBAAA,GACA,oBADA;;;AAUJ;AAWiB,UAXA,iBAAA,CAWW;EAOX,SAAA,IAAA,EAAA,aAAkB;EASlB,SAAA,OAAA,EAAe,OAAA;EASf,SAAA,KAAA,CAAY,EAAA,MAAA;EASZ,SAAA,MAAA,CAAA,EAAA,MAAqB;EAUrB,SAAA,UAAA,CAAA,EAlDO,UAkDc;AAQtC;AASA;;;AAGI,UAhEa,WAAA,CAgEb;EACA,SAAA,IAAA,EAAA,MAAA;;;;;AAIuB,UA9DV,kBAAA,CA8DU;EAKf,SAAA,IAAA,EAAA,aAAe;EASV,SAAA,WAAA,EA1EO,WAAA,CAAY,WA6EX;EAOR,SAAA,OAAA,EAAA,MAAoB;;;;;AAcR,UA3FZ,eAAA,CA2FY;EAUhB,SAAA,IAAA,EAAA,UAUZ;EAKY,SAAA,KAAA,EAAA,OAUZ;EAKY,SAAA,OAAA,EAAA,MAeT;;;;;AAbD,UA5Hc,YAAA,CA4HP;EAAM,SAAA,IAAA,EAAA,OAAA;EAkBH,SAAA,aAQX,EAAA,MAAA;EAKW,SAAA,MAAA,EAAA,MAIX;AAKF;AAKA;AAYA;AAYA;AAYa,UApMI,qBAAA,CA6Mf;EAKW,SAAA,IAAA,EAAA,iBAKX;EAKW,SAAA,EAAA,EAAA,MAAA;EAEe,SAAA,IAAA,EAAA,OAAA;EAAf,SAAA,MAAA,CAAA,EAAA,MAAA;;;;;UApNI,qBAAA;;;;;;;UAQA,uBAAA;;;sBAGK,eAAe;;;;;KAMzB,aAAA,GACR,oBACA,cACA,qBACA,kBACA,eACA,wBACA,wBACA;;;;KAKQ,eAAA,GAAkB,qBAAqB;;;;UASlC,oBAAA;;;yBAGQ,WAAA,CAAY;;;;;;UAOpB,oBAAA;;;;;wBAKO;yBACC,WAAA,CAAY;;;;;;;;uBAQd,eAAe;;;;;cAUzB,+BACF,yBACR;;;;cAaU,+BAAgC;;;;cAehC,oCACI,cAAc,eAC5B,MAAA,CAAO,OAAO,eAAe;;;;cAkBnB,gDAEC,eACX;;;;cAUU,sCAAqC;;;;cASrC,YAAW;;;;cAKX,kCACE,WAAA,CAAY,iCAExB;;;;cASU,sDAGV;;;;cASU,yDAGV;;;;cASU,uEAIV;;;;cAUU,uCAEV;;;;cAQU,qDAEA,eAAe,mBACzB"}
@@ -0,0 +1,132 @@
1
+ import { __export } from "./_virtual/rolldown_runtime.mjs";
2
+ import { MessageParseError } from "./Errors.mjs";
3
+ import { Effect } from "effect";
4
+ import { Transaction } from "@voidhash/mimic";
5
+
6
+ //#region src/Protocol.ts
7
+ /**
8
+ * @voidhash/mimic-effect - WebSocket Protocol
9
+ *
10
+ * Message types and encoding/decoding for WebSocket communication.
11
+ */
12
+ var Protocol_exports = /* @__PURE__ */ __export({
13
+ authResultFailure: () => authResultFailure,
14
+ authResultSuccess: () => authResultSuccess,
15
+ decodeClientMessage: () => decodeClientMessage,
16
+ encodeServerMessage: () => encodeServerMessage,
17
+ errorMessage: () => errorMessage,
18
+ parseClientMessage: () => parseClientMessage,
19
+ pong: () => pong,
20
+ presenceRemoveMessage: () => presenceRemoveMessage,
21
+ presenceSnapshotMessage: () => presenceSnapshotMessage,
22
+ presenceUpdateMessage: () => presenceUpdateMessage,
23
+ snapshotMessage: () => snapshotMessage,
24
+ transactionMessage: () => transactionMessage
25
+ });
26
+ /**
27
+ * Decode an encoded client message to a ClientMessage
28
+ */
29
+ const decodeClientMessage = (encoded) => {
30
+ if (encoded.type === "submit" && encoded.transaction) return {
31
+ type: "submit",
32
+ transaction: Transaction.decode(encoded.transaction)
33
+ };
34
+ return encoded;
35
+ };
36
+ /**
37
+ * Encode a server message for wire format
38
+ */
39
+ const encodeServerMessage = (message) => {
40
+ if (message.type === "transaction") {
41
+ const encoded = {
42
+ type: "transaction",
43
+ transaction: Transaction.encode(message.transaction),
44
+ version: message.version
45
+ };
46
+ return JSON.stringify(encoded);
47
+ }
48
+ return JSON.stringify(message);
49
+ };
50
+ /**
51
+ * Parse a raw WebSocket message to a ClientMessage
52
+ */
53
+ const parseClientMessage = (data) => Effect.try({
54
+ try: () => {
55
+ const text = typeof data === "string" ? data : new TextDecoder().decode(data instanceof ArrayBuffer ? new Uint8Array(data) : data);
56
+ return decodeClientMessage(JSON.parse(text));
57
+ },
58
+ catch: (cause) => new MessageParseError({ cause })
59
+ });
60
+ /**
61
+ * Create an auth result success message
62
+ */
63
+ const authResultSuccess = (userId, permission) => ({
64
+ type: "auth_result",
65
+ success: true,
66
+ userId,
67
+ permission
68
+ });
69
+ /**
70
+ * Create an auth result failure message
71
+ */
72
+ const authResultFailure = (error) => ({
73
+ type: "auth_result",
74
+ success: false,
75
+ error
76
+ });
77
+ /**
78
+ * Create a pong message
79
+ */
80
+ const pong = () => ({ type: "pong" });
81
+ /**
82
+ * Create a transaction message
83
+ */
84
+ const transactionMessage = (transaction, version) => ({
85
+ type: "transaction",
86
+ transaction,
87
+ version
88
+ });
89
+ /**
90
+ * Create a snapshot message
91
+ */
92
+ const snapshotMessage = (state, version) => ({
93
+ type: "snapshot",
94
+ state,
95
+ version
96
+ });
97
+ /**
98
+ * Create an error message
99
+ */
100
+ const errorMessage = (transactionId, reason) => ({
101
+ type: "error",
102
+ transactionId,
103
+ reason
104
+ });
105
+ /**
106
+ * Create a presence update message
107
+ */
108
+ const presenceUpdateMessage = (id, data, userId) => ({
109
+ type: "presence_update",
110
+ id,
111
+ data,
112
+ userId
113
+ });
114
+ /**
115
+ * Create a presence remove message
116
+ */
117
+ const presenceRemoveMessage = (id) => ({
118
+ type: "presence_remove",
119
+ id
120
+ });
121
+ /**
122
+ * Create a presence snapshot message
123
+ */
124
+ const presenceSnapshotMessage = (selfId, presences) => ({
125
+ type: "presence_snapshot",
126
+ selfId,
127
+ presences
128
+ });
129
+
130
+ //#endregion
131
+ export { Protocol_exports, authResultFailure, authResultSuccess, encodeServerMessage, errorMessage, parseClientMessage, pong, presenceRemoveMessage, presenceSnapshotMessage, presenceUpdateMessage, snapshotMessage };
132
+ //# sourceMappingURL=Protocol.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.mjs","names":["encoded: EncodedServerMessage"],"sources":["../src/Protocol.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect - WebSocket Protocol\n *\n * Message types and encoding/decoding for WebSocket communication.\n */\nimport { Effect } from \"effect\";\nimport { Transaction } from \"@voidhash/mimic\";\nimport type { Permission, PresenceEntry } from \"./Types\";\nimport { MessageParseError } from \"./Errors\";\n\n// =============================================================================\n// Client -> Server Messages\n// =============================================================================\n\n/**\n * Authentication request\n */\nexport interface AuthMessage {\n readonly type: \"auth\";\n readonly token: string;\n}\n\n/**\n * Heartbeat ping\n */\nexport interface PingMessage {\n readonly type: \"ping\";\n}\n\n/**\n * Submit a transaction\n */\nexport interface SubmitMessage {\n readonly type: \"submit\";\n readonly transaction: Transaction.Transaction;\n}\n\n/**\n * Request current document snapshot\n */\nexport interface RequestSnapshotMessage {\n readonly type: \"request_snapshot\";\n}\n\n/**\n * Set presence data\n */\nexport interface PresenceSetMessage {\n readonly type: \"presence_set\";\n readonly data: unknown;\n}\n\n/**\n * Clear presence data\n */\nexport interface PresenceClearMessage {\n readonly type: \"presence_clear\";\n}\n\n/**\n * Union of all client messages\n */\nexport type ClientMessage =\n | AuthMessage\n | PingMessage\n | SubmitMessage\n | RequestSnapshotMessage\n | PresenceSetMessage\n | PresenceClearMessage;\n\n// =============================================================================\n// Server -> Client Messages\n// =============================================================================\n\n/**\n * Authentication result\n */\nexport interface AuthResultMessage {\n readonly type: \"auth_result\";\n readonly success: boolean;\n readonly error?: string;\n readonly userId?: string;\n readonly permission?: Permission;\n}\n\n/**\n * Heartbeat pong\n */\nexport interface PongMessage {\n readonly type: \"pong\";\n}\n\n/**\n * Transaction broadcast\n */\nexport interface TransactionMessage {\n readonly type: \"transaction\";\n readonly transaction: Transaction.Transaction;\n readonly version: number;\n}\n\n/**\n * Document snapshot\n */\nexport interface SnapshotMessage {\n readonly type: \"snapshot\";\n readonly state: unknown;\n readonly version: number;\n}\n\n/**\n * Transaction error\n */\nexport interface ErrorMessage {\n readonly type: \"error\";\n readonly transactionId: string;\n readonly reason: string;\n}\n\n/**\n * Presence update broadcast\n */\nexport interface PresenceUpdateMessage {\n readonly type: \"presence_update\";\n readonly id: string;\n readonly data: unknown;\n readonly userId?: string;\n}\n\n/**\n * Presence removal broadcast\n */\nexport interface PresenceRemoveMessage {\n readonly type: \"presence_remove\";\n readonly id: string;\n}\n\n/**\n * Presence snapshot (sent after auth)\n */\nexport interface PresenceSnapshotMessage {\n readonly type: \"presence_snapshot\";\n readonly selfId: string;\n readonly presences: Record<string, PresenceEntry>;\n}\n\n/**\n * Union of all server messages\n */\nexport type ServerMessage =\n | AuthResultMessage\n | PongMessage\n | TransactionMessage\n | SnapshotMessage\n | ErrorMessage\n | PresenceUpdateMessage\n | PresenceRemoveMessage\n | PresenceSnapshotMessage;\n\n/**\n * Server broadcast messages (transaction or error)\n */\nexport type ServerBroadcast = TransactionMessage | ErrorMessage;\n\n// =============================================================================\n// Encoded Types (for wire format)\n// =============================================================================\n\n/**\n * Encoded client message (with encoded transaction)\n */\nexport interface EncodedClientMessage {\n readonly type: string;\n readonly token?: string;\n readonly transaction?: Transaction.EncodedTransaction;\n readonly data?: unknown;\n}\n\n/**\n * Encoded server message (with encoded transaction)\n */\nexport interface EncodedServerMessage {\n readonly type: string;\n readonly success?: boolean;\n readonly error?: string;\n readonly userId?: string;\n readonly permission?: Permission;\n readonly transaction?: Transaction.EncodedTransaction;\n readonly version?: number;\n readonly state?: unknown;\n readonly transactionId?: string;\n readonly reason?: string;\n readonly id?: string;\n readonly data?: unknown;\n readonly selfId?: string;\n readonly presences?: Record<string, PresenceEntry>;\n}\n\n// =============================================================================\n// Encoding/Decoding Functions\n// =============================================================================\n\n/**\n * Decode an encoded client message to a ClientMessage\n */\nexport const decodeClientMessage = (\n encoded: EncodedClientMessage\n): ClientMessage => {\n if (encoded.type === \"submit\" && encoded.transaction) {\n return {\n type: \"submit\",\n transaction: Transaction.decode(encoded.transaction),\n };\n }\n return encoded as ClientMessage;\n};\n\n/**\n * Encode a server message for wire format\n */\nexport const encodeServerMessage = (message: ServerMessage): string => {\n if (message.type === \"transaction\") {\n const encoded: EncodedServerMessage = {\n type: \"transaction\",\n transaction: Transaction.encode(message.transaction),\n version: message.version,\n };\n return JSON.stringify(encoded);\n }\n return JSON.stringify(message);\n};\n\n/**\n * Parse a raw WebSocket message to a ClientMessage\n */\nexport const parseClientMessage = (\n data: string | ArrayBuffer | Uint8Array\n): Effect.Effect<ClientMessage, MessageParseError> =>\n Effect.try({\n try: () => {\n const text =\n typeof data === \"string\"\n ? data\n : new TextDecoder().decode(\n data instanceof ArrayBuffer ? new Uint8Array(data) : data\n );\n const encoded = JSON.parse(text) as EncodedClientMessage;\n return decodeClientMessage(encoded);\n },\n catch: (cause) => new MessageParseError({ cause }),\n });\n\n/**\n * Create an auth result success message\n */\nexport const authResultSuccess = (\n userId: string,\n permission: Permission\n): AuthResultMessage => ({\n type: \"auth_result\",\n success: true,\n userId,\n permission,\n});\n\n/**\n * Create an auth result failure message\n */\nexport const authResultFailure = (error: string): AuthResultMessage => ({\n type: \"auth_result\",\n success: false,\n error,\n});\n\n/**\n * Create a pong message\n */\nexport const pong = (): PongMessage => ({ type: \"pong\" });\n\n/**\n * Create a transaction message\n */\nexport const transactionMessage = (\n transaction: Transaction.Transaction,\n version: number\n): TransactionMessage => ({\n type: \"transaction\",\n transaction,\n version,\n});\n\n/**\n * Create a snapshot message\n */\nexport const snapshotMessage = (\n state: unknown,\n version: number\n): SnapshotMessage => ({\n type: \"snapshot\",\n state,\n version,\n});\n\n/**\n * Create an error message\n */\nexport const errorMessage = (\n transactionId: string,\n reason: string\n): ErrorMessage => ({\n type: \"error\",\n transactionId,\n reason,\n});\n\n/**\n * Create a presence update message\n */\nexport const presenceUpdateMessage = (\n id: string,\n data: unknown,\n userId?: string\n): PresenceUpdateMessage => ({\n type: \"presence_update\",\n id,\n data,\n userId,\n});\n\n/**\n * Create a presence remove message\n */\nexport const presenceRemoveMessage = (\n id: string\n): PresenceRemoveMessage => ({\n type: \"presence_remove\",\n id,\n});\n\n/**\n * Create a presence snapshot message\n */\nexport const presenceSnapshotMessage = (\n selfId: string,\n presences: Record<string, PresenceEntry>\n): PresenceSnapshotMessage => ({\n type: \"presence_snapshot\",\n selfId,\n presences,\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6MA,MAAa,uBACX,YACkB;AAClB,KAAI,QAAQ,SAAS,YAAY,QAAQ,YACvC,QAAO;EACL,MAAM;EACN,aAAa,YAAY,OAAO,QAAQ,YAAY;EACrD;AAEH,QAAO;;;;;AAMT,MAAa,uBAAuB,YAAmC;AACrE,KAAI,QAAQ,SAAS,eAAe;EAClC,MAAMA,UAAgC;GACpC,MAAM;GACN,aAAa,YAAY,OAAO,QAAQ,YAAY;GACpD,SAAS,QAAQ;GAClB;AACD,SAAO,KAAK,UAAU,QAAQ;;AAEhC,QAAO,KAAK,UAAU,QAAQ;;;;;AAMhC,MAAa,sBACX,SAEA,OAAO,IAAI;CACT,WAAW;EACT,MAAM,OACJ,OAAO,SAAS,WACZ,OACA,IAAI,aAAa,CAAC,OAChB,gBAAgB,cAAc,IAAI,WAAW,KAAK,GAAG,KACtD;AAEP,SAAO,oBADS,KAAK,MAAM,KAAK,CACG;;CAErC,QAAQ,UAAU,IAAI,kBAAkB,EAAE,OAAO,CAAC;CACnD,CAAC;;;;AAKJ,MAAa,qBACX,QACA,gBACuB;CACvB,MAAM;CACN,SAAS;CACT;CACA;CACD;;;;AAKD,MAAa,qBAAqB,WAAsC;CACtE,MAAM;CACN,SAAS;CACT;CACD;;;;AAKD,MAAa,cAA2B,EAAE,MAAM,QAAQ;;;;AAKxD,MAAa,sBACX,aACA,aACwB;CACxB,MAAM;CACN;CACA;CACD;;;;AAKD,MAAa,mBACX,OACA,aACqB;CACrB,MAAM;CACN;CACA;CACD;;;;AAKD,MAAa,gBACX,eACA,YACkB;CAClB,MAAM;CACN;CACA;CACD;;;;AAKD,MAAa,yBACX,IACA,MACA,YAC2B;CAC3B,MAAM;CACN;CACA;CACA;CACD;;;;AAKD,MAAa,yBACX,QAC2B;CAC3B,MAAM;CACN;CACD;;;;AAKD,MAAa,2BACX,QACA,eAC6B;CAC7B,MAAM;CACN;CACA;CACD"}
@@ -0,0 +1,172 @@
1
+ import { Duration, Effect } from "effect";
2
+ import { Presence, Primitive, Transaction } from "@voidhash/mimic";
3
+
4
+ //#region src/Types.d.ts
5
+
6
+ /**
7
+ * Permission level for document access
8
+ * - "read": Can subscribe, receive transactions, get snapshots
9
+ * - "write": All of the above, plus can submit transactions and set presence
10
+ */
11
+ type Permission = "read" | "write";
12
+ /**
13
+ * Authentication context returned after successful authentication
14
+ */
15
+ interface AuthContext {
16
+ readonly userId: string;
17
+ readonly permission: Permission;
18
+ readonly metadata?: Record<string, unknown>;
19
+ }
20
+ /**
21
+ * Document state stored in ColdStorage (snapshots)
22
+ */
23
+ interface StoredDocument {
24
+ /** Document state */
25
+ readonly state: unknown;
26
+ /** Current version number */
27
+ readonly version: number;
28
+ /** Schema version for future migration support */
29
+ readonly schemaVersion: number;
30
+ /** Unix timestamp (ms) when saved */
31
+ readonly savedAt: number;
32
+ }
33
+ /**
34
+ * WAL entry stored in HotStorage
35
+ */
36
+ interface WalEntry {
37
+ /** The transaction data */
38
+ readonly transaction: Transaction.Transaction;
39
+ /** Version after this transaction */
40
+ readonly version: number;
41
+ /** Unix timestamp (ms) */
42
+ readonly timestamp: number;
43
+ }
44
+ /**
45
+ * Presence entry for a connection
46
+ */
47
+ interface PresenceEntry {
48
+ /** Presence data (schema-validated) */
49
+ readonly data: unknown;
50
+ /** User ID from authentication (optional) */
51
+ readonly userId?: string;
52
+ }
53
+ /**
54
+ * Snapshot of all presences for a document
55
+ */
56
+ interface PresenceSnapshot {
57
+ readonly presences: Record<string, PresenceEntry>;
58
+ }
59
+ /**
60
+ * Presence update event
61
+ */
62
+ interface PresenceUpdateEvent {
63
+ readonly type: "presence_update";
64
+ readonly id: string;
65
+ readonly data: unknown;
66
+ readonly userId?: string;
67
+ }
68
+ /**
69
+ * Presence remove event
70
+ */
71
+ interface PresenceRemoveEvent {
72
+ readonly type: "presence_remove";
73
+ readonly id: string;
74
+ }
75
+ /**
76
+ * Union of presence events
77
+ */
78
+ type PresenceEvent = PresenceUpdateEvent | PresenceRemoveEvent;
79
+ /**
80
+ * Duration input type - matches Effect's DurationInput
81
+ */
82
+ type DurationInput = Duration.DurationInput;
83
+ /**
84
+ * Snapshot configuration
85
+ */
86
+ interface SnapshotConfig {
87
+ /** Time-based snapshot interval */
88
+ readonly interval: DurationInput;
89
+ /** Transaction count threshold for snapshots */
90
+ readonly transactionThreshold: number;
91
+ }
92
+ /**
93
+ * Context passed to initial state function
94
+ */
95
+ interface InitialContext {
96
+ readonly documentId: string;
97
+ }
98
+ /**
99
+ * Initial state function type
100
+ */
101
+ type InitialFn<TSchema extends Primitive.AnyPrimitive> = (context: InitialContext) => Effect.Effect<Primitive.InferSetInput<TSchema>>;
102
+ /**
103
+ * Initial state - either a static value or a function
104
+ */
105
+ type Initial<TSchema extends Primitive.AnyPrimitive> = Primitive.InferSetInput<TSchema> | InitialFn<TSchema>;
106
+ /**
107
+ * MimicServerEngine configuration
108
+ */
109
+ interface MimicServerEngineConfig<TSchema extends Primitive.AnyPrimitive> {
110
+ /** Document schema (required) */
111
+ readonly schema: TSchema;
112
+ /** Initial state for new documents (optional) */
113
+ readonly initial?: Initial<TSchema>;
114
+ /** Presence schema (optional) */
115
+ readonly presence?: Presence.AnyPresence;
116
+ /** Document idle timeout before GC (default: 5 minutes) */
117
+ readonly maxIdleTime?: DurationInput;
118
+ /** Maximum transaction history for deduplication (default: 1000) */
119
+ readonly maxTransactionHistory?: number;
120
+ /** Snapshot configuration */
121
+ readonly snapshot?: SnapshotConfig;
122
+ }
123
+ /**
124
+ * MimicClusterServerEngine configuration (extends MimicServerEngineConfig)
125
+ */
126
+ interface MimicClusterServerEngineConfig<TSchema extends Primitive.AnyPrimitive> extends MimicServerEngineConfig<TSchema> {
127
+ /** Shard group name for cluster distribution (default: "mimic-documents") */
128
+ readonly shardGroup?: string;
129
+ }
130
+ /**
131
+ * MimicServer route configuration
132
+ */
133
+ interface MimicServerRouteConfig {
134
+ /** WebSocket route path prefix (default: "/mimic") */
135
+ readonly path?: `/${string}`;
136
+ /** Heartbeat ping interval (default: 30 seconds) */
137
+ readonly heartbeatInterval?: DurationInput;
138
+ /** Heartbeat timeout - disconnect if no activity (default: 10 seconds) */
139
+ readonly heartbeatTimeout?: DurationInput;
140
+ }
141
+ /**
142
+ * Resolved engine configuration with all defaults applied
143
+ */
144
+ interface ResolvedConfig<TSchema extends Primitive.AnyPrimitive> {
145
+ readonly schema: TSchema;
146
+ readonly initial: Initial<TSchema> | undefined;
147
+ readonly presence: Presence.AnyPresence | undefined;
148
+ readonly maxIdleTime: Duration.Duration;
149
+ readonly maxTransactionHistory: number;
150
+ readonly snapshot: {
151
+ readonly interval: Duration.Duration;
152
+ readonly transactionThreshold: number;
153
+ };
154
+ }
155
+ /**
156
+ * Resolved route configuration with all defaults applied
157
+ */
158
+ interface ResolvedRouteConfig {
159
+ readonly path: string;
160
+ readonly heartbeatInterval: Duration.Duration;
161
+ readonly heartbeatTimeout: Duration.Duration;
162
+ }
163
+ /**
164
+ * Resolved cluster engine configuration with all defaults applied
165
+ */
166
+ interface ResolvedClusterConfig<TSchema extends Primitive.AnyPrimitive> extends ResolvedConfig<TSchema> {
167
+ /** Shard group name for cluster distribution */
168
+ readonly shardGroup: string;
169
+ }
170
+ //#endregion
171
+ export { AuthContext, DurationInput, Initial, InitialContext, InitialFn, MimicClusterServerEngineConfig, MimicServerEngineConfig, MimicServerRouteConfig, Permission, PresenceEntry, PresenceEvent, PresenceRemoveEvent, PresenceSnapshot, PresenceUpdateEvent, ResolvedClusterConfig, ResolvedConfig, ResolvedRouteConfig, SnapshotConfig, StoredDocument, WalEntry };
172
+ //# sourceMappingURL=Types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.d.cts","names":[],"sources":["../src/Types.ts"],"sourcesContent":[],"mappings":";;;;;AAiDA;AAgBA;AAUA;AAOA;AAUA;AAQY,KAnFA,UAAA,GAmFa,MAAA,GAAG,OAAA;AAS5B;AAKA;AAUA;AAOY,UA7GK,WAAA,CA6GI;EAAiB,SAAU,MAAA,EAAA,MAAA;EACrC,SAAA,UAAA,EA5GY,UA4GZ;EACgC,SAAA,QAAA,CAAA,EA5GrB,MA4GqB,CAAA,MAAA,EAAA,OAAA,CAAA;;;;AAK3C;AAAoC,UAvGnB,cAAA,CAuG6B;EAClB;EAAxB,SAAU,KAAA,EAAA,OAAA;EACA;EAAV,SAAA,OAAA,EAAA,MAAA;EAAS;EAKI,SAAA,aAAA,EAAA,MAAuB;EACtB;EAGC,SAAA,OAAA,EAAA,MAAA;;;;;AAeG,UAnHL,QAAA,CAmHK;EAAc;EAMnB,SAAA,WAAA,EAvHO,WAAA,CAAY,WAuHW;EAC7B;EACgB,SAAA,OAAA,EAAA,MAAA;EAAxB;EAAuB,SAAA,SAAA,EAAA,MAAA;AAYjC;AAkBA;;;AAE4B,UA3IX,aAAA,CA2IW;EAAR;EACC,SAAS,IAAA,EAAA,OAAA;EACN;EAGD,SAAS,MAAA,CAAA,EAAA,MAAA;;AAQhC;AASA;;AACyB,UAxJR,gBAAA,CAwJQ;EAAf,SAAA,SAAA,EAvJY,MAuJZ,CAAA,MAAA,EAvJ2B,aAuJ3B,CAAA;;;;;UAjJO,mBAAA;;;;;;;;;UAUA,mBAAA;;;;;;;KAQL,aAAA,GAAgB,sBAAsB;;;;KAStC,aAAA,GAAgB,QAAA,CAAS;;;;UAKpB,cAAA;;qBAEI;;;;;;;UAQJ,cAAA;;;;;;KAOL,0BAA0B,SAAA,CAAU,0BACrC,mBACN,MAAA,CAAO,OAAO,SAAA,CAAU,cAAc;;;;KAK/B,wBAAwB,SAAA,CAAU,gBAC1C,SAAA,CAAU,cAAc,WACxB,UAAU;;;;UAKG,wCACC,SAAA,CAAU;;mBAGT;;qBAGE,QAAQ;;sBAGP,QAAA,CAAS;;yBAGN;;;;sBAMH;;;;;UAML,+CACC,SAAA,CAAU,sBAClB,wBAAwB;;;;;;;UAYjB,sBAAA;;;;+BAKc;;8BAGD;;;;;UAUb,+BAA+B,SAAA,CAAU;mBACvC;oBACC,QAAQ;qBACP,QAAA,CAAS;wBACN,QAAA,CAAS;;;uBAGV,QAAA,CAAS;;;;;;;UAQf,mBAAA;;8BAEa,QAAA,CAAS;6BACV,QAAA,CAAS;;;;;UAMrB,sCAAsC,SAAA,CAAU,sBACvD,eAAe"}