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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/.turbo/turbo-build.log +26 -26
  2. package/dist/MimicServer.d.cts +1 -1
  3. package/dist/MimicServer.d.cts.map +1 -1
  4. package/dist/MimicServer.d.mts +1 -1
  5. package/dist/MimicServer.d.mts.map +1 -1
  6. package/dist/index.cjs +2 -1
  7. package/dist/index.d.cts +2 -2
  8. package/dist/index.d.mts +2 -2
  9. package/dist/index.mjs +2 -2
  10. package/dist/testing/FailingStorage.cjs +27 -0
  11. package/dist/testing/FailingStorage.d.cts.map +1 -1
  12. package/dist/testing/FailingStorage.d.mts.map +1 -1
  13. package/dist/testing/FailingStorage.mjs +28 -1
  14. package/dist/testing/FailingStorage.mjs.map +1 -1
  15. package/dist/testing/HotStorageTestSuite.cjs +253 -6
  16. package/dist/testing/HotStorageTestSuite.d.cts +2 -0
  17. package/dist/testing/HotStorageTestSuite.d.cts.map +1 -1
  18. package/dist/testing/HotStorageTestSuite.d.mts +2 -0
  19. package/dist/testing/HotStorageTestSuite.d.mts.map +1 -1
  20. package/dist/testing/HotStorageTestSuite.mjs +255 -8
  21. package/dist/testing/HotStorageTestSuite.mjs.map +1 -1
  22. package/dist/testing/StorageIntegrationTestSuite.cjs +150 -12
  23. package/dist/testing/StorageIntegrationTestSuite.d.cts +2 -0
  24. package/dist/testing/StorageIntegrationTestSuite.d.cts.map +1 -1
  25. package/dist/testing/StorageIntegrationTestSuite.d.mts +2 -0
  26. package/dist/testing/StorageIntegrationTestSuite.d.mts.map +1 -1
  27. package/dist/testing/StorageIntegrationTestSuite.mjs +151 -13
  28. package/dist/testing/StorageIntegrationTestSuite.mjs.map +1 -1
  29. package/dist/testing/types.d.cts +3 -3
  30. package/package.json +3 -3
  31. package/src/index.ts +2 -31
  32. package/src/testing/FailingStorage.ts +53 -1
  33. package/src/testing/HotStorageTestSuite.ts +346 -3
  34. package/src/testing/StorageIntegrationTestSuite.ts +239 -7
@@ -1,5 +1,5 @@
1
1
 
2
- > @voidhash/mimic-effect@1.0.0-beta.2 build /home/runner/work/mimic/mimic/packages/mimic-effect
2
+ > @voidhash/mimic-effect@1.0.0-beta.4 build /home/runner/work/mimic/mimic/packages/mimic-effect
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.18.2 powered by rolldown v1.0.0-beta.55
@@ -8,15 +8,15 @@
8
8
  ℹ target: es2017
9
9
  ℹ tsconfig: tsconfig.json
10
10
  ℹ Build start
11
- ℹ [CJS] dist/index.cjs  2.37 kB │ gzip: 0.49 kB
11
+ ℹ [CJS] dist/index.cjs  2.43 kB │ gzip: 0.50 kB
12
12
  ℹ [CJS] dist/testing/index.cjs  0.95 kB │ gzip: 0.22 kB
13
- ℹ [CJS] dist/testing/HotStorageTestSuite.cjs 26.32 kB │ gzip: 3.90 kB
13
+ ℹ [CJS] dist/testing/HotStorageTestSuite.cjs 37.91 kB │ gzip: 5.16 kB
14
14
  ℹ [CJS] dist/MimicClusterServerEngine.cjs 21.55 kB │ gzip: 4.91 kB
15
+ ℹ [CJS] dist/testing/StorageIntegrationTestSuite.cjs 20.68 kB │ gzip: 3.67 kB
15
16
  ℹ [CJS] dist/testing/ColdStorageTestSuite.cjs 18.14 kB │ gzip: 3.22 kB
16
- ℹ [CJS] dist/testing/StorageIntegrationTestSuite.cjs 13.93 kB │ gzip: 2.58 kB
17
17
  ℹ [CJS] dist/DocumentManager.cjs 12.28 kB │ gzip: 2.97 kB
18
18
  ℹ [CJS] dist/MimicServer.cjs 10.10 kB │ gzip: 2.74 kB
19
- ℹ [CJS] dist/testing/FailingStorage.cjs  5.77 kB │ gzip: 1.30 kB
19
+ ℹ [CJS] dist/testing/FailingStorage.cjs  6.91 kB │ gzip: 1.53 kB
20
20
  ℹ [CJS] dist/Metrics.cjs  4.26 kB │ gzip: 1.04 kB
21
21
  ℹ [CJS] dist/MimicServerEngine.cjs  4.23 kB │ gzip: 1.34 kB
22
22
  ℹ [CJS] dist/Protocol.cjs  3.78 kB │ gzip: 1.14 kB
@@ -33,7 +33,7 @@
33
33
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs  0.37 kB │ gzip: 0.23 kB
34
34
  ℹ [CJS] dist/_virtual/rolldown_runtime.cjs  0.36 kB │ gzip: 0.25 kB
35
35
  ℹ [CJS] dist/testing/types.cjs  0.34 kB │ gzip: 0.23 kB
36
- ℹ [CJS] 25 files, total: 144.08 kB
36
+ ℹ [CJS] 25 files, total: 163.63 kB
37
37
  ℹ [CJS] dist/Protocol.d.cts.map 1.57 kB │ gzip: 0.70 kB
38
38
  ℹ [CJS] dist/Types.d.cts.map 1.41 kB │ gzip: 0.65 kB
39
39
  ℹ [CJS] dist/MimicServerEngine.d.cts.map 1.09 kB │ gzip: 0.50 kB
@@ -46,12 +46,12 @@
46
46
  ℹ [CJS] dist/PresenceManager.d.cts.map 0.45 kB │ gzip: 0.27 kB
47
47
  ℹ [CJS] dist/testing/types.d.cts.map 0.38 kB │ gzip: 0.23 kB
48
48
  ℹ [CJS] dist/testing/ColdStorageTestSuite.d.cts.map 0.35 kB │ gzip: 0.25 kB
49
- ℹ [CJS] dist/testing/StorageIntegrationTestSuite.d.cts.map 0.31 kB │ gzip: 0.21 kB
49
+ ℹ [CJS] dist/testing/StorageIntegrationTestSuite.d.cts.map 0.32 kB │ gzip: 0.21 kB
50
50
  ℹ [CJS] dist/testing/FailingStorage.d.cts.map 0.26 kB │ gzip: 0.18 kB
