@voidhash/mimic-effect 1.0.0-beta.1 → 1.0.0-beta.10

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 (142) hide show
  1. package/.turbo/turbo-build.log +116 -74
  2. package/dist/ColdStorage.cjs +9 -5
  3. package/dist/ColdStorage.d.cts.map +1 -1
  4. package/dist/ColdStorage.d.mts.map +1 -1
  5. package/dist/ColdStorage.mjs +9 -5
  6. package/dist/ColdStorage.mjs.map +1 -1
  7. package/dist/DocumentInstance.cjs +263 -0
  8. package/dist/DocumentInstance.d.cts +78 -0
  9. package/dist/DocumentInstance.d.cts.map +1 -0
  10. package/dist/DocumentInstance.d.mts +78 -0
  11. package/dist/DocumentInstance.d.mts.map +1 -0
  12. package/dist/DocumentInstance.mjs +264 -0
  13. package/dist/DocumentInstance.mjs.map +1 -0
  14. package/dist/Errors.cjs +10 -1
  15. package/dist/Errors.d.cts +18 -3
  16. package/dist/Errors.d.cts.map +1 -1
  17. package/dist/Errors.d.mts +18 -3
  18. package/dist/Errors.d.mts.map +1 -1
  19. package/dist/Errors.mjs +9 -1
  20. package/dist/Errors.mjs.map +1 -1
  21. package/dist/HotStorage.cjs +39 -12
  22. package/dist/HotStorage.d.cts +17 -1
  23. package/dist/HotStorage.d.cts.map +1 -1
  24. package/dist/HotStorage.d.mts +17 -1
  25. package/dist/HotStorage.d.mts.map +1 -1
  26. package/dist/HotStorage.mjs +39 -12
  27. package/dist/HotStorage.mjs.map +1 -1
  28. package/dist/Metrics.cjs +29 -1
  29. package/dist/Metrics.d.cts +5 -0
  30. package/dist/Metrics.d.cts.map +1 -1
  31. package/dist/Metrics.d.mts +5 -0
  32. package/dist/Metrics.d.mts.map +1 -1
  33. package/dist/Metrics.mjs +26 -1
  34. package/dist/Metrics.mjs.map +1 -1
  35. package/dist/MimicClusterServerEngine.cjs +44 -139
  36. package/dist/MimicClusterServerEngine.d.cts.map +1 -1
  37. package/dist/MimicClusterServerEngine.d.mts +1 -1
  38. package/dist/MimicClusterServerEngine.d.mts.map +1 -1
  39. package/dist/MimicClusterServerEngine.mjs +46 -141
  40. package/dist/MimicClusterServerEngine.mjs.map +1 -1
  41. package/dist/MimicServer.cjs +20 -20
  42. package/dist/MimicServer.d.cts.map +1 -1
  43. package/dist/MimicServer.d.mts.map +1 -1
  44. package/dist/MimicServer.mjs +20 -20
  45. package/dist/MimicServer.mjs.map +1 -1
  46. package/dist/MimicServerEngine.cjs +92 -11
  47. package/dist/MimicServerEngine.d.cts +12 -4
  48. package/dist/MimicServerEngine.d.cts.map +1 -1
  49. package/dist/MimicServerEngine.d.mts +12 -4
  50. package/dist/MimicServerEngine.d.mts.map +1 -1
  51. package/dist/MimicServerEngine.mjs +94 -13
  52. package/dist/MimicServerEngine.mjs.map +1 -1
  53. package/dist/PresenceManager.cjs +5 -5
  54. package/dist/PresenceManager.d.cts.map +1 -1
  55. package/dist/PresenceManager.d.mts.map +1 -1
  56. package/dist/PresenceManager.mjs +5 -5
  57. package/dist/PresenceManager.mjs.map +1 -1
  58. package/dist/Protocol.d.cts +1 -1
  59. package/dist/Protocol.d.mts +1 -1
  60. package/dist/Types.d.cts +9 -2
  61. package/dist/Types.d.cts.map +1 -1
  62. package/dist/Types.d.mts +9 -2
  63. package/dist/Types.d.mts.map +1 -1
  64. package/dist/index.cjs +5 -6
  65. package/dist/index.d.cts +3 -3
  66. package/dist/index.d.mts +3 -3
  67. package/dist/index.mjs +3 -3
  68. package/dist/testing/ColdStorageTestSuite.cjs +508 -0
  69. package/dist/testing/ColdStorageTestSuite.d.cts +36 -0
  70. package/dist/testing/ColdStorageTestSuite.d.cts.map +1 -0
  71. package/dist/testing/ColdStorageTestSuite.d.mts +36 -0
  72. package/dist/testing/ColdStorageTestSuite.d.mts.map +1 -0
  73. package/dist/testing/ColdStorageTestSuite.mjs +508 -0
  74. package/dist/testing/ColdStorageTestSuite.mjs.map +1 -0
  75. package/dist/testing/FailingStorage.cjs +162 -0
  76. package/dist/testing/FailingStorage.d.cts +43 -0
  77. package/dist/testing/FailingStorage.d.cts.map +1 -0
  78. package/dist/testing/FailingStorage.d.mts +43 -0
  79. package/dist/testing/FailingStorage.d.mts.map +1 -0
  80. package/dist/testing/FailingStorage.mjs +163 -0
  81. package/dist/testing/FailingStorage.mjs.map +1 -0
  82. package/dist/testing/HotStorageTestSuite.cjs +820 -0
  83. package/dist/testing/HotStorageTestSuite.d.cts +42 -0
  84. package/dist/testing/HotStorageTestSuite.d.cts.map +1 -0
  85. package/dist/testing/HotStorageTestSuite.d.mts +42 -0
  86. package/dist/testing/HotStorageTestSuite.d.mts.map +1 -0
  87. package/dist/testing/HotStorageTestSuite.mjs +820 -0
  88. package/dist/testing/HotStorageTestSuite.mjs.map +1 -0
  89. package/dist/testing/StorageIntegrationTestSuite.cjs +487 -0
  90. package/dist/testing/StorageIntegrationTestSuite.d.cts +37 -0
  91. package/dist/testing/StorageIntegrationTestSuite.d.cts.map +1 -0
  92. package/dist/testing/StorageIntegrationTestSuite.d.mts +37 -0
  93. package/dist/testing/StorageIntegrationTestSuite.d.mts.map +1 -0
  94. package/dist/testing/StorageIntegrationTestSuite.mjs +487 -0
  95. package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -0
  96. package/dist/testing/assertions.cjs +117 -0
  97. package/dist/testing/assertions.mjs +112 -0
  98. package/dist/testing/assertions.mjs.map +1 -0
  99. package/dist/testing/index.cjs +14 -0
  100. package/dist/testing/index.d.cts +6 -0
  101. package/dist/testing/index.d.mts +6 -0
  102. package/dist/testing/index.mjs +7 -0
  103. package/dist/testing/types.cjs +15 -0
  104. package/dist/testing/types.d.cts +90 -0
  105. package/dist/testing/types.d.cts.map +1 -0
  106. package/dist/testing/types.d.mts +90 -0
  107. package/dist/testing/types.d.mts.map +1 -0
  108. package/dist/testing/types.mjs +16 -0
  109. package/dist/testing/types.mjs.map +1 -0
  110. package/package.json +8 -3
  111. package/src/ColdStorage.ts +21 -12
  112. package/src/DocumentInstance.ts +527 -0
  113. package/src/Errors.ts +15 -1
  114. package/src/HotStorage.ts +115 -24
  115. package/src/Metrics.ts +30 -0
  116. package/src/MimicClusterServerEngine.ts +120 -275
  117. package/src/MimicServer.ts +83 -75
  118. package/src/MimicServerEngine.ts +230 -30
  119. package/src/PresenceManager.ts +44 -34
  120. package/src/Types.ts +9 -2
  121. package/src/index.ts +5 -35
  122. package/src/testing/ColdStorageTestSuite.ts +589 -0
  123. package/src/testing/FailingStorage.ts +338 -0
  124. package/src/testing/HotStorageTestSuite.ts +1105 -0
  125. package/src/testing/StorageIntegrationTestSuite.ts +736 -0
  126. package/src/testing/assertions.ts +188 -0
  127. package/src/testing/index.ts +83 -0
  128. package/src/testing/types.ts +100 -0
  129. package/tests/ColdStorage.test.ts +8 -120
  130. package/tests/DocumentInstance.test.ts +669 -0
  131. package/tests/HotStorage.test.ts +7 -126
  132. package/tests/StorageIntegration.test.ts +259 -0
  133. package/tsdown.config.ts +1 -1
  134. package/dist/DocumentManager.cjs +0 -229
  135. package/dist/DocumentManager.d.cts +0 -59
  136. package/dist/DocumentManager.d.cts.map +0 -1
  137. package/dist/DocumentManager.d.mts +0 -59
  138. package/dist/DocumentManager.d.mts.map +0 -1
  139. package/dist/DocumentManager.mjs +0 -227
  140. package/dist/DocumentManager.mjs.map +0 -1
  141. package/src/DocumentManager.ts +0 -506
  142. package/tests/DocumentManager.test.ts +0 -335
