@voidhash/mimic-effect 0.0.8 → 1.0.0-beta.1
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 +93 -89
- package/README.md +385 -0
- package/dist/ColdStorage.cjs +60 -0
- package/dist/ColdStorage.d.cts +53 -0
- package/dist/ColdStorage.d.cts.map +1 -0
- package/dist/ColdStorage.d.mts +53 -0
- package/dist/ColdStorage.d.mts.map +1 -0
- package/dist/ColdStorage.mjs +60 -0
- package/dist/ColdStorage.mjs.map +1 -0
- package/dist/DocumentManager.cjs +193 -82
- package/dist/DocumentManager.d.cts +33 -19
- package/dist/DocumentManager.d.cts.map +1 -1
- package/dist/DocumentManager.d.mts +33 -19
- package/dist/DocumentManager.d.mts.map +1 -1
- package/dist/DocumentManager.mjs +189 -67
- package/dist/DocumentManager.mjs.map +1 -1
- package/dist/Errors.cjs +45 -0
- package/dist/Errors.d.cts +81 -0
- package/dist/Errors.d.cts.map +1 -0
- package/dist/Errors.d.mts +81 -0
- package/dist/Errors.d.mts.map +1 -0
- package/dist/Errors.mjs +40 -0
- package/dist/Errors.mjs.map +1 -0
- package/dist/HotStorage.cjs +77 -0
- package/dist/HotStorage.d.cts +54 -0
- package/dist/HotStorage.d.cts.map +1 -0
- package/dist/HotStorage.d.mts +54 -0
- package/dist/HotStorage.d.mts.map +1 -0
- package/dist/HotStorage.mjs +77 -0
- package/dist/HotStorage.mjs.map +1 -0
- package/dist/Metrics.cjs +121 -0
- package/dist/Metrics.d.cts +27 -0
- package/dist/Metrics.d.cts.map +1 -0
- package/dist/Metrics.d.mts +27 -0
- package/dist/Metrics.d.mts.map +1 -0
- package/dist/Metrics.mjs +106 -0
- package/dist/Metrics.mjs.map +1 -0
- package/dist/MimicAuthService.cjs +61 -45
- package/dist/MimicAuthService.d.cts +61 -48
- package/dist/MimicAuthService.d.cts.map +1 -1
- package/dist/MimicAuthService.d.mts +61 -48
- package/dist/MimicAuthService.d.mts.map +1 -1
- package/dist/MimicAuthService.mjs +60 -36
- package/dist/MimicAuthService.mjs.map +1 -1
- package/dist/MimicClusterServerEngine.cjs +443 -0
- package/dist/MimicClusterServerEngine.d.cts +17 -0
- package/dist/MimicClusterServerEngine.d.cts.map +1 -0
- package/dist/MimicClusterServerEngine.d.mts +17 -0
- package/dist/MimicClusterServerEngine.d.mts.map +1 -0
- package/dist/MimicClusterServerEngine.mjs +445 -0
- package/dist/MimicClusterServerEngine.mjs.map +1 -0
- package/dist/MimicServer.cjs +205 -96
- package/dist/MimicServer.d.cts +9 -110
- package/dist/MimicServer.d.cts.map +1 -1
- package/dist/MimicServer.d.mts +9 -110
- package/dist/MimicServer.d.mts.map +1 -1
- package/dist/MimicServer.mjs +206 -90
- package/dist/MimicServer.mjs.map +1 -1
- package/dist/MimicServerEngine.cjs +97 -0
- package/dist/MimicServerEngine.d.cts +75 -0
- package/dist/MimicServerEngine.d.cts.map +1 -0
- package/dist/MimicServerEngine.d.mts +75 -0
- package/dist/MimicServerEngine.d.mts.map +1 -0
- package/dist/MimicServerEngine.mjs +97 -0
- package/dist/MimicServerEngine.mjs.map +1 -0
- package/dist/PresenceManager.cjs +75 -91
- package/dist/PresenceManager.d.cts +17 -66
- package/dist/PresenceManager.d.cts.map +1 -1
- package/dist/PresenceManager.d.mts +17 -66
- package/dist/PresenceManager.d.mts.map +1 -1
- package/dist/PresenceManager.mjs +74 -78
- package/dist/PresenceManager.mjs.map +1 -1
- package/dist/Protocol.cjs +146 -0
- package/dist/Protocol.d.cts +203 -0
- package/dist/Protocol.d.cts.map +1 -0
- package/dist/Protocol.d.mts +203 -0
- package/dist/Protocol.d.mts.map +1 -0
- package/dist/Protocol.mjs +132 -0
- package/dist/Protocol.mjs.map +1 -0
- package/dist/Types.d.cts +172 -0
- package/dist/Types.d.cts.map +1 -0
- package/dist/Types.d.mts +172 -0
- package/dist/Types.d.mts.map +1 -0
- package/dist/_virtual/rolldown_runtime.cjs +1 -25
- package/dist/_virtual/rolldown_runtime.mjs +4 -1
- package/dist/index.cjs +37 -75
- package/dist/index.d.cts +13 -12
- package/dist/index.d.mts +13 -12
- package/dist/index.mjs +12 -12
- package/package.json +14 -6
- package/src/ColdStorage.ts +136 -0
- package/src/DocumentManager.ts +445 -193
- package/src/Errors.ts +100 -0
- package/src/HotStorage.ts +165 -0
- package/src/Metrics.ts +163 -0
- package/src/MimicAuthService.ts +126 -64
- package/src/MimicClusterServerEngine.ts +824 -0
- package/src/MimicServer.ts +448 -195
- package/src/MimicServerEngine.ts +272 -0
- package/src/PresenceManager.ts +169 -240
- package/src/Protocol.ts +350 -0
- package/src/Types.ts +231 -0
- package/src/index.ts +57 -23
- package/tests/ColdStorage.test.ts +136 -0
- package/tests/DocumentManager.test.ts +158 -287
- package/tests/HotStorage.test.ts +143 -0
- package/tests/MimicAuthService.test.ts +102 -134
- package/tests/MimicClusterServerEngine.test.ts +587 -0
- package/tests/MimicServer.test.ts +90 -226
- package/tests/MimicServerEngine.test.ts +521 -0
- package/tests/PresenceManager.test.ts +22 -63
- package/tests/Protocol.test.ts +190 -0
- package/tsconfig.json +1 -1
- package/dist/DocumentProtocol.cjs +0 -94
- package/dist/DocumentProtocol.d.cts +0 -113
- package/dist/DocumentProtocol.d.cts.map +0 -1
- package/dist/DocumentProtocol.d.mts +0 -113
- package/dist/DocumentProtocol.d.mts.map +0 -1
- package/dist/DocumentProtocol.mjs +0 -89
- package/dist/DocumentProtocol.mjs.map +0 -1
- package/dist/MimicConfig.cjs +0 -60
- package/dist/MimicConfig.d.cts +0 -141
- package/dist/MimicConfig.d.cts.map +0 -1
- package/dist/MimicConfig.d.mts +0 -141
- package/dist/MimicConfig.d.mts.map +0 -1
- package/dist/MimicConfig.mjs +0 -50
- package/dist/MimicConfig.mjs.map +0 -1
- package/dist/MimicDataStorage.cjs +0 -83
- package/dist/MimicDataStorage.d.cts +0 -113
- package/dist/MimicDataStorage.d.cts.map +0 -1
- package/dist/MimicDataStorage.d.mts +0 -113
- package/dist/MimicDataStorage.d.mts.map +0 -1
- package/dist/MimicDataStorage.mjs +0 -74
- package/dist/MimicDataStorage.mjs.map +0 -1
- package/dist/WebSocketHandler.cjs +0 -365
- package/dist/WebSocketHandler.d.cts +0 -34
- package/dist/WebSocketHandler.d.cts.map +0 -1
- package/dist/WebSocketHandler.d.mts +0 -34
- package/dist/WebSocketHandler.d.mts.map +0 -1
- package/dist/WebSocketHandler.mjs +0 -355
- package/dist/WebSocketHandler.mjs.map +0 -1
- package/dist/auth/NoAuth.cjs +0 -43
- package/dist/auth/NoAuth.d.cts +0 -22
- package/dist/auth/NoAuth.d.cts.map +0 -1
- package/dist/auth/NoAuth.d.mts +0 -22
- package/dist/auth/NoAuth.d.mts.map +0 -1
- package/dist/auth/NoAuth.mjs +0 -36
- package/dist/auth/NoAuth.mjs.map +0 -1
- package/dist/errors.cjs +0 -74
- package/dist/errors.d.cts +0 -89
- package/dist/errors.d.cts.map +0 -1
- package/dist/errors.d.mts +0 -89
- package/dist/errors.d.mts.map +0 -1
- package/dist/errors.mjs +0 -67
- package/dist/errors.mjs.map +0 -1
- package/dist/storage/InMemoryDataStorage.cjs +0 -57
- package/dist/storage/InMemoryDataStorage.d.cts +0 -19
- package/dist/storage/InMemoryDataStorage.d.cts.map +0 -1
- package/dist/storage/InMemoryDataStorage.d.mts +0 -19
- package/dist/storage/InMemoryDataStorage.d.mts.map +0 -1
- package/dist/storage/InMemoryDataStorage.mjs +0 -48
- package/dist/storage/InMemoryDataStorage.mjs.map +0 -1
- package/src/DocumentProtocol.ts +0 -112
- package/src/MimicConfig.ts +0 -211
- package/src/MimicDataStorage.ts +0 -157
- package/src/WebSocketHandler.ts +0 -735
- package/src/auth/NoAuth.ts +0 -46
- package/src/errors.ts +0 -113
- package/src/storage/InMemoryDataStorage.ts +0 -66
- package/tests/DocumentProtocol.test.ts +0 -113
- package/tests/InMemoryDataStorage.test.ts +0 -190
- package/tests/MimicConfig.test.ts +0 -290
- package/tests/MimicDataStorage.test.ts +0 -190
- package/tests/NoAuth.test.ts +0 -94
- package/tests/WebSocketHandler.test.ts +0 -321
- package/tests/errors.test.ts +0 -77
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
let effect = require("effect");
|
|
2
|
+
|
|
3
|
+
//#region src/ColdStorage.ts
|
|
4
|
+
/**
|
|
5
|
+
* @voidhash/mimic-effect - ColdStorage
|
|
6
|
+
*
|
|
7
|
+
* Interface and implementations for document snapshot storage.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Context tag for ColdStorage service
|
|
11
|
+
*/
|
|
12
|
+
var ColdStorageTag = class extends effect.Context.Tag("@voidhash/mimic-effect/ColdStorage")() {};
|
|
13
|
+
/**
|
|
14
|
+
* Create a ColdStorage layer from an Effect that produces a ColdStorage service.
|
|
15
|
+
*
|
|
16
|
+
* This allows you to access other Effect services when implementing custom storage.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const Cold = ColdStorage.make(
|
|
21
|
+
* Effect.gen(function*() {
|
|
22
|
+
* const redis = yield* RedisService
|
|
23
|
+
*
|
|
24
|
+
* return {
|
|
25
|
+
* load: (documentId) => redis.get(`doc:${documentId}`).pipe(
|
|
26
|
+
* Effect.map(data => data ? JSON.parse(data) : undefined)
|
|
27
|
+
* ),
|
|
28
|
+
* save: (documentId, document) =>
|
|
29
|
+
* redis.set(`doc:${documentId}`, JSON.stringify(document)),
|
|
30
|
+
* delete: (documentId) => redis.del(`doc:${documentId}`),
|
|
31
|
+
* }
|
|
32
|
+
* })
|
|
33
|
+
* )
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
const make = (effect$1) => effect.Layer.effect(ColdStorageTag, effect$1);
|
|
37
|
+
let InMemory;
|
|
38
|
+
(function(_InMemory) {
|
|
39
|
+
_InMemory.make = () => effect.Layer.effect(ColdStorageTag, effect.Effect.gen(function* () {
|
|
40
|
+
const store = yield* effect.Ref.make(effect.HashMap.empty());
|
|
41
|
+
return {
|
|
42
|
+
load: (documentId) => effect.Effect.gen(function* () {
|
|
43
|
+
const current = yield* effect.Ref.get(store);
|
|
44
|
+
const result = effect.HashMap.get(current, documentId);
|
|
45
|
+
return result._tag === "Some" ? result.value : void 0;
|
|
46
|
+
}),
|
|
47
|
+
save: (documentId, document) => effect.Ref.update(store, (map) => effect.HashMap.set(map, documentId, document)),
|
|
48
|
+
delete: (documentId) => effect.Ref.update(store, (map) => effect.HashMap.remove(map, documentId))
|
|
49
|
+
};
|
|
50
|
+
}));
|
|
51
|
+
})(InMemory || (InMemory = {}));
|
|
52
|
+
const ColdStorage = {
|
|
53
|
+
Tag: ColdStorageTag,
|
|
54
|
+
make,
|
|
55
|
+
InMemory
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
exports.ColdStorage = ColdStorage;
|
|
60
|
+
exports.ColdStorageTag = ColdStorageTag;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { StoredDocument } from "./Types.cjs";
|
|
2
|
+
import { ColdStorageError } from "./Errors.cjs";
|
|
3
|
+
import { Context, Effect, Layer } from "effect";
|
|
4
|
+
|
|
5
|
+
//#region src/ColdStorage.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* ColdStorage interface for storing document snapshots.
|
|
9
|
+
*
|
|
10
|
+
* This is the "cold" tier of the two-tier storage system.
|
|
11
|
+
* It stores complete document snapshots less frequently (on periodic intervals
|
|
12
|
+
* or after a threshold of transactions).
|
|
13
|
+
*/
|
|
14
|
+
interface ColdStorage {
|
|
15
|
+
/**
|
|
16
|
+
* Load a document snapshot.
|
|
17
|
+
* Returns undefined if the document doesn't exist.
|
|
18
|
+
*/
|
|
19
|
+
readonly load: (documentId: string) => Effect.Effect<StoredDocument | undefined, ColdStorageError>;
|
|
20
|
+
/**
|
|
21
|
+
* Save a document snapshot.
|
|
22
|
+
*/
|
|
23
|
+
readonly save: (documentId: string, document: StoredDocument) => Effect.Effect<void, ColdStorageError>;
|
|
24
|
+
/**
|
|
25
|
+
* Delete a document snapshot.
|
|
26
|
+
*/
|
|
27
|
+
readonly delete: (documentId: string) => Effect.Effect<void, ColdStorageError>;
|
|
28
|
+
}
|
|
29
|
+
declare const ColdStorageTag_base: Context.TagClass<ColdStorageTag, "@voidhash/mimic-effect/ColdStorage", ColdStorage>;
|
|
30
|
+
/**
|
|
31
|
+
* Context tag for ColdStorage service
|
|
32
|
+
*/
|
|
33
|
+
declare class ColdStorageTag extends ColdStorageTag_base {}
|
|
34
|
+
/**
|
|
35
|
+
* In-memory ColdStorage implementation.
|
|
36
|
+
*
|
|
37
|
+
* Useful for testing and development. Not suitable for production
|
|
38
|
+
* as data is lost when the process restarts.
|
|
39
|
+
*/
|
|
40
|
+
declare namespace InMemory {
|
|
41
|
+
/**
|
|
42
|
+
* Create an in-memory ColdStorage layer.
|
|
43
|
+
*/
|
|
44
|
+
const make: () => Layer.Layer<ColdStorageTag>;
|
|
45
|
+
}
|
|
46
|
+
declare const ColdStorage: {
|
|
47
|
+
Tag: typeof ColdStorageTag;
|
|
48
|
+
make: <E, R>(effect: Effect.Effect<ColdStorage, E, R>) => Layer.Layer<ColdStorageTag, E, R>;
|
|
49
|
+
InMemory: typeof InMemory;
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { ColdStorage, ColdStorageTag };
|
|
53
|
+
//# sourceMappingURL=ColdStorage.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColdStorage.d.cts","names":[],"sources":["../src/ColdStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AA2CC,UAvBgB,WAAA,CAuBhB;;;;;EASY,SAAA,IAAA,EAAA,CAAA,UAAe,EAAA,MAAQ,EAAA,GAzB7B,MAAA,CAAO,MA4BX,CA5BkB,cA4BlB,GAAA,SAAA,EA5B8C,gBA4B9C,CAAA;EA4Cc;AAgCjB;;EA9CwB,SAAA,IAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAnDV,cAmDU,EAAA,GAlDjB,MAAA,CAAO,MAkDU,CAAA,IAAA,EAlDG,gBAkDH,CAAA;EAAa;;;EACtB,SAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,GA5CR,MAAA,CAAO,MA4CC,CAAA,IAAA,EA5CY,gBA4CZ,CAAA;;cA3Cd,mBA2CiC,kBAAA,eAAA,EAAA,oCAAA,aAAA,CAAA;;;;cAlCrB,cAAA,SAAuB,mBAAA;;;;;;;kBA+CnB,QAAA;;;;oBAIS,KAAA,CAAM,MAAM;;cA4BzB;;uBA9CH,MAAA,CAAO,OAAO,aAAa,GAAG,OACrC,KAAA,CAAM,MAAM,gBAAgB,GAAG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { StoredDocument } from "./Types.mjs";
|
|
2
|
+
import { ColdStorageError } from "./Errors.mjs";
|
|
3
|
+
import { Context, Effect, Layer } from "effect";
|
|
4
|
+
|
|
5
|
+
//#region src/ColdStorage.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* ColdStorage interface for storing document snapshots.
|
|
9
|
+
*
|
|
10
|
+
* This is the "cold" tier of the two-tier storage system.
|
|
11
|
+
* It stores complete document snapshots less frequently (on periodic intervals
|
|
12
|
+
* or after a threshold of transactions).
|
|
13
|
+
*/
|
|
14
|
+
interface ColdStorage {
|
|
15
|
+
/**
|
|
16
|
+
* Load a document snapshot.
|
|
17
|
+
* Returns undefined if the document doesn't exist.
|
|
18
|
+
*/
|
|
19
|
+
readonly load: (documentId: string) => Effect.Effect<StoredDocument | undefined, ColdStorageError>;
|
|
20
|
+
/**
|
|
21
|
+
* Save a document snapshot.
|
|
22
|
+
*/
|
|
23
|
+
readonly save: (documentId: string, document: StoredDocument) => Effect.Effect<void, ColdStorageError>;
|
|
24
|
+
/**
|
|
25
|
+
* Delete a document snapshot.
|
|
26
|
+
*/
|
|
27
|
+
readonly delete: (documentId: string) => Effect.Effect<void, ColdStorageError>;
|
|
28
|
+
}
|
|
29
|
+
declare const ColdStorageTag_base: Context.TagClass<ColdStorageTag, "@voidhash/mimic-effect/ColdStorage", ColdStorage>;
|
|
30
|
+
/**
|
|
31
|
+
* Context tag for ColdStorage service
|
|
32
|
+
*/
|
|
33
|
+
declare class ColdStorageTag extends ColdStorageTag_base {}
|
|
34
|
+
/**
|
|
35
|
+
* In-memory ColdStorage implementation.
|
|
36
|
+
*
|
|
37
|
+
* Useful for testing and development. Not suitable for production
|
|
38
|
+
* as data is lost when the process restarts.
|
|
39
|
+
*/
|
|
40
|
+
declare namespace InMemory {
|
|
41
|
+
/**
|
|
42
|
+
* Create an in-memory ColdStorage layer.
|
|
43
|
+
*/
|
|
44
|
+
const make: () => Layer.Layer<ColdStorageTag>;
|
|
45
|
+
}
|
|
46
|
+
declare const ColdStorage: {
|
|
47
|
+
Tag: typeof ColdStorageTag;
|
|
48
|
+
make: <E, R>(effect: Effect.Effect<ColdStorage, E, R>) => Layer.Layer<ColdStorageTag, E, R>;
|
|
49
|
+
InMemory: typeof InMemory;
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { ColdStorage, ColdStorageTag };
|
|
53
|
+
//# sourceMappingURL=ColdStorage.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColdStorage.d.mts","names":[],"sources":["../src/ColdStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AA2CC,UAvBgB,WAAA,CAuBhB;;;;;EASY,SAAA,IAAA,EAAA,CAAA,UAAe,EAAA,MAAQ,EAAA,GAzB7B,MAAA,CAAO,MA4BX,CA5BkB,cA4BlB,GAAA,SAAA,EA5B8C,gBA4B9C,CAAA;EA4Cc;AAgCjB;;EA9CwB,SAAA,IAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAnDV,cAmDU,EAAA,GAlDjB,MAAA,CAAO,MAkDU,CAAA,IAAA,EAlDG,gBAkDH,CAAA;EAAa;;;EACtB,SAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,GA5CR,MAAA,CAAO,MA4CC,CAAA,IAAA,EA5CY,gBA4CZ,CAAA;;cA3Cd,mBA2CiC,kBAAA,eAAA,EAAA,oCAAA,aAAA,CAAA;;;;cAlCrB,cAAA,SAAuB,mBAAA;;;;;;;kBA+CnB,QAAA;;;;oBAIS,KAAA,CAAM,MAAM;;cA4BzB;;uBA9CH,MAAA,CAAO,OAAO,aAAa,GAAG,OACrC,KAAA,CAAM,MAAM,gBAAgB,GAAG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Context, Effect, HashMap, Layer, Ref } from "effect";
|
|
2
|
+
|
|
3
|
+
//#region src/ColdStorage.ts
|
|
4
|
+
/**
|
|
5
|
+
* @voidhash/mimic-effect - ColdStorage
|
|
6
|
+
*
|
|
7
|
+
* Interface and implementations for document snapshot storage.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Context tag for ColdStorage service
|
|
11
|
+
*/
|
|
12
|
+
var ColdStorageTag = class extends Context.Tag("@voidhash/mimic-effect/ColdStorage")() {};
|
|
13
|
+
/**
|
|
14
|
+
* Create a ColdStorage layer from an Effect that produces a ColdStorage service.
|
|
15
|
+
*
|
|
16
|
+
* This allows you to access other Effect services when implementing custom storage.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const Cold = ColdStorage.make(
|
|
21
|
+
* Effect.gen(function*() {
|
|
22
|
+
* const redis = yield* RedisService
|
|
23
|
+
*
|
|
24
|
+
* return {
|
|
25
|
+
* load: (documentId) => redis.get(`doc:${documentId}`).pipe(
|
|
26
|
+
* Effect.map(data => data ? JSON.parse(data) : undefined)
|
|
27
|
+
* ),
|
|
28
|
+
* save: (documentId, document) =>
|
|
29
|
+
* redis.set(`doc:${documentId}`, JSON.stringify(document)),
|
|
30
|
+
* delete: (documentId) => redis.del(`doc:${documentId}`),
|
|
31
|
+
* }
|
|
32
|
+
* })
|
|
33
|
+
* )
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
const make = (effect) => Layer.effect(ColdStorageTag, effect);
|
|
37
|
+
let InMemory;
|
|
38
|
+
(function(_InMemory) {
|
|
39
|
+
_InMemory.make = () => Layer.effect(ColdStorageTag, Effect.gen(function* () {
|
|
40
|
+
const store = yield* Ref.make(HashMap.empty());
|
|
41
|
+
return {
|
|
42
|
+
load: (documentId) => Effect.gen(function* () {
|
|
43
|
+
const current = yield* Ref.get(store);
|
|
44
|
+
const result = HashMap.get(current, documentId);
|
|
45
|
+
return result._tag === "Some" ? result.value : void 0;
|
|
46
|
+
}),
|
|
47
|
+
save: (documentId, document) => Ref.update(store, (map) => HashMap.set(map, documentId, document)),
|
|
48
|
+
delete: (documentId) => Ref.update(store, (map) => HashMap.remove(map, documentId))
|
|
49
|
+
};
|
|
50
|
+
}));
|
|
51
|
+
})(InMemory || (InMemory = {}));
|
|
52
|
+
const ColdStorage = {
|
|
53
|
+
Tag: ColdStorageTag,
|
|
54
|
+
make,
|
|
55
|
+
InMemory
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { ColdStorage, ColdStorageTag };
|
|
60
|
+
//# sourceMappingURL=ColdStorage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColdStorage.mjs","names":[],"sources":["../src/ColdStorage.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect - ColdStorage\n *\n * Interface and implementations for document snapshot storage.\n */\nimport { Context, Effect, HashMap, Layer, Ref } from \"effect\";\nimport type { StoredDocument } from \"./Types\";\nimport { ColdStorageError } from \"./Errors\";\n\n// =============================================================================\n// ColdStorage Interface\n// =============================================================================\n\n/**\n * ColdStorage interface for storing document snapshots.\n *\n * This is the \"cold\" tier of the two-tier storage system.\n * It stores complete document snapshots less frequently (on periodic intervals\n * or after a threshold of transactions).\n */\nexport interface ColdStorage {\n /**\n * Load a document snapshot.\n * Returns undefined if the document doesn't exist.\n */\n readonly load: (\n documentId: string\n ) => Effect.Effect<StoredDocument | undefined, ColdStorageError>;\n\n /**\n * Save a document snapshot.\n */\n readonly save: (\n documentId: string,\n document: StoredDocument\n ) => Effect.Effect<void, ColdStorageError>;\n\n /**\n * Delete a document snapshot.\n */\n readonly delete: (\n documentId: string\n ) => Effect.Effect<void, ColdStorageError>;\n}\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for ColdStorage service\n */\nexport class ColdStorageTag extends Context.Tag(\"@voidhash/mimic-effect/ColdStorage\")<\n ColdStorageTag,\n ColdStorage\n>() {}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create a ColdStorage layer from an Effect that produces a ColdStorage service.\n *\n * This allows you to access other Effect services when implementing custom storage.\n *\n * @example\n * ```typescript\n * const Cold = ColdStorage.make(\n * Effect.gen(function*() {\n * const redis = yield* RedisService\n *\n * return {\n * load: (documentId) => redis.get(`doc:${documentId}`).pipe(\n * Effect.map(data => data ? JSON.parse(data) : undefined)\n * ),\n * save: (documentId, document) =>\n * redis.set(`doc:${documentId}`, JSON.stringify(document)),\n * delete: (documentId) => redis.del(`doc:${documentId}`),\n * }\n * })\n * )\n * ```\n */\nexport const make = <E, R>(\n effect: Effect.Effect<ColdStorage, E, R>\n): Layer.Layer<ColdStorageTag, E, R> =>\n Layer.effect(ColdStorageTag, effect);\n\n// =============================================================================\n// InMemory Implementation\n// =============================================================================\n\n/**\n * In-memory ColdStorage implementation.\n *\n * Useful for testing and development. Not suitable for production\n * as data is lost when the process restarts.\n */\nexport namespace InMemory {\n /**\n * Create an in-memory ColdStorage layer.\n */\n export const make = (): Layer.Layer<ColdStorageTag> =>\n Layer.effect(\n ColdStorageTag,\n Effect.gen(function* () {\n const store = yield* Ref.make(HashMap.empty<string, StoredDocument>());\n\n return {\n load: (documentId) =>\n Effect.gen(function* () {\n const current = yield* Ref.get(store);\n const result = HashMap.get(current, documentId);\n return result._tag === \"Some\" ? result.value : undefined;\n }),\n\n save: (documentId, document) =>\n Ref.update(store, (map) => HashMap.set(map, documentId, document)),\n\n delete: (documentId) =>\n Ref.update(store, (map) => HashMap.remove(map, documentId)),\n };\n })\n );\n}\n\n// =============================================================================\n// Re-export namespace\n// =============================================================================\n\nexport const ColdStorage = {\n Tag: ColdStorageTag,\n make,\n InMemory,\n};\n"],"mappings":";;;;;;;;;;;AAoDA,IAAa,iBAAb,cAAoC,QAAQ,IAAI,qCAAqC,EAGlF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AA6BJ,MAAa,QACX,WAEA,MAAM,OAAO,gBAAgB,OAAO;;;wBAiBlC,MAAM,OACJ,gBACA,OAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,OAAO,IAAI,KAAK,QAAQ,OAA+B,CAAC;AAEtE,SAAO;GACL,OAAO,eACL,OAAO,IAAI,aAAa;IACtB,MAAM,UAAU,OAAO,IAAI,IAAI,MAAM;IACrC,MAAM,SAAS,QAAQ,IAAI,SAAS,WAAW;AAC/C,WAAO,OAAO,SAAS,SAAS,OAAO,QAAQ;KAC/C;GAEJ,OAAO,YAAY,aACjB,IAAI,OAAO,QAAQ,QAAQ,QAAQ,IAAI,KAAK,YAAY,SAAS,CAAC;GAEpE,SAAS,eACP,IAAI,OAAO,QAAQ,QAAQ,QAAQ,OAAO,KAAK,WAAW,CAAC;GAC9D;GACD,CACH;;AAOL,MAAa,cAAc;CACzB,KAAK;CACL;CACA;CACD"}
|
package/dist/DocumentManager.cjs
CHANGED
|
@@ -1,118 +1,229 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
let
|
|
5
|
-
effect_Effect = require_rolldown_runtime.__toESM(effect_Effect);
|
|
6
|
-
let effect_Layer = require("effect/Layer");
|
|
7
|
-
effect_Layer = require_rolldown_runtime.__toESM(effect_Layer);
|
|
8
|
-
let effect_PubSub = require("effect/PubSub");
|
|
9
|
-
effect_PubSub = require_rolldown_runtime.__toESM(effect_PubSub);
|
|
10
|
-
let effect_Ref = require("effect/Ref");
|
|
11
|
-
effect_Ref = require_rolldown_runtime.__toESM(effect_Ref);
|
|
12
|
-
let effect_HashMap = require("effect/HashMap");
|
|
13
|
-
effect_HashMap = require_rolldown_runtime.__toESM(effect_HashMap);
|
|
14
|
-
let effect_Context = require("effect/Context");
|
|
15
|
-
effect_Context = require_rolldown_runtime.__toESM(effect_Context);
|
|
16
|
-
let effect_Stream = require("effect/Stream");
|
|
17
|
-
effect_Stream = require_rolldown_runtime.__toESM(effect_Stream);
|
|
1
|
+
const require_ColdStorage = require('./ColdStorage.cjs');
|
|
2
|
+
const require_HotStorage = require('./HotStorage.cjs');
|
|
3
|
+
const require_Metrics = require('./Metrics.cjs');
|
|
4
|
+
let effect = require("effect");
|
|
18
5
|
let _voidhash_mimic_server = require("@voidhash/mimic/server");
|
|
19
6
|
|
|
20
7
|
//#region src/DocumentManager.ts
|
|
21
8
|
/**
|
|
22
|
-
* @
|
|
23
|
-
*
|
|
9
|
+
* @voidhash/mimic-effect - DocumentManager
|
|
10
|
+
*
|
|
11
|
+
* Internal service for managing document lifecycle, including:
|
|
12
|
+
* - Document creation and restoration
|
|
13
|
+
* - Transaction processing
|
|
14
|
+
* - WAL management
|
|
15
|
+
* - Snapshot scheduling
|
|
16
|
+
* - Idle document GC
|
|
24
17
|
*/
|
|
25
|
-
var DocumentManager_exports = /* @__PURE__ */ require_rolldown_runtime.__export({
|
|
26
|
-
DocumentManagerTag: () => DocumentManagerTag,
|
|
27
|
-
layer: () => layer
|
|
28
|
-
});
|
|
29
18
|
/**
|
|
30
|
-
* Context tag for DocumentManager
|
|
19
|
+
* Context tag for DocumentManager service
|
|
31
20
|
*/
|
|
32
|
-
var DocumentManagerTag = class extends
|
|
21
|
+
var DocumentManagerTag = class extends effect.Context.Tag("@voidhash/mimic-effect/DocumentManager")() {};
|
|
33
22
|
/**
|
|
34
|
-
*
|
|
23
|
+
* Context tag for DocumentManager configuration
|
|
35
24
|
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
25
|
+
var DocumentManagerConfigTag = class extends effect.Context.Tag("@voidhash/mimic-effect/DocumentManagerConfig")() {};
|
|
26
|
+
/**
|
|
27
|
+
* Create the DocumentManager layer.
|
|
28
|
+
* Requires ColdStorage, HotStorage, and DocumentManagerConfig.
|
|
29
|
+
*/
|
|
30
|
+
const layer = effect.Layer.scoped(DocumentManagerTag, effect.Effect.gen(function* () {
|
|
31
|
+
const coldStorage = yield* require_ColdStorage.ColdStorageTag;
|
|
32
|
+
const hotStorage = yield* require_HotStorage.HotStorageTag;
|
|
33
|
+
const config = yield* DocumentManagerConfigTag;
|
|
34
|
+
const store = yield* effect.Ref.make(effect.HashMap.empty());
|
|
35
|
+
const SCHEMA_VERSION = 1;
|
|
36
|
+
/**
|
|
37
|
+
* Compute initial state for a new document
|
|
38
|
+
*/
|
|
39
|
+
const computeInitialState = (documentId) => {
|
|
40
|
+
if (config.initial === void 0) return effect.Effect.succeed(void 0);
|
|
41
|
+
if (typeof config.initial === "function") return config.initial({ documentId });
|
|
42
|
+
return effect.Effect.succeed(config.initial);
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Restore a document from storage
|
|
46
|
+
*/
|
|
47
|
+
const restoreDocument = (documentId) => effect.Effect.gen(function* () {
|
|
48
|
+
const storedDoc = yield* effect.Effect.catchAll(coldStorage.load(documentId), () => effect.Effect.succeed(void 0));
|
|
49
|
+
let initialState;
|
|
50
|
+
let initialVersion = 0;
|
|
51
|
+
if (storedDoc) {
|
|
52
|
+
initialState = storedDoc.state;
|
|
53
|
+
initialVersion = storedDoc.version;
|
|
54
|
+
} else initialState = yield* computeInitialState(documentId);
|
|
55
|
+
const pubsub = yield* effect.PubSub.unbounded();
|
|
56
|
+
const lastSnapshotVersion = yield* effect.Ref.make(initialVersion);
|
|
57
|
+
const lastSnapshotTime = yield* effect.Ref.make(Date.now());
|
|
58
|
+
const transactionsSinceSnapshot = yield* effect.Ref.make(0);
|
|
59
|
+
const lastActivityTime = yield* effect.Ref.make(Date.now());
|
|
60
|
+
const document = _voidhash_mimic_server.ServerDocument.make({
|
|
51
61
|
schema: config.schema,
|
|
52
62
|
initialState,
|
|
63
|
+
initialVersion,
|
|
53
64
|
maxTransactionHistory: config.maxTransactionHistory,
|
|
54
|
-
onBroadcast: (
|
|
55
|
-
|
|
56
|
-
effect_Effect.runFork(effect_Effect.gen(function* () {
|
|
57
|
-
if (currentState !== void 0) {
|
|
58
|
-
const transformedState = yield* storage.onSave(currentState);
|
|
59
|
-
yield* effect_Effect.catchAll(storage.save(documentId, transformedState), (error) => effect_Effect.logError("Failed to save document", error));
|
|
60
|
-
}
|
|
61
|
-
}));
|
|
62
|
-
effect_Effect.runSync(effect_PubSub.publish(pubsub, {
|
|
65
|
+
onBroadcast: (message) => {
|
|
66
|
+
effect.Effect.runSync(effect.PubSub.publish(pubsub, {
|
|
63
67
|
type: "transaction",
|
|
64
|
-
transaction:
|
|
65
|
-
version:
|
|
68
|
+
transaction: message.transaction,
|
|
69
|
+
version: message.version
|
|
66
70
|
}));
|
|
67
71
|
},
|
|
68
72
|
onRejection: (transactionId, reason) => {
|
|
69
|
-
|
|
73
|
+
effect.Effect.runSync(effect.PubSub.publish(pubsub, {
|
|
70
74
|
type: "error",
|
|
71
75
|
transactionId,
|
|
72
76
|
reason
|
|
73
77
|
}));
|
|
74
78
|
}
|
|
75
79
|
});
|
|
80
|
+
const walEntries = yield* effect.Effect.catchAll(hotStorage.getEntries(documentId, initialVersion), () => effect.Effect.succeed([]));
|
|
81
|
+
for (const entry of walEntries) {
|
|
82
|
+
const result = document.submit(entry.transaction);
|
|
83
|
+
if (!result.success) yield* effect.Effect.logWarning("Skipping corrupted WAL entry", {
|
|
84
|
+
documentId,
|
|
85
|
+
version: entry.version,
|
|
86
|
+
reason: result.reason
|
|
87
|
+
});
|
|
88
|
+
}
|
|
76
89
|
const instance = {
|
|
77
|
-
document
|
|
90
|
+
document,
|
|
78
91
|
pubsub,
|
|
79
|
-
|
|
92
|
+
lastSnapshotVersion,
|
|
93
|
+
lastSnapshotTime,
|
|
94
|
+
transactionsSinceSnapshot,
|
|
95
|
+
lastActivityTime
|
|
80
96
|
};
|
|
81
|
-
|
|
97
|
+
if (storedDoc) yield* effect.Metric.increment(require_Metrics.documentsRestored);
|
|
98
|
+
else yield* effect.Metric.increment(require_Metrics.documentsCreated);
|
|
99
|
+
yield* effect.Metric.incrementBy(require_Metrics.documentsActive, 1);
|
|
82
100
|
return instance;
|
|
83
101
|
});
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Get or create a document instance
|
|
104
|
+
*/
|
|
105
|
+
const getOrCreateDocument = (documentId) => effect.Effect.gen(function* () {
|
|
106
|
+
const current = yield* effect.Ref.get(store);
|
|
107
|
+
const existing = effect.HashMap.get(current, documentId);
|
|
108
|
+
if (existing._tag === "Some") {
|
|
109
|
+
yield* effect.Ref.set(existing.value.lastActivityTime, Date.now());
|
|
110
|
+
return existing.value;
|
|
111
|
+
}
|
|
112
|
+
const instance = yield* restoreDocument(documentId);
|
|
113
|
+
yield* effect.Ref.update(store, (map) => effect.HashMap.set(map, documentId, instance));
|
|
114
|
+
return instance;
|
|
89
115
|
});
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Save a snapshot to ColdStorage and truncate WAL
|
|
118
|
+
*/
|
|
119
|
+
const saveSnapshot = (documentId, instance) => effect.Effect.gen(function* () {
|
|
120
|
+
const state = instance.document.get();
|
|
121
|
+
const version = instance.document.getVersion();
|
|
122
|
+
if (state === void 0) return;
|
|
123
|
+
const storedDoc = {
|
|
124
|
+
state,
|
|
125
|
+
version,
|
|
126
|
+
schemaVersion: SCHEMA_VERSION,
|
|
127
|
+
savedAt: Date.now()
|
|
128
|
+
};
|
|
129
|
+
const snapshotStartTime = Date.now();
|
|
130
|
+
yield* effect.Effect.catchAll(coldStorage.save(documentId, storedDoc), (e) => effect.Effect.logError("Failed to save snapshot", {
|
|
131
|
+
documentId,
|
|
132
|
+
error: e
|
|
133
|
+
}));
|
|
134
|
+
const snapshotDuration = Date.now() - snapshotStartTime;
|
|
135
|
+
yield* effect.Metric.increment(require_Metrics.storageSnapshots);
|
|
136
|
+
yield* effect.Metric.update(require_Metrics.storageSnapshotLatency, snapshotDuration);
|
|
137
|
+
yield* effect.Effect.catchAll(hotStorage.truncate(documentId, version), (e) => effect.Effect.logError("Failed to truncate WAL", {
|
|
138
|
+
documentId,
|
|
139
|
+
error: e
|
|
95
140
|
}));
|
|
96
|
-
|
|
141
|
+
yield* effect.Ref.set(instance.lastSnapshotVersion, version);
|
|
142
|
+
yield* effect.Ref.set(instance.lastSnapshotTime, Date.now());
|
|
143
|
+
yield* effect.Ref.set(instance.transactionsSinceSnapshot, 0);
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* Check if snapshot should be triggered
|
|
147
|
+
*/
|
|
148
|
+
const checkSnapshotTriggers = (documentId, instance) => effect.Effect.gen(function* () {
|
|
149
|
+
const txCount = yield* effect.Ref.get(instance.transactionsSinceSnapshot);
|
|
150
|
+
const lastTime = yield* effect.Ref.get(instance.lastSnapshotTime);
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const intervalMs = effect.Duration.toMillis(config.snapshot.interval);
|
|
153
|
+
if (txCount >= config.snapshot.transactionThreshold) {
|
|
154
|
+
yield* saveSnapshot(documentId, instance);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (now - lastTime >= intervalMs) {
|
|
158
|
+
yield* saveSnapshot(documentId, instance);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
97
161
|
});
|
|
162
|
+
yield* effect.Effect.gen(function* () {
|
|
163
|
+
yield* effect.Effect.gen(function* () {
|
|
164
|
+
const current = yield* effect.Ref.get(store);
|
|
165
|
+
const now = Date.now();
|
|
166
|
+
const maxIdleMs = effect.Duration.toMillis(config.maxIdleTime);
|
|
167
|
+
for (const [documentId, instance] of current) if (now - (yield* effect.Ref.get(instance.lastActivityTime)) >= maxIdleMs) {
|
|
168
|
+
yield* saveSnapshot(documentId, instance);
|
|
169
|
+
yield* effect.Ref.update(store, (map) => effect.HashMap.remove(map, documentId));
|
|
170
|
+
yield* effect.Metric.increment(require_Metrics.documentsEvicted);
|
|
171
|
+
yield* effect.Metric.incrementBy(require_Metrics.documentsActive, -1);
|
|
172
|
+
yield* effect.Effect.logInfo("Document evicted due to idle timeout", { documentId });
|
|
173
|
+
}
|
|
174
|
+
}).pipe(effect.Effect.repeat(effect.Schedule.spaced("1 minute")), effect.Effect.fork);
|
|
175
|
+
});
|
|
176
|
+
yield* effect.Effect.addFinalizer(() => effect.Effect.gen(function* () {
|
|
177
|
+
const current = yield* effect.Ref.get(store);
|
|
178
|
+
for (const [documentId, instance] of current) yield* saveSnapshot(documentId, instance);
|
|
179
|
+
yield* effect.Effect.logInfo("DocumentManager shutdown complete");
|
|
180
|
+
}));
|
|
98
181
|
return {
|
|
99
|
-
submit,
|
|
100
|
-
|
|
101
|
-
|
|
182
|
+
submit: (documentId, transaction) => effect.Effect.gen(function* () {
|
|
183
|
+
const instance = yield* getOrCreateDocument(documentId);
|
|
184
|
+
const submitStartTime = Date.now();
|
|
185
|
+
const result = instance.document.submit(transaction);
|
|
186
|
+
const latency = Date.now() - submitStartTime;
|
|
187
|
+
yield* effect.Metric.update(require_Metrics.transactionsLatency, latency);
|
|
188
|
+
if (result.success) {
|
|
189
|
+
yield* effect.Metric.increment(require_Metrics.transactionsProcessed);
|
|
190
|
+
const walEntry = {
|
|
191
|
+
transaction,
|
|
192
|
+
version: result.version,
|
|
193
|
+
timestamp: Date.now()
|
|
194
|
+
};
|
|
195
|
+
yield* effect.Effect.catchAll(hotStorage.append(documentId, walEntry), (e) => effect.Effect.logError("Failed to append to WAL", {
|
|
196
|
+
documentId,
|
|
197
|
+
error: e
|
|
198
|
+
}));
|
|
199
|
+
yield* effect.Metric.increment(require_Metrics.storageWalAppends);
|
|
200
|
+
yield* effect.Ref.update(instance.transactionsSinceSnapshot, (n) => n + 1);
|
|
201
|
+
yield* checkSnapshotTriggers(documentId, instance);
|
|
202
|
+
} else yield* effect.Metric.increment(require_Metrics.transactionsRejected);
|
|
203
|
+
return result;
|
|
204
|
+
}),
|
|
205
|
+
getSnapshot: (documentId) => effect.Effect.gen(function* () {
|
|
206
|
+
return (yield* getOrCreateDocument(documentId)).document.getSnapshot();
|
|
207
|
+
}),
|
|
208
|
+
subscribe: (documentId) => effect.Effect.gen(function* () {
|
|
209
|
+
const instance = yield* getOrCreateDocument(documentId);
|
|
210
|
+
return effect.Stream.fromPubSub(instance.pubsub);
|
|
211
|
+
}),
|
|
212
|
+
touch: (documentId) => effect.Effect.gen(function* () {
|
|
213
|
+
const current = yield* effect.Ref.get(store);
|
|
214
|
+
const existing = effect.HashMap.get(current, documentId);
|
|
215
|
+
if (existing._tag === "Some") yield* effect.Ref.set(existing.value.lastActivityTime, Date.now());
|
|
216
|
+
})
|
|
102
217
|
};
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
218
|
+
}));
|
|
219
|
+
const DocumentManager = {
|
|
220
|
+
Tag: DocumentManagerTag,
|
|
221
|
+
ConfigTag: DocumentManagerConfigTag,
|
|
222
|
+
layer
|
|
223
|
+
};
|
|
109
224
|
|
|
110
225
|
//#endregion
|
|
226
|
+
exports.DocumentManager = DocumentManager;
|
|
227
|
+
exports.DocumentManagerConfigTag = DocumentManagerConfigTag;
|
|
111
228
|
exports.DocumentManagerTag = DocumentManagerTag;
|
|
112
|
-
Object.defineProperty(exports, 'DocumentManager_exports', {
|
|
113
|
-
enumerable: true,
|
|
114
|
-
get: function () {
|
|
115
|
-
return DocumentManager_exports;
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
229
|
exports.layer = layer;
|
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { ResolvedConfig } from "./Types.cjs";
|
|
2
|
+
import { ServerBroadcast, SnapshotMessage } from "./Protocol.cjs";
|
|
3
|
+
import { ColdStorageTag } from "./ColdStorage.cjs";
|
|
4
|
+
import { HotStorageTag } from "./HotStorage.cjs";
|
|
5
|
+
import { Context, Effect, Layer, Scope, Stream } from "effect";
|
|
6
6
|
import { Transaction } from "@voidhash/mimic";
|
|
7
|
-
import * as Context from "effect/Context";
|
|
8
|
-
import * as Scope from "effect/Scope";
|
|
9
|
-
import * as Stream from "effect/Stream";
|
|
10
7
|
|
|
11
8
|
//#region src/DocumentManager.d.ts
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Result of submitting a transaction
|
|
12
|
+
*/
|
|
13
|
+
type SubmitResult = {
|
|
14
|
+
readonly success: true;
|
|
15
|
+
readonly version: number;
|
|
16
|
+
} | {
|
|
17
|
+
readonly success: false;
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
};
|
|
15
20
|
/**
|
|
16
|
-
*
|
|
21
|
+
* Internal service for managing document lifecycle.
|
|
17
22
|
*/
|
|
18
23
|
interface DocumentManager {
|
|
19
24
|
/**
|
|
@@ -26,20 +31,29 @@ interface DocumentManager {
|
|
|
26
31
|
readonly getSnapshot: (documentId: string) => Effect.Effect<SnapshotMessage>;
|
|
27
32
|
/**
|
|
28
33
|
* Subscribe to broadcasts for a document.
|
|
29
|
-
* Returns a Stream of server broadcasts.
|
|
30
34
|
*/
|
|
31
35
|
readonly subscribe: (documentId: string) => Effect.Effect<Stream.Stream<ServerBroadcast>, never, Scope.Scope>;
|
|
36
|
+
/**
|
|
37
|
+
* Touch a document to update its last activity time.
|
|
38
|
+
* Call this on any client activity to prevent idle GC.
|
|
39
|
+
*/
|
|
40
|
+
readonly touch: (documentId: string) => Effect.Effect<void>;
|
|
32
41
|
}
|
|
33
|
-
declare const DocumentManagerTag_base: Context.TagClass<DocumentManagerTag, "@voidhash/mimic-
|
|
42
|
+
declare const DocumentManagerTag_base: Context.TagClass<DocumentManagerTag, "@voidhash/mimic-effect/DocumentManager", DocumentManager>;
|
|
34
43
|
/**
|
|
35
|
-
* Context tag for DocumentManager
|
|
44
|
+
* Context tag for DocumentManager service
|
|
36
45
|
*/
|
|
37
46
|
declare class DocumentManagerTag extends DocumentManagerTag_base {}
|
|
47
|
+
declare const DocumentManagerConfigTag_base: Context.TagClass<DocumentManagerConfigTag, "@voidhash/mimic-effect/DocumentManagerConfig", ResolvedConfig<Primitive.AnyPrimitive>>;
|
|
38
48
|
/**
|
|
39
|
-
*
|
|
40
|
-
* Requires MimicServerConfigTag and MimicDataStorageTag.
|
|
49
|
+
* Context tag for DocumentManager configuration
|
|
41
50
|
*/
|
|
42
|
-
declare
|
|
51
|
+
declare class DocumentManagerConfigTag extends DocumentManagerConfigTag_base {}
|
|
52
|
+
declare const DocumentManager: {
|
|
53
|
+
Tag: typeof DocumentManagerTag;
|
|
54
|
+
ConfigTag: typeof DocumentManagerConfigTag;
|
|
55
|
+
layer: Layer.Layer<DocumentManagerTag, never, ColdStorageTag | HotStorageTag | DocumentManagerConfigTag>;
|
|
56
|
+
};
|
|
43
57
|
//#endregion
|
|
44
|
-
export { DocumentManagerTag,
|
|
58
|
+
export { DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, SubmitResult };
|
|
45
59
|
//# sourceMappingURL=DocumentManager.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentManager.d.cts","names":[],"sources":["../src/DocumentManager.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DocumentManager.d.cts","names":[],"sources":["../src/DocumentManager.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AAgF0C,KApC9B,YAAA,GAoCqC;EAAM,SAAA,OAAA,EAAA,IAAA;EACtD,SAAA,OAAA,EAAA,MAAA;;;;;AASD;AAE2C;;UArC1B,eAAA;;;;EAoEJ,SAAA,MAAA,EAAA,CAAA,UAAyB,EAAA,MAAA,EAAA,WAAQ,EA9D7B,WAAA,CAAY,WAgEwC,EAAA,GA/D9D,MAAA,CAAO,MA+DuD,CA/DhD,YA+DgD,CAAA;EAwXxD;;;gDAlbmC,MAAA,CAAO,OAAO;;;;8CAOvD,MAAA,CAAO,OAAO,MAAA,CAAO,OAAO,yBAAyB,KAAA,CAAM;;;;;0CAMxB,MAAA,CAAO;;cAChD;;;;cASY,kBAAA,SAA2B,uBAAA;cAEG;;;;cA+B9B,wBAAA,SAAiC,6BAAA;cA0XjC"}
|