51
51
  ℹ [CJS] dist/MimicClusterServerEngine.d.cts.map 0.25 kB │ gzip: 0.19 kB
52
52
  ℹ [CJS] dist/MimicServer.d.cts.map 0.22 kB │ gzip: 0.16 kB
53
53
  ℹ [CJS] dist/Metrics.d.cts.map 0.12 kB │ gzip: 0.12 kB
54
- ℹ [CJS] dist/index.d.cts 2.23 kB │ gzip: 0.56 kB
54
+ ℹ [CJS] dist/index.d.cts 2.17 kB │ gzip: 0.53 kB
55
55
  ℹ [CJS] dist/testing/index.d.cts 0.91 kB │ gzip: 0.25 kB
56
56
  ℹ [CJS] dist/Protocol.d.cts 5.86 kB │ gzip: 1.34 kB
57
57
  ℹ [CJS] dist/Types.d.cts 5.47 kB │ gzip: 1.54 kB
@@ -61,30 +61,30 @@
61
61
  ℹ [CJS] dist/DocumentManager.d.cts 2.74 kB │ gzip: 0.84 kB
62
62
  ℹ [CJS] dist/HotStorage.d.cts 2.72 kB │ gzip: 1.08 kB
63
63
  ℹ [CJS] dist/MimicAuthService.d.cts 2.70 kB │ gzip: 1.04 kB
64
- ℹ [CJS] dist/testing/HotStorageTestSuite.d.cts 1.82 kB │ gzip: 0.56 kB
64
+ ℹ [CJS] dist/testing/HotStorageTestSuite.d.cts 1.93 kB │ gzip: 0.57 kB
65
65
  ℹ [CJS] dist/ColdStorage.d.cts 1.74 kB │ gzip: 0.70 kB
66
66
  ℹ [CJS] dist/PresenceManager.d.cts 1.60 kB │ gzip: 0.63 kB
67
67
  ℹ [CJS] dist/Metrics.d.cts 1.59 kB │ gzip: 0.39 kB
68
68
  ℹ [CJS] dist/testing/ColdStorageTestSuite.d.cts 1.55 kB │ gzip: 0.50 kB
69
69
  ℹ [CJS] dist/testing/FailingStorage.d.cts 1.44 kB │ gzip: 0.46 kB
70
- ℹ [CJS] dist/testing/StorageIntegrationTestSuite.d.cts 1.31 kB │ gzip: 0.53 kB
70
+ ℹ [CJS] dist/testing/StorageIntegrationTestSuite.d.cts 1.43 kB │ gzip: 0.57 kB
71
71
  ℹ [CJS] dist/MimicClusterServerEngine.d.cts 0.82 kB │ gzip: 0.33 kB
72
- ℹ [CJS] dist/MimicServer.d.cts 0.74 kB │ gzip: 0.32 kB
73
- ℹ [CJS] 36 files, total: 56.45 kB
74
- ✔ Build complete in 5943ms
75
- ℹ [ESM] dist/index.mjs  1.34 kB │ gzip: 0.34 kB
72
+ ℹ [CJS] dist/MimicServer.d.cts 0.74 kB │ gzip: 0.31 kB
73
+ ℹ [CJS] 36 files, total: 56.62 kB
74
+ ✔ Build complete in 6416ms
75
+ ℹ [ESM] dist/index.mjs  1.38 kB │ gzip: 0.35 kB
76
76
  ℹ [ESM] dist/testing/index.mjs  0.60 kB │ gzip: 0.19 kB
77
- ℹ [ESM] dist/testing/HotStorageTestSuite.mjs.map 44.92 kB │ gzip: 6.52 kB
77
+ ℹ [ESM] dist/testing/HotStorageTestSuite.mjs.map 63.35 kB │ gzip: 8.67 kB
78
78
  ℹ [ESM] dist/MimicClusterServerEngine.mjs.map 42.30 kB │ gzip: 9.99 kB
79
+ ℹ [ESM] dist/testing/StorageIntegrationTestSuite.mjs.map 35.60 kB │ gzip: 6.44 kB
80
+ ℹ [ESM] dist/testing/HotStorageTestSuite.mjs 34.18 kB │ gzip: 5.10 kB
79
81
  ℹ [ESM] dist/testing/ColdStorageTestSuite.mjs.map 31.92 kB │ gzip: 5.21 kB
80
82
  ℹ [ESM] dist/DocumentManager.mjs.map 28.52 kB │ gzip: 6.84 kB
81
- ℹ [ESM] dist/testing/StorageIntegrationTestSuite.mjs.map 24.17 kB │ gzip: 4.50 kB
82
- ℹ [ESM] dist/testing/HotStorageTestSuite.mjs 23.90 kB │ gzip: 3.87 kB
83
83
  ℹ [ESM] dist/MimicServer.mjs.map 20.88 kB │ gzip: 5.46 kB
84
84
  ℹ [ESM] dist/MimicClusterServerEngine.mjs 20.10 kB │ gzip: 4.94 kB
85
+ ℹ [ESM] dist/testing/StorageIntegrationTestSuite.mjs 18.49 kB │ gzip: 3.63 kB
85
86
  ℹ [ESM] dist/testing/ColdStorageTestSuite.mjs 16.50 kB │ gzip: 3.21 kB
86
- ℹ [ESM] dist/testing/FailingStorage.mjs.map 12.93 kB │ gzip: 2.55 kB
87
- ℹ [ESM] dist/testing/StorageIntegrationTestSuite.mjs 12.56 kB │ gzip: 2.56 kB
87
+ ℹ [ESM] dist/testing/FailingStorage.mjs.map 15.60 kB │ gzip: 3.07 kB
88
88
  ℹ [ESM] dist/DocumentManager.mjs 11.59 kB │ gzip: 3.00 kB
89
89
  ℹ [ESM] dist/HotStorage.mjs.map 10.05 kB │ gzip: 2.85 kB
90
90
  ℹ [ESM] dist/MimicServerEngine.mjs.map 10.01 kB │ gzip: 2.73 kB
@@ -92,9 +92,9 @@
92
92
  ℹ [ESM] dist/Protocol.mjs.map  9.18 kB │ gzip: 2.15 kB
93
93
  ℹ [ESM] dist/PresenceManager.mjs.map  9.11 kB │ gzip: 2.27 kB
