@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.
- package/.turbo/turbo-build.log +116 -74
- package/dist/ColdStorage.cjs +9 -5
- package/dist/ColdStorage.d.cts.map +1 -1
- package/dist/ColdStorage.d.mts.map +1 -1
- package/dist/ColdStorage.mjs +9 -5
- package/dist/ColdStorage.mjs.map +1 -1
- package/dist/DocumentInstance.cjs +263 -0
- package/dist/DocumentInstance.d.cts +78 -0
- package/dist/DocumentInstance.d.cts.map +1 -0
- package/dist/DocumentInstance.d.mts +78 -0
- package/dist/DocumentInstance.d.mts.map +1 -0
- package/dist/DocumentInstance.mjs +264 -0
- package/dist/DocumentInstance.mjs.map +1 -0
- package/dist/Errors.cjs +10 -1
- package/dist/Errors.d.cts +18 -3
- package/dist/Errors.d.cts.map +1 -1
- package/dist/Errors.d.mts +18 -3
- package/dist/Errors.d.mts.map +1 -1
- package/dist/Errors.mjs +9 -1
- package/dist/Errors.mjs.map +1 -1
- package/dist/HotStorage.cjs +39 -12
- package/dist/HotStorage.d.cts +17 -1
- package/dist/HotStorage.d.cts.map +1 -1
- package/dist/HotStorage.d.mts +17 -1
- package/dist/HotStorage.d.mts.map +1 -1
- package/dist/HotStorage.mjs +39 -12
- package/dist/HotStorage.mjs.map +1 -1
- package/dist/Metrics.cjs +29 -1
- package/dist/Metrics.d.cts +5 -0
- package/dist/Metrics.d.cts.map +1 -1
- package/dist/Metrics.d.mts +5 -0
- package/dist/Metrics.d.mts.map +1 -1
- package/dist/Metrics.mjs +26 -1
- package/dist/Metrics.mjs.map +1 -1
- package/dist/MimicClusterServerEngine.cjs +44 -139
- package/dist/MimicClusterServerEngine.d.cts.map +1 -1
- package/dist/MimicClusterServerEngine.d.mts +1 -1
- package/dist/MimicClusterServerEngine.d.mts.map +1 -1
- package/dist/MimicClusterServerEngine.mjs +46 -141
- package/dist/MimicClusterServerEngine.mjs.map +1 -1
- package/dist/MimicServer.cjs +20 -20
- package/dist/MimicServer.d.cts.map +1 -1
- package/dist/MimicServer.d.mts.map +1 -1
- package/dist/MimicServer.mjs +20 -20
- package/dist/MimicServer.mjs.map +1 -1
- package/dist/MimicServerEngine.cjs +92 -11
- package/dist/MimicServerEngine.d.cts +12 -4
- package/dist/MimicServerEngine.d.cts.map +1 -1
- package/dist/MimicServerEngine.d.mts +12 -4
- package/dist/MimicServerEngine.d.mts.map +1 -1
- package/dist/MimicServerEngine.mjs +94 -13
- package/dist/MimicServerEngine.mjs.map +1 -1
- package/dist/PresenceManager.cjs +5 -5
- package/dist/PresenceManager.d.cts.map +1 -1
- package/dist/PresenceManager.d.mts.map +1 -1
- package/dist/PresenceManager.mjs +5 -5
- package/dist/PresenceManager.mjs.map +1 -1
- package/dist/Protocol.d.cts +1 -1
- package/dist/Protocol.d.mts +1 -1
- package/dist/Types.d.cts +9 -2
- package/dist/Types.d.cts.map +1 -1
- package/dist/Types.d.mts +9 -2
- package/dist/Types.d.mts.map +1 -1
- package/dist/index.cjs +5 -6
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -3
- package/dist/testing/ColdStorageTestSuite.cjs +508 -0
- package/dist/testing/ColdStorageTestSuite.d.cts +36 -0
- package/dist/testing/ColdStorageTestSuite.d.cts.map +1 -0
- package/dist/testing/ColdStorageTestSuite.d.mts +36 -0
- package/dist/testing/ColdStorageTestSuite.d.mts.map +1 -0
- package/dist/testing/ColdStorageTestSuite.mjs +508 -0
- package/dist/testing/ColdStorageTestSuite.mjs.map +1 -0
- package/dist/testing/FailingStorage.cjs +162 -0
- package/dist/testing/FailingStorage.d.cts +43 -0
- package/dist/testing/FailingStorage.d.cts.map +1 -0
- package/dist/testing/FailingStorage.d.mts +43 -0
- package/dist/testing/FailingStorage.d.mts.map +1 -0
- package/dist/testing/FailingStorage.mjs +163 -0
- package/dist/testing/FailingStorage.mjs.map +1 -0
- package/dist/testing/HotStorageTestSuite.cjs +820 -0
- package/dist/testing/HotStorageTestSuite.d.cts +42 -0
- package/dist/testing/HotStorageTestSuite.d.cts.map +1 -0
- package/dist/testing/HotStorageTestSuite.d.mts +42 -0
- package/dist/testing/HotStorageTestSuite.d.mts.map +1 -0
- package/dist/testing/HotStorageTestSuite.mjs +820 -0
- package/dist/testing/HotStorageTestSuite.mjs.map +1 -0
- package/dist/testing/StorageIntegrationTestSuite.cjs +487 -0
- package/dist/testing/StorageIntegrationTestSuite.d.cts +37 -0
- package/dist/testing/StorageIntegrationTestSuite.d.cts.map +1 -0
- package/dist/testing/StorageIntegrationTestSuite.d.mts +37 -0
- package/dist/testing/StorageIntegrationTestSuite.d.mts.map +1 -0
- package/dist/testing/StorageIntegrationTestSuite.mjs +487 -0
- package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -0
- package/dist/testing/assertions.cjs +117 -0
- package/dist/testing/assertions.mjs +112 -0
- package/dist/testing/assertions.mjs.map +1 -0
- package/dist/testing/index.cjs +14 -0
- package/dist/testing/index.d.cts +6 -0
- package/dist/testing/index.d.mts +6 -0
- package/dist/testing/index.mjs +7 -0
- package/dist/testing/types.cjs +15 -0
- package/dist/testing/types.d.cts +90 -0
- package/dist/testing/types.d.cts.map +1 -0
- package/dist/testing/types.d.mts +90 -0
- package/dist/testing/types.d.mts.map +1 -0
- package/dist/testing/types.mjs +16 -0
- package/dist/testing/types.mjs.map +1 -0
- package/package.json +8 -3
- package/src/ColdStorage.ts +21 -12
- package/src/DocumentInstance.ts +527 -0
- package/src/Errors.ts +15 -1
- package/src/HotStorage.ts +115 -24
- package/src/Metrics.ts +30 -0
- package/src/MimicClusterServerEngine.ts +120 -275
- package/src/MimicServer.ts +83 -75
- package/src/MimicServerEngine.ts +230 -30
- package/src/PresenceManager.ts +44 -34
- package/src/Types.ts +9 -2
- package/src/index.ts +5 -35
- package/src/testing/ColdStorageTestSuite.ts +589 -0
- package/src/testing/FailingStorage.ts +338 -0
- package/src/testing/HotStorageTestSuite.ts +1105 -0
- package/src/testing/StorageIntegrationTestSuite.ts +736 -0
- package/src/testing/assertions.ts +188 -0
- package/src/testing/index.ts +83 -0
- package/src/testing/types.ts +100 -0
- package/tests/ColdStorage.test.ts +8 -120
- package/tests/DocumentInstance.test.ts +669 -0
- package/tests/HotStorage.test.ts +7 -126
- package/tests/StorageIntegration.test.ts +259 -0
- package/tsdown.config.ts +1 -1
- package/dist/DocumentManager.cjs +0 -229
- package/dist/DocumentManager.d.cts +0 -59
- package/dist/DocumentManager.d.cts.map +0 -1
- package/dist/DocumentManager.d.mts +0 -59
- package/dist/DocumentManager.d.mts.map +0 -1
- package/dist/DocumentManager.mjs +0 -227
- package/dist/DocumentManager.mjs.map +0 -1
- package/src/DocumentManager.ts +0 -506
- package/tests/DocumentManager.test.ts +0 -335
package/src/PresenceManager.ts
CHANGED
|
@@ -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
|
-
|
|
111
|
-
):
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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: (
|
|
132
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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: (
|
|
180
|
-
|
|
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(
|
|
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: (
|
|
211
|
-
|
|
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
|
|
117
|
+
readonly interval?: DurationInput;
|
|
118
118
|
/** Transaction count threshold for snapshots */
|
|
119
|
-
readonly transactionThreshold
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
DocumentManagerConfigTag,
|
|
44
|
+
DocumentInstance,
|
|
45
|
+
type DocumentInstance as DocumentInstanceInterface,
|
|
76
46
|
type SubmitResult,
|
|
77
|
-
} from "./
|
|
47
|
+
} from "./DocumentInstance";
|
|
78
48
|
|
|
79
49
|
export {
|
|
80
50
|
PresenceManager,
|