@@ -106,30 +106,29 @@ export const layer: Layer.Layer<PresenceManagerTag> = Layer.effect(
106
106
  /**
107
107
  * Get or create presence state for a document
108
108
  */
109
- const getOrCreateDocumentState = (
110
- documentId: string
111
- ): Effect.Effect<DocumentPresenceState> =>
112
- Effect.gen(function* () {
113
- const current = yield* Ref.get(store);
114
- const existing = HashMap.get(current, documentId);
115
- if (existing._tag === "Some") {
116
- return existing.value;
117
- }
118
-
119
- // Create new state for this document
120
- const pubsub = yield* PubSub.unbounded<PresenceEvent>();
121
- const state: DocumentPresenceState = {
122
- presences: HashMap.empty(),
123
- pubsub,
124
- };
125
-
126
- yield* Ref.update(store, (map) => HashMap.set(map, documentId, state));
127
- return state;
128
- });
109
+ const getOrCreateDocumentState = Effect.fn(
110
+ "presence.document-state.get-or-create"
111
+ )(function* (documentId: string) {
112
+ const current = yield* Ref.get(store);
113
+ const existing = HashMap.get(current, documentId);
114
+ if (existing._tag === "Some") {
115
+ return existing.value;
116
+ }
117
+
118
+ // Create new state for this document
119
+ const pubsub = yield* PubSub.unbounded<PresenceEvent>();
120
+ const state: DocumentPresenceState = {
121
+ presences: HashMap.empty(),
122
+ pubsub,
123
+ };
124
+
125
+ yield* Ref.update(store, (map) => HashMap.set(map, documentId, state));
126
+ return state;
127
+ });
129
128
 
130
129
  return {
131
- getSnapshot: (documentId) =>
132
- Effect.gen(function* () {
130
+ getSnapshot: Effect.fn("presence.snapshot.get")(
131
+ function* (documentId: string) {
133
132
  const current = yield* Ref.get(store);
134
133
  const existing = HashMap.get(current, documentId);
135
134
  if (existing._tag === "None") {
@@ -142,10 +141,15 @@ export const layer: Layer.Layer<PresenceManagerTag> = Layer.effect(
142
141
  presences[id] = entry;
143
142
  }
144
143
  return { presences };
145
- }),
146
-
147
- set: (documentId, connectionId, entry) =>
148
- Effect.gen(function* () {
144
+ }
145
+ ),
146
+
147
+ set: Effect.fn("presence.set")(
148
+ function* (
149
+ documentId: string,
150
+ connectionId: string,
151
+ entry: PresenceEntry
152
+ ) {
149
153
  const state = yield* getOrCreateDocumentState(documentId);
150
154
 
151
155
  // Update presence in store
@@ -174,16 +178,20 @@ export const layer: Layer.Layer<PresenceManagerTag> = Layer.effect(
174
178
  userId: entry.userId,
175
179
  };
176
180
  yield* PubSub.publish(state.pubsub, event);
177
- }),
181
+ }
182
+ ),
178
183
 
179
- remove: (documentId, connectionId) =>
180
- Effect.gen(function* () {
184
+ remove: Effect.fn("presence.remove")(
185
+ function* (documentId: string, connectionId: string) {
181
186
  const current = yield* Ref.get(store);
182
187
  const existing = HashMap.get(current, documentId);
183
188
  if (existing._tag === "None") return;
184
189
 
185
190
  // Check if presence exists before removing
186
- const hasPresence = HashMap.has(existing.value.presences, connectionId);
191
+ const hasPresence = HashMap.has(
192
+ existing.value.presences,
193
+ connectionId
194
+ );
187
195
  if (!hasPresence) return;
188
196
 
189
197
  // Remove presence from store
@@ -205,13 +213,15 @@ export const layer: Layer.Layer<PresenceManagerTag> = Layer.effect(
205
213
  id: connectionId,
206
214
  };
207
215
  yield* PubSub.publish(existing.value.pubsub, event);
208
- }),
216
+ }
217
+ ),
209
218
 
210
- subscribe: (documentId) =>
211
- Effect.gen(function* () {
219
+ subscribe: Effect.fn("presence.subscribe")(
220
+ function* (documentId: string) {
212
221
  const state = yield* getOrCreateDocumentState(documentId);
213
222
  return Stream.fromPubSub(state.pubsub);
214
- }),
223
+ }
224
+ ),
215
225
  };
216
226
  })