94
94
  ℹ [ESM] dist/testing/assertions.mjs.map  6.69 kB │ gzip: 1.78 kB
95
+ ℹ [ESM] dist/testing/FailingStorage.mjs  6.49 kB │ gzip: 1.52 kB
95
96
  ℹ [ESM] dist/Metrics.mjs.map  6.13 kB │ gzip: 1.43 kB
96
97
  ℹ [ESM] dist/MimicAuthService.mjs.map  6.09 kB │ gzip: 1.85 kB
97
- ℹ [ESM] dist/testing/FailingStorage.mjs  5.41 kB │ gzip: 1.30 kB
98
98
  ℹ [ESM] dist/ColdStorage.mjs.map  4.90 kB │ gzip: 1.52 kB
99
99
  ℹ [ESM] dist/MimicServerEngine.mjs  4.10 kB │ gzip: 1.35 kB
100
100
  ℹ [ESM] dist/Errors.mjs.map  4.00 kB │ gzip: 1.05 kB
@@ -125,13 +125,13 @@
125
125
  ℹ [ESM] dist/testing/types.mjs  0.35 kB │ gzip: 0.25 kB
126
126
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs  0.35 kB │ gzip: 0.23 kB
127
127
  ℹ [ESM] dist/testing/ColdStorageTestSuite.d.mts.map  0.35 kB │ gzip: 0.25 kB
128
- ℹ [ESM] dist/testing/StorageIntegrationTestSuite.d.mts.map  0.31 kB │ gzip: 0.21 kB
128
+ ℹ [ESM] dist/testing/StorageIntegrationTestSuite.d.mts.map  0.32 kB │ gzip: 0.21 kB
129
129
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs  0.30 kB │ gzip: 0.21 kB
130
130
  ℹ [ESM] dist/testing/FailingStorage.d.mts.map  0.26 kB │ gzip: 0.18 kB
131
131
  ℹ [ESM] dist/MimicClusterServerEngine.d.mts.map  0.25 kB │ gzip: 0.19 kB
132
132
  ℹ [ESM] dist/MimicServer.d.mts.map  0.22 kB │ gzip: 0.16 kB
133
133
  ℹ [ESM] dist/Metrics.d.mts.map  0.12 kB │ gzip: 0.12 kB
134
- ℹ [ESM] dist/index.d.mts  2.23 kB │ gzip: 0.56 kB
134
+ ℹ [ESM] dist/index.d.mts  2.17 kB │ gzip: 0.53 kB
135
135
  ℹ [ESM] dist/testing/index.d.mts  0.91 kB │ gzip: 0.25 kB
136
136
  ℹ [ESM] dist/Protocol.d.mts  5.86 kB │ gzip: 1.34 kB
137
137
  ℹ [ESM] dist/Types.d.mts  5.47 kB │ gzip: 1.54 kB
@@ -141,14 +141,14 @@
141
141
  ℹ [ESM] dist/DocumentManager.d.mts  2.74 kB │ gzip: 0.84 kB
142
142
  ℹ [ESM] dist/HotStorage.d.mts  2.72 kB │ gzip: 1.08 kB
143
143
  ℹ [ESM] dist/MimicAuthService.d.mts  2.70 kB │ gzip: 1.04 kB
144
- ℹ [ESM] dist/testing/HotStorageTestSuite.d.mts  1.82 kB │ gzip: 0.56 kB
144
+ ℹ [ESM] dist/testing/HotStorageTestSuite.d.mts  1.93 kB │ gzip: 0.57 kB
145
145
  ℹ [ESM] dist/ColdStorage.d.mts  1.74 kB │ gzip: 0.70 kB
146
146
  ℹ [ESM] dist/PresenceManager.d.mts  1.60 kB │ gzip: 0.63 kB
147
147
  ℹ [ESM] dist/Metrics.d.mts  1.59 kB │ gzip: 0.39 kB
148
148
  ℹ [ESM] dist/testing/ColdStorageTestSuite.d.mts  1.55 kB │ gzip: 0.50 kB
149
149
  ℹ [ESM] dist/testing/FailingStorage.d.mts  1.44 kB │ gzip: 0.46 kB
150
- ℹ [ESM] dist/testing/StorageIntegrationTestSuite.d.mts  1.31 kB │ gzip: 0.53 kB
150
+ ℹ [ESM] dist/testing/StorageIntegrationTestSuite.d.mts  1.43 kB │ gzip: 0.57 kB
151
151
  ℹ [ESM] dist/MimicClusterServerEngine.d.mts  0.82 kB │ gzip: 0.33 kB
152
152
  ℹ [ESM] dist/MimicServer.d.mts  0.74 kB │ gzip: 0.31 kB
153
- ℹ [ESM] 78 files, total: 463.31 kB
154
- ✔ Build complete in 5961ms
153
+ ℹ [ESM] 78 files, total: 513.37 kB
154
+ ✔ Build complete in 6441ms
@@ -8,7 +8,7 @@ import { HttpLayerRouter } from "@effect/platform";
8
8
  //#region src/MimicServer.d.ts
9
9
 
10
10
  declare const MimicServer: {
11
- layerHttpLayerRouter: (options?: MimicServerRouteConfig) => Layer.Layer<never, never, HttpLayerRouter.HttpRouter | MimicServerEngineTag | MimicAuthServiceTag | HttpLayerRouter.Request<"Error", _effect_platform_HttpServerError0.RequestError>>;
11
+ layerHttpLayerRouter: (options?: MimicServerRouteConfig) => Layer.Layer<never, never, MimicServerEngineTag | MimicAuthServiceTag | HttpLayerRouter.HttpRouter | HttpLayerRouter.Request<"Error", _effect_platform_HttpServerError0.RequestError>>;
12
12
  };
13
13
  //#endregion
14
14
  export { MimicServer };
@@ -1 +1 @@
1
- {"version":3,"file":"MimicServer.d.cts","names":[],"sources":["../src/MimicServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAmea;mCA7DD,2BAAsB,KAAA,CAAA,oBAAA,eAAA,CAAA,aAAA,uBAAA,sBAAA,eAAA,CAAA,iBAAA,iCAAA,CAAA,YAAA"}
1
+ {"version":3,"file":"MimicServer.d.cts","names":[],"sources":["../src/MimicServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAmea;mCA7DD,2BAAsB,KAAA,CAAA,oBAAA,uBAAA,sBAAA,eAAA,CAAA,aAAA,eAAA,CAAA,iBAAA,iCAAA,CAAA,YAAA"}
@@ -8,7 +8,7 @@ import * as _effect_platform_HttpServerError0 from "@effect/platform/HttpServerE
8
8
  //#region src/MimicServer.d.ts
9
9
 
10
10
  declare const MimicServer: {
11
- layerHttpLayerRouter: (options?: MimicServerRouteConfig) => Layer.Layer<never, never, HttpLayerRouter.HttpRouter | MimicServerEngineTag | MimicAuthServiceTag | HttpLayerRouter.Request<"Error", _effect_platform_HttpServerError0.RequestError>>;
11
+ layerHttpLayerRouter: (options?: MimicServerRouteConfig) => Layer.Layer<never, never, MimicServerEngineTag | MimicAuthServiceTag | HttpLayerRouter.HttpRouter | HttpLayerRouter.Request<"Error", _effect_platform_HttpServerError0.RequestError>>;
12
12
  };
13
13
  //#endregion
14
14
  export { MimicServer };
@@ -1 +1 @@
1
- {"version":3,"file":"MimicServer.d.mts","names":[],"sources":["../src/MimicServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAmea;mCA7DD,2BAAsB,KAAA,CAAA,oBAAA,eAAA,CAAA,aAAA,uBAAA,sBAAA,eAAA,CAAA,iBAAA,iCAAA,CAAA,YAAA"}
1
+ {"version":3,"file":"MimicServer.d.mts","names":[],"sources":["../src/MimicServer.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAmea;mCA7DD,2BAAsB,KAAA,CAAA,oBAAA,uBAAA,sBAAA,eAAA,CAAA,aAAA,eAAA,CAAA,iBAAA,iCAAA,CAAA,YAAA"}
package/dist/index.cjs CHANGED
@@ -38,4 +38,5 @@ Object.defineProperty(exports, 'Protocol', {
38
38
  return require_Protocol.Protocol_exports;
39
39
  }
40
40
  });
41
- exports.TransactionRejectedError = require_Errors.TransactionRejectedError;
41
+ exports.TransactionRejectedError = require_Errors.TransactionRejectedError;
42
+ exports.WalVersionGapError = require_Errors.WalVersionGapError;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AuthContext, DurationInput, Initial, InitialContext, InitialFn, MimicClusterServerEngineConfig, MimicServerEngineConfig, MimicServerRouteConfig, Permission, PresenceEntry, PresenceEvent, PresenceRemoveEvent, PresenceSnapshot, PresenceUpdateEvent, ResolvedClusterConfig, ResolvedConfig, ResolvedRouteConfig, SnapshotConfig, StoredDocument, WalEntry } from "./Types.cjs";
2
- import { AuthenticationError, AuthorizationError, ColdStorageError, HotStorageError, MessageParseError, MimicError, MissingDocumentIdError, TransactionRejectedError } from "./Errors.cjs";
2
+ import { AuthenticationError, AuthorizationError, ColdStorageError, HotStorageError, MessageParseError, MimicError, MissingDocumentIdError, TransactionRejectedError, WalVersionGapError } from "./Errors.cjs";
3
3
  import { Protocol_d_exports } from "./Protocol.cjs";
4
4
  import { ColdStorage, ColdStorageTag } from "./ColdStorage.cjs";
5
5
  import { HotStorage, HotStorageTag } from "./HotStorage.cjs";
@@ -10,4 +10,4 @@ import { MimicClusterServerEngine } from "./MimicClusterServerEngine.cjs";
10
10
  import { MimicServer } from "./MimicServer.cjs";
11
11
  import { MimicMetrics } from "./Metrics.cjs";
12
12
  import { PresenceManager, PresenceManagerTag } from "./PresenceManager.cjs";
13
- export { type AuthContext, AuthenticationError, AuthorizationError, ColdStorage, ColdStorageError, ColdStorageTag, DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, type DurationInput, HotStorage, HotStorageError, HotStorageTag, type Initial, type InitialContext, type InitialFn, MessageParseError, MimicAuthService, MimicAuthServiceTag, MimicClusterServerEngine, type MimicClusterServerEngineConfig, type MimicError, MimicMetrics, MimicServer, MimicServerEngine, type MimicServerEngineConfig, MimicServerEngineTag, type MimicServerRouteConfig, MissingDocumentIdError, type Permission, type PresenceEntry, type PresenceEvent, PresenceManager, PresenceManagerTag, type PresenceRemoveEvent, type PresenceSnapshot, type PresenceUpdateEvent, Protocol_d_exports as Protocol, type ResolvedClusterConfig, type ResolvedConfig, type ResolvedRouteConfig, type SnapshotConfig, type StoredDocument, type SubmitResult, TransactionRejectedError, type WalEntry };
13
+ export { AuthContext, AuthenticationError, AuthorizationError, ColdStorage, ColdStorageError, ColdStorageTag, DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, DurationInput, HotStorage, HotStorageError, HotStorageTag, Initial, InitialContext, InitialFn, MessageParseError, MimicAuthService, MimicAuthServiceTag, MimicClusterServerEngine, MimicClusterServerEngineConfig, MimicError, MimicMetrics, MimicServer, MimicServerEngine, MimicServerEngineConfig, MimicServerEngineTag, type MimicServerRouteConfig, MissingDocumentIdError, Permission, PresenceEntry, PresenceEvent, PresenceManager, PresenceManagerTag, PresenceRemoveEvent, PresenceSnapshot, PresenceUpdateEvent, Protocol_d_exports as Protocol, ResolvedClusterConfig, ResolvedConfig, ResolvedRouteConfig, SnapshotConfig, StoredDocument, type SubmitResult, TransactionRejectedError, WalEntry, WalVersionGapError };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AuthContext, DurationInput, Initial, InitialContext, InitialFn, MimicClusterServerEngineConfig, MimicServerEngineConfig, MimicServerRouteConfig, Permission, PresenceEntry, PresenceEvent, PresenceRemoveEvent, PresenceSnapshot, PresenceUpdateEvent, ResolvedClusterConfig, ResolvedConfig, ResolvedRouteConfig, SnapshotConfig, StoredDocument, WalEntry } from "./Types.mjs";
2
- import { AuthenticationError, AuthorizationError, ColdStorageError, HotStorageError, MessageParseError, MimicError, MissingDocumentIdError, TransactionRejectedError } from "./Errors.mjs";
2
+ import { AuthenticationError, AuthorizationError, ColdStorageError, HotStorageError, MessageParseError, MimicError, MissingDocumentIdError, TransactionRejectedError, WalVersionGapError } from "./Errors.mjs";
3
3
  import { Protocol_d_exports } from "./Protocol.mjs";
4
4
  import { ColdStorage, ColdStorageTag } from "./ColdStorage.mjs";
5
5
  import { HotStorage, HotStorageTag } from "./HotStorage.mjs";
@@ -10,4 +10,4 @@ import { MimicClusterServerEngine } from "./MimicClusterServerEngine.mjs";
10
10
  import { MimicServer } from "./MimicServer.mjs";
11
11
  import { MimicMetrics } from "./Metrics.mjs";
12
12
  import { PresenceManager, PresenceManagerTag } from "./PresenceManager.mjs";
13
- export { type AuthContext, AuthenticationError, AuthorizationError, ColdStorage, ColdStorageError, ColdStorageTag, DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, type DurationInput, HotStorage, HotStorageError, HotStorageTag, type Initial, type InitialContext, type InitialFn, MessageParseError, MimicAuthService, MimicAuthServiceTag, MimicClusterServerEngine, type MimicClusterServerEngineConfig, type MimicError, MimicMetrics, MimicServer, MimicServerEngine, type MimicServerEngineConfig, MimicServerEngineTag, type MimicServerRouteConfig, MissingDocumentIdError, type Permission, type PresenceEntry, type PresenceEvent, PresenceManager, PresenceManagerTag, type PresenceRemoveEvent, type PresenceSnapshot, type PresenceUpdateEvent, Protocol_d_exports as Protocol, type ResolvedClusterConfig, type ResolvedConfig, type ResolvedRouteConfig, type SnapshotConfig, type StoredDocument, type SubmitResult, TransactionRejectedError, type WalEntry };
13
+ export { AuthContext, AuthenticationError, AuthorizationError, ColdStorage, ColdStorageError, ColdStorageTag, DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, DurationInput, HotStorage, HotStorageError, HotStorageTag, Initial, InitialContext, InitialFn, MessageParseError, MimicAuthService, MimicAuthServiceTag, MimicClusterServerEngine, MimicClusterServerEngineConfig, MimicError, MimicMetrics, MimicServer, MimicServerEngine, MimicServerEngineConfig, MimicServerEngineTag, type MimicServerRouteConfig, MissingDocumentIdError, Permission, PresenceEntry, PresenceEvent, PresenceManager, PresenceManagerTag, PresenceRemoveEvent, PresenceSnapshot, PresenceUpdateEvent, Protocol_d_exports as Protocol, ResolvedClusterConfig, ResolvedConfig, ResolvedRouteConfig, SnapshotConfig, StoredDocument, type SubmitResult, TransactionRejectedError, WalEntry, WalVersionGapError };
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ColdStorage, ColdStorageTag } from "./ColdStorage.mjs";
2
- import { AuthenticationError, AuthorizationError, ColdStorageError, HotStorageError, MessageParseError, MissingDocumentIdError, TransactionRejectedError } from "./Errors.mjs";
2
+ import { AuthenticationError, AuthorizationError, ColdStorageError, HotStorageError, MessageParseError, MissingDocumentIdError, TransactionRejectedError, WalVersionGapError } from "./Errors.mjs";
3
3
  import { HotStorage, HotStorageTag } from "./HotStorage.mjs";