217
227
  );
package/src/Types.ts CHANGED
@@ -114,9 +114,15 @@ export type DurationInput = Duration.DurationInput;
114
114
  */
115
115
  export interface SnapshotConfig {
116
116
  /** Time-based snapshot interval */
117
- readonly interval: DurationInput;
117
+ readonly interval?: DurationInput;
118
118
  /** Transaction count threshold for snapshots */
119
- readonly transactionThreshold: number;
119
+ readonly transactionThreshold?: number;
120
+ /**
121
+ * Trigger snapshot when document is idle (no transactions) for this duration.
122
+ * Set to 0 to disable idle snapshots.
123
+ * Default: 30 seconds
124
+ */
125
+ readonly idleTimeout?: DurationInput;
120
126
  }
121
127
 
122
128
  /**
@@ -209,6 +215,7 @@ export interface ResolvedConfig<TSchema extends Primitive.AnyPrimitive> {
209
215
  readonly snapshot: {
210
216
  readonly interval: Duration.Duration;
211
217
  readonly transactionThreshold: number;
218
+ readonly idleTimeout: Duration.Duration;
212
219
  };
213
220
  }
214
221
 
package/src/index.ts CHANGED
@@ -22,42 +22,13 @@ export { MimicMetrics } from "./Metrics";
22
22
  // Types
23
23
  // =============================================================================
24
24
 
25
- export type {
26
- Permission,
27
- AuthContext,
28
- StoredDocument,
29
- WalEntry,
30
- PresenceEntry,
31
- PresenceSnapshot,
32
- PresenceEvent,
33
- PresenceUpdateEvent,
34
- PresenceRemoveEvent,
35
- DurationInput,
36
- SnapshotConfig,
37
- InitialContext,
38
- InitialFn,
39
- Initial,
40
- MimicServerEngineConfig,
41
- MimicClusterServerEngineConfig,
42
- ResolvedConfig,
43
- ResolvedClusterConfig,
44
- ResolvedRouteConfig,
45
- } from "./Types";
25
+ export type * from "./Types";
46
26
 
47
27
  // =============================================================================
48
28
  // Errors
49
29
  // =============================================================================
50
30
 
51
- export {
52
- ColdStorageError,
53
- HotStorageError,
54
- AuthenticationError,
55
- AuthorizationError,
56
- MissingDocumentIdError,
57
- MessageParseError,
58
- TransactionRejectedError,
59
- type MimicError,
60
- } from "./Errors";
31
+ export * from "./Errors";
61
32
 
62
33
  // =============================================================================
63
34
  // Protocol (for custom implementations)
@@ -70,11 +41,10 @@ export * as Protocol from "./Protocol";
70
41
  // =============================================================================
71
42
 
72
43
  export {
73
- DocumentManager,
74
- DocumentManagerTag,
75
- DocumentManagerConfigTag,
44
+ DocumentInstance,
45
+ type DocumentInstance as DocumentInstanceInterface,
76
46
  type SubmitResult,
77
- } from "./DocumentManager";
47
+ } from "./DocumentInstance";
78
48
 
79
49
  export {
80
50
  PresenceManager,