4
4
  import { MimicMetrics } from "./Metrics.mjs";
5
5
  import { DocumentManager, DocumentManagerConfigTag, DocumentManagerTag } from "./DocumentManager.mjs";
@@ -10,4 +10,4 @@ import { Protocol_exports } from "./Protocol.mjs";
10
10
  import { MimicAuthService, MimicAuthServiceTag } from "./MimicAuthService.mjs";
11
11
  import { MimicServer } from "./MimicServer.mjs";
12
12
 
13
- export { AuthenticationError, AuthorizationError, ColdStorage, ColdStorageError, ColdStorageTag, DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, HotStorage, HotStorageError, HotStorageTag, MessageParseError, MimicAuthService, MimicAuthServiceTag, MimicClusterServerEngine, MimicMetrics, MimicServer, MimicServerEngine, MimicServerEngineTag, MissingDocumentIdError, PresenceManager, PresenceManagerTag, Protocol_exports as Protocol, TransactionRejectedError };
13
+ export { AuthenticationError, AuthorizationError, ColdStorage, ColdStorageError, ColdStorageTag, DocumentManager, DocumentManagerConfigTag, DocumentManagerTag, HotStorage, HotStorageError, HotStorageTag, MessageParseError, MimicAuthService, MimicAuthServiceTag, MimicClusterServerEngine, MimicMetrics, MimicServer, MimicServerEngine, MimicServerEngineTag, MissingDocumentIdError, PresenceManager, PresenceManagerTag, Protocol_exports as Protocol, TransactionRejectedError, WalVersionGapError };
@@ -101,6 +101,33 @@ const makeHotStorage = (config = {}) => effect.Layer.effect(require_HotStorage.H
101
101
  return effect.HashMap.set(map, documentId, [...entries, entry]);
102
102
  });
103
103
  }),
104
+ appendWithCheck: (documentId, entry, expectedVersion) => effect.Effect.gen(function* () {
105
+ if (yield* shouldFail("append")) return yield* effect.Effect.fail(new require_Errors.HotStorageError({
106
+ documentId,
107
+ operation: "appendWithCheck",
108
+ cause: new Error(errorMessage)
109
+ }));
110
+ const result = yield* effect.Ref.modify(store, (map) => {
111
+ const existing = effect.HashMap.get(map, documentId);
112
+ const entries = existing._tag === "Some" ? existing.value : [];
113
+ const lastVersion = entries.length > 0 ? Math.max(...entries.map((e) => e.version)) : 0;
114
+ if (expectedVersion === 1) {
115
+ if (lastVersion >= 1) return [{
116
+ type: "gap",
117
+ lastVersion
118
+ }, map];
119
+ } else if (lastVersion !== expectedVersion - 1) return [{
120
+ type: "gap",
121
+ lastVersion: lastVersion > 0 ? lastVersion : void 0
122
+ }, map];
123
+ return [{ type: "ok" }, effect.HashMap.set(map, documentId, [...entries, entry])];
124
+ });
125
+ if (result.type === "gap") return yield* effect.Effect.fail(new require_Errors.WalVersionGapError({
126
+ documentId,
127
+ expectedVersion,
128
+ actualPreviousVersion: result.lastVersion
129
+ }));
130
+ }),
104
131
  getEntries: (documentId, sinceVersion) => effect.Effect.gen(function* () {
105
132
  if (yield* shouldFail("getEntries")) return yield* effect.Effect.fail(new require_Errors.HotStorageError({
106
133
  documentId,
@@ -1 +1 @@
1
- {"version":3,"file":"FailingStorage.d.cts","names":[],"sources":["../../src/testing/FailingStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA8BiB,wBAAA;;;;;;;;;;;;;;;UAgBA,uBAAA;;;;;;;;;;;;cA4OJ;6BAtNH,6BACP,KAAA,CAAM,MAAM;4BAqGL,4BACP,KAAA,CAAM,MAAM"}
1
+ {"version":3,"file":"FailingStorage.d.cts","names":[],"sources":["../../src/testing/FailingStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA8BiB,wBAAA;;;;;;;;;;;;;;;UAgBA,uBAAA;;;;;;;;;;;;cAgSJ;6BA1QH,6BACP,KAAA,CAAM,MAAM;4BAqGL,4BACP,KAAA,CAAM,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"FailingStorage.d.mts","names":[],"sources":["../../src/testing/FailingStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA8BiB,wBAAA;;;;;;;;;;;;;;;UAgBA,uBAAA;;;;;;;;;;;;cA4OJ;6BAtNH,6BACP,KAAA,CAAM,MAAM;4BAqGL,4BACP,KAAA,CAAM,MAAM"}
1
+ {"version":3,"file":"FailingStorage.d.mts","names":[],"sources":["../../src/testing/FailingStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA8BiB,wBAAA;;;;;;;;;;;;;;;UAgBA,uBAAA;;;;;;;;;;;;cAgSJ;6BA1QH,6BACP,KAAA,CAAM,MAAM;4BAqGL,4BACP,KAAA,CAAM,MAAM"}
@@ -1,5 +1,5 @@
1
1
  import { ColdStorageTag } from "../ColdStorage.mjs";
2
- import { ColdStorageError, HotStorageError } from "../Errors.mjs";
2
+ import { ColdStorageError, HotStorageError, WalVersionGapError } from "../Errors.mjs";
3
3
  import { HotStorageTag } from "../HotStorage.mjs";
4
4
  import { Effect, HashMap, Layer, Ref } from "effect";
5
5
 
@@ -101,6 +101,33 @@ const makeHotStorage = (config = {}) => Layer.effect(HotStorageTag, Effect.gen(f
101
101
  return HashMap.set(map, documentId, [...entries, entry]);
102
102
  });
103
103
  }),
104
+ appendWithCheck: (documentId, entry, expectedVersion) => Effect.gen(function* () {
105
+ if (yield* shouldFail("append")) return yield* Effect.fail(new HotStorageError({
106
+ documentId,
107
+ operation: "appendWithCheck",
108
+ cause: new Error(errorMessage)
109
+ }));
110
+ const result = yield* Ref.modify(store, (map) => {
111
+ const existing = HashMap.get(map, documentId);
112
+ const entries = existing._tag === "Some" ? existing.value : [];
113
+ const lastVersion = entries.length > 0 ? Math.max(...entries.map((e) => e.version)) : 0;
114
+ if (expectedVersion === 1) {
115
+ if (lastVersion >= 1) return [{
116
+ type: "gap",
117
+ lastVersion
118
+ }, map];
119
+ } else if (lastVersion !== expectedVersion - 1) return [{
120
+ type: "gap",
121
+ lastVersion: lastVersion > 0 ? lastVersion : void 0
122
+ }, map];
123
+ return [{ type: "ok" }, HashMap.set(map, documentId, [...entries, entry])];
124
+ });
125
+ if (result.type === "gap") return yield* Effect.fail(new WalVersionGapError({
126
+ documentId,
127
+ expectedVersion,
128
+ actualPreviousVersion: result.lastVersion
129
+ }));
130
+ }),
104
131
  getEntries: (documentId, sinceVersion) => Effect.gen(function* () {
105
132
  if (yield* shouldFail("getEntries")) return yield* Effect.fail(new HotStorageError({
106
133
  documentId,
@@ -1 +1 @@
1
- {"version":3,"file":"FailingStorage.mjs","names":[],"sources":["../../src/testing/FailingStorage.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - FailingStorage\n *\n * Mock storage implementations that simulate failures for testing error handling.\n * Use these to verify that your application correctly handles storage unavailability.\n *\n * @example\n * ```typescript\n * import { FailingStorage } from \"@voidhash/mimic-effect/testing\";\n *\n * // Create a ColdStorage that fails on load\n * const failingCold = FailingStorage.makeColdStorage({ failLoad: true });\n *\n * // Create a HotStorage that fails after 3 successful appends\n * const failingHot = FailingStorage.makeHotStorage({ failAfterN: 3, failAppend: true });\n * ```\n */\nimport { Effect, Layer, Ref, HashMap } from \"effect\";\nimport { ColdStorageTag, type ColdStorage } from \"../ColdStorage\";\nimport { HotStorageTag, type HotStorage } from \"../HotStorage\";\nimport { ColdStorageError, HotStorageError } from \"../Errors\";\nimport type { StoredDocument, WalEntry } from \"../Types\";\n\n// =============================================================================\n// Configuration Types\n// =============================================================================\n\n/**\n * Configuration for failing ColdStorage\n */\nexport interface FailingColdStorageConfig {\n /** Fail load operations */\n readonly failLoad?: boolean;\n /** Fail save operations */\n readonly failSave?: boolean;\n /** Fail delete operations */\n readonly failDelete?: boolean;\n /** Fail after N successful operations (total across all operation types) */\n readonly failAfterN?: number;\n /** Custom error message */\n readonly errorMessage?: string;\n}\n\n/**\n * Configuration for failing HotStorage\n */\nexport interface FailingHotStorageConfig {\n /** Fail append operations */\n readonly failAppend?: boolean;\n /** Fail getEntries operations */\n readonly failGetEntries?: boolean;\n /** Fail truncate operations */\n readonly failTruncate?: boolean;\n /** Fail after N successful operations (total across all operation types) */\n readonly failAfterN?: number;\n /** Custom error message */\n readonly errorMessage?: string;\n}\n\n// =============================================================================\n// Failing ColdStorage\n// =============================================================================\n\n/**\n * Create a ColdStorage layer that simulates failures.\n * Wraps an in-memory storage and fails according to configuration.\n */\nexport const makeColdStorage = (\n config: FailingColdStorageConfig = {}\n): Layer.Layer<ColdStorageTag> =>\n Layer.effect(\n ColdStorageTag,\n Effect.gen(function* () {\n const store = yield* Ref.make(HashMap.empty<string, StoredDocument>());\n const operationCount = yield* Ref.make(0);\n\n const errorMessage = config.errorMessage ?? \"Simulated storage failure\";\n\n const shouldFail = (operation: \"load\" | \"save\" | \"delete\") =>\n Effect.gen(function* () {\n // Check if this specific operation should fail\n const opFails =\n (operation === \"load\" && config.failLoad) ||\n (operation === \"save\" && config.failSave) ||\n (operation === \"delete\" && config.failDelete);\n\n // If failAfterN is set, count operations first\n if (config.failAfterN !== undefined) {\n const count = yield* Ref.get(operationCount);\n yield* Ref.update(operationCount, (n) => n + 1);\n\n // Only start failing after N successful operations\n if (count < config.failAfterN) {\n return false;\n }\n // After N operations, fail if the specific op flag is set\n return opFails;\n }\n\n // No failAfterN - fail immediately if op flag is set\n return opFails;\n });\n\n const storage: ColdStorage = {\n load: (documentId) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"load\");\n if (fail) {\n return yield* Effect.fail(\n new ColdStorageError({\n documentId,\n operation: \"load\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n const current = yield* Ref.get(store);\n const doc = HashMap.get(current, documentId);\n return doc._tag === \"Some\" ? doc.value : undefined;\n }),\n\n save: (documentId, document) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"save\");\n if (fail) {\n return yield* Effect.fail(\n new ColdStorageError({\n documentId,\n operation: \"save\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) =>\n HashMap.set(map, documentId, document)\n );\n }),\n\n delete: (documentId) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"delete\");\n if (fail) {\n return yield* Effect.fail(\n new ColdStorageError({\n documentId,\n operation: \"delete\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) => HashMap.remove(map, documentId));\n }),\n };\n\n return storage;\n })\n );\n\n// =============================================================================\n// Failing HotStorage\n// =============================================================================\n\n/**\n * Create a HotStorage layer that simulates failures.\n * Wraps an in-memory storage and fails according to configuration.\n */\nexport const makeHotStorage = (\n config: FailingHotStorageConfig = {}\n): Layer.Layer<HotStorageTag> =>\n Layer.effect(\n HotStorageTag,\n Effect.gen(function* () {\n const store = yield* Ref.make(HashMap.empty<string, WalEntry[]>());\n const operationCount = yield* Ref.make(0);\n\n const errorMessage = config.errorMessage ?? \"Simulated storage failure\";\n\n const shouldFail = (operation: \"append\" | \"getEntries\" | \"truncate\") =>\n Effect.gen(function* () {\n // Check if this specific operation should fail\n const opFails =\n (operation === \"append\" && config.failAppend) ||\n (operation === \"getEntries\" && config.failGetEntries) ||\n (operation === \"truncate\" && config.failTruncate);\n\n // If failAfterN is set, count operations first\n if (config.failAfterN !== undefined) {\n const count = yield* Ref.get(operationCount);\n yield* Ref.update(operationCount, (n) => n + 1);\n\n // Only start failing after N successful operations\n if (count < config.failAfterN) {\n return false;\n }\n // After N operations, fail if the specific op flag is set\n return opFails;\n }\n\n // No failAfterN - fail immediately if op flag is set\n return opFails;\n });\n\n const storage: HotStorage = {\n append: (documentId, entry) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"append\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"append\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) => {\n const current = HashMap.get(map, documentId);\n const entries = current._tag === \"Some\" ? current.value : [];\n return HashMap.set(map, documentId, [...entries, entry]);\n });\n }),\n\n getEntries: (documentId, sinceVersion) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"getEntries\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"getEntries\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n const current = yield* Ref.get(store);\n const existing = HashMap.get(current, documentId);\n const entries = existing._tag === \"Some\" ? existing.value : [];\n\n return entries\n .filter((e) => e.version > sinceVersion)\n .sort((a, b) => a.version - b.version);\n }),\n\n truncate: (documentId, upToVersion) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"truncate\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"truncate\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) => {\n const existing = HashMap.get(map, documentId);\n if (existing._tag === \"None\") {\n return map;\n }\n const filtered = existing.value.filter(\n (e) => e.version > upToVersion\n );\n return HashMap.set(map, documentId, filtered);\n });\n }),\n };\n\n return storage;\n })\n );\n\n// =============================================================================\n// Export Namespace\n// =============================================================================\n\nexport const FailingStorage = {\n makeColdStorage,\n makeHotStorage,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"FailingStorage.mjs","names":["result: CheckResult"],"sources":["../../src/testing/FailingStorage.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - FailingStorage\n *\n * Mock storage implementations that simulate failures for testing error handling.\n * Use these to verify that your application correctly handles storage unavailability.\n *\n * @example\n * ```typescript\n * import { FailingStorage } from \"@voidhash/mimic-effect/testing\";\n *\n * // Create a ColdStorage that fails on load\n * const failingCold = FailingStorage.makeColdStorage({ failLoad: true });\n *\n * // Create a HotStorage that fails after 3 successful appends\n * const failingHot = FailingStorage.makeHotStorage({ failAfterN: 3, failAppend: true });\n * ```\n */\nimport { Effect, Layer, Ref, HashMap } from \"effect\";\nimport { ColdStorageTag, type ColdStorage } from \"../ColdStorage\";\nimport { HotStorageTag, type HotStorage } from \"../HotStorage\";\nimport { ColdStorageError, HotStorageError, WalVersionGapError } from \"../Errors\";\nimport type { StoredDocument, WalEntry } from \"../Types\";\n\n// =============================================================================\n// Configuration Types\n// =============================================================================\n\n/**\n * Configuration for failing ColdStorage\n */\nexport interface FailingColdStorageConfig {\n /** Fail load operations */\n readonly failLoad?: boolean;\n /** Fail save operations */\n readonly failSave?: boolean;\n /** Fail delete operations */\n readonly failDelete?: boolean;\n /** Fail after N successful operations (total across all operation types) */\n readonly failAfterN?: number;\n /** Custom error message */\n readonly errorMessage?: string;\n}\n\n/**\n * Configuration for failing HotStorage\n */\nexport interface FailingHotStorageConfig {\n /** Fail append operations */\n readonly failAppend?: boolean;\n /** Fail getEntries operations */\n readonly failGetEntries?: boolean;\n /** Fail truncate operations */\n readonly failTruncate?: boolean;\n /** Fail after N successful operations (total across all operation types) */\n readonly failAfterN?: number;\n /** Custom error message */\n readonly errorMessage?: string;\n}\n\n// =============================================================================\n// Failing ColdStorage\n// =============================================================================\n\n/**\n * Create a ColdStorage layer that simulates failures.\n * Wraps an in-memory storage and fails according to configuration.\n */\nexport const makeColdStorage = (\n config: FailingColdStorageConfig = {}\n): Layer.Layer<ColdStorageTag> =>\n Layer.effect(\n ColdStorageTag,\n Effect.gen(function* () {\n const store = yield* Ref.make(HashMap.empty<string, StoredDocument>());\n const operationCount = yield* Ref.make(0);\n\n const errorMessage = config.errorMessage ?? \"Simulated storage failure\";\n\n const shouldFail = (operation: \"load\" | \"save\" | \"delete\") =>\n Effect.gen(function* () {\n // Check if this specific operation should fail\n const opFails =\n (operation === \"load\" && config.failLoad) ||\n (operation === \"save\" && config.failSave) ||\n (operation === \"delete\" && config.failDelete);\n\n // If failAfterN is set, count operations first\n if (config.failAfterN !== undefined) {\n const count = yield* Ref.get(operationCount);\n yield* Ref.update(operationCount, (n) => n + 1);\n\n // Only start failing after N successful operations\n if (count < config.failAfterN) {\n return false;\n }\n // After N operations, fail if the specific op flag is set\n return opFails;\n }\n\n // No failAfterN - fail immediately if op flag is set\n return opFails;\n });\n\n const storage: ColdStorage = {\n load: (documentId) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"load\");\n if (fail) {\n return yield* Effect.fail(\n new ColdStorageError({\n documentId,\n operation: \"load\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n const current = yield* Ref.get(store);\n const doc = HashMap.get(current, documentId);\n return doc._tag === \"Some\" ? doc.value : undefined;\n }),\n\n save: (documentId, document) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"save\");\n if (fail) {\n return yield* Effect.fail(\n new ColdStorageError({\n documentId,\n operation: \"save\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) =>\n HashMap.set(map, documentId, document)\n );\n }),\n\n delete: (documentId) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"delete\");\n if (fail) {\n return yield* Effect.fail(\n new ColdStorageError({\n documentId,\n operation: \"delete\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) => HashMap.remove(map, documentId));\n }),\n };\n\n return storage;\n })\n );\n\n// =============================================================================\n// Failing HotStorage\n// =============================================================================\n\n/**\n * Create a HotStorage layer that simulates failures.\n * Wraps an in-memory storage and fails according to configuration.\n */\nexport const makeHotStorage = (\n config: FailingHotStorageConfig = {}\n): Layer.Layer<HotStorageTag> =>\n Layer.effect(\n HotStorageTag,\n Effect.gen(function* () {\n const store = yield* Ref.make(HashMap.empty<string, WalEntry[]>());\n const operationCount = yield* Ref.make(0);\n\n const errorMessage = config.errorMessage ?? \"Simulated storage failure\";\n\n const shouldFail = (operation: \"append\" | \"getEntries\" | \"truncate\") =>\n Effect.gen(function* () {\n // Check if this specific operation should fail\n const opFails =\n (operation === \"append\" && config.failAppend) ||\n (operation === \"getEntries\" && config.failGetEntries) ||\n (operation === \"truncate\" && config.failTruncate);\n\n // If failAfterN is set, count operations first\n if (config.failAfterN !== undefined) {\n const count = yield* Ref.get(operationCount);\n yield* Ref.update(operationCount, (n) => n + 1);\n\n // Only start failing after N successful operations\n if (count < config.failAfterN) {\n return false;\n }\n // After N operations, fail if the specific op flag is set\n return opFails;\n }\n\n // No failAfterN - fail immediately if op flag is set\n return opFails;\n });\n\n const storage: HotStorage = {\n append: (documentId, entry) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"append\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"append\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) => {\n const current = HashMap.get(map, documentId);\n const entries = current._tag === \"Some\" ? current.value : [];\n return HashMap.set(map, documentId, [...entries, entry]);\n });\n }),\n\n appendWithCheck: (documentId, entry, expectedVersion) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"append\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"appendWithCheck\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n type CheckResult =\n | { type: \"ok\" }\n | { type: \"gap\"; lastVersion: number | undefined };\n\n const result: CheckResult = yield* Ref.modify(store, (map): [CheckResult, HashMap.HashMap<string, WalEntry[]>] => {\n const existing = HashMap.get(map, documentId);\n const entries = existing._tag === \"Some\" ? existing.value : [];\n\n const lastVersion = entries.length > 0\n ? Math.max(...entries.map((e) => e.version))\n : 0;\n\n if (expectedVersion === 1) {\n if (lastVersion >= 1) {\n return [{ type: \"gap\", lastVersion }, map];\n }\n } else {\n if (lastVersion !== expectedVersion - 1) {\n return [{ type: \"gap\", lastVersion: lastVersion > 0 ? lastVersion : undefined }, map];\n }\n }\n\n return [\n { type: \"ok\" },\n HashMap.set(map, documentId, [...entries, entry]),\n ];\n });\n\n if (result.type === \"gap\") {\n return yield* Effect.fail(\n new WalVersionGapError({\n documentId,\n expectedVersion,\n actualPreviousVersion: result.lastVersion,\n })\n );\n }\n }),\n\n getEntries: (documentId, sinceVersion) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"getEntries\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"getEntries\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n const current = yield* Ref.get(store);\n const existing = HashMap.get(current, documentId);\n const entries = existing._tag === \"Some\" ? existing.value : [];\n\n return entries\n .filter((e) => e.version > sinceVersion)\n .sort((a, b) => a.version - b.version);\n }),\n\n truncate: (documentId, upToVersion) =>\n Effect.gen(function* () {\n const fail = yield* shouldFail(\"truncate\");\n if (fail) {\n return yield* Effect.fail(\n new HotStorageError({\n documentId,\n operation: \"truncate\",\n cause: new Error(errorMessage),\n })\n );\n }\n\n yield* Ref.update(store, (map) => {\n const existing = HashMap.get(map, documentId);\n if (existing._tag === \"None\") {\n return map;\n }\n const filtered = existing.value.filter(\n (e) => e.version > upToVersion\n );\n return HashMap.set(map, documentId, filtered);\n });\n }),\n };\n\n return storage;\n })\n );\n\n// =============================================================================\n// Export Namespace\n// =============================================================================\n\nexport const FailingStorage = {\n makeColdStorage,\n makeHotStorage,\n};\n"],"mappings":"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"}