@voidhash/mimic 1.0.0-beta.11 → 1.0.0-beta.12
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 +13 -13
- package/dist/server/ServerDocument.cjs +3 -0
- package/dist/server/ServerDocument.d.cts +9 -1
- package/dist/server/ServerDocument.d.cts.map +1 -1
- package/dist/server/ServerDocument.d.mts +9 -1
- package/dist/server/ServerDocument.d.mts.map +1 -1
- package/dist/server/ServerDocument.mjs +3 -0
- package/dist/server/ServerDocument.mjs.map +1 -1
- package/package.json +2 -2
- package/src/server/ServerDocument.ts +13 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @voidhash/mimic@1.0.0-beta.
|
|
2
|
+
> @voidhash/mimic@1.0.0-beta.12 build /home/runner/work/mimic/mimic/packages/mimic
|
|
3
3
|
> tsdown
|
|
4
4
|
|
|
5
5
|
[34mℹ[39m tsdown [2mv0.18.2[22m powered by rolldown [2mv1.0.0-beta.55[22m
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mOperationPath.cjs [2m 4.24 kB[22m [2m│ gzip: 1.19 kB[22m
|
|
30
30
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/Boolean.cjs [2m 4.02 kB[22m [2m│ gzip: 1.06 kB[22m
|
|
31
31
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/Literal.cjs [2m 3.89 kB[22m [2m│ gzip: 1.06 kB[22m
|
|
32
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mserver/ServerDocument.cjs [2m 3.74 kB[22m [2m│ gzip: 1.16 kB[22m
|
|
32
33
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mclient/StateMonitor.cjs [2m 3.71 kB[22m [2m│ gzip: 1.27 kB[22m
|
|
33
34
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/shared.cjs [2m 3.69 kB[22m [2m│ gzip: 1.25 kB[22m
|
|
34
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mserver/ServerDocument.cjs [2m 3.68 kB[22m [2m│ gzip: 1.15 kB[22m
|
|
35
35
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mserver/errors.cjs [2m 3.29 kB[22m [2m│ gzip: 0.70 kB[22m
|
|
36
36
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/TreeNode.cjs [2m 2.67 kB[22m [2m│ gzip: 0.92 kB[22m
|
|
37
37
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mPresence.cjs [2m 2.36 kB[22m [2m│ gzip: 0.87 kB[22m
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutPropertiesLoose.cjs [2m 0.37 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
53
53
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mclient/Transport.cjs [2m 0.21 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
54
54
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mTransform.cjs [2m 0.20 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
55
|
-
[34mℹ[39m [33m[CJS][39m 44 files, total: 214.
|
|
55
|
+
[34mℹ[39m [33m[CJS][39m 44 files, total: 214.85 kB
|
|
56
56
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/Tree.d.cts.map [2m 6.90 kB[22m [2m│ gzip: 2.60 kB[22m
|
|
57
57
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/Struct.d.cts.map [2m 4.62 kB[22m [2m│ gzip: 1.95 kB[22m
|
|
58
58
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mutils/tree-helpers.d.cts.map [2m 3.61 kB[22m [2m│ gzip: 1.31 kB[22m
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mprimitives/Lazy.d.cts.map [2m 1.44 kB[22m [2m│ gzip: 0.69 kB[22m
|
|
71
71
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mclient/Rebase.d.cts.map [2m 1.02 kB[22m [2m│ gzip: 0.47 kB[22m
|
|
72
72
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mEffectSchema.d.cts.map [2m 1.00 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
73
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mserver/ServerDocument.d.cts.map [2m 0.
|
|
73
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mserver/ServerDocument.d.cts.map [2m 0.99 kB[22m [2m│ gzip: 0.50 kB[22m
|
|
74
74
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mOperationDefinition.d.cts.map [2m 0.89 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
75
75
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mDocument.d.cts.map [2m 0.85 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
76
76
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mOperation.d.cts.map [2m 0.81 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
@@ -94,8 +94,8 @@
|
|
|
94
94
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mprimitives/Struct.d.cts[39m [2m 6.93 kB[22m [2m│ gzip: 1.84 kB[22m
|
|
95
95
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mprimitives/shared.d.cts[39m [2m 6.89 kB[22m [2m│ gzip: 2.09 kB[22m
|
|
96
96
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mclient/ClientDocument.d.cts[39m [2m 6.07 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
97
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mserver/ServerDocument.d.cts[39m [2m 5.48 kB[22m [2m│ gzip: 1.76 kB[22m
|
|
97
98
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mprimitives/Either.d.cts[39m [2m 5.44 kB[22m [2m│ gzip: 1.54 kB[22m
|
|
98
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mserver/ServerDocument.d.cts[39m [2m 5.08 kB[22m [2m│ gzip: 1.62 kB[22m
|
|
99
99
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mprimitives/Array.d.cts[39m [2m 5.01 kB[22m [2m│ gzip: 1.44 kB[22m
|
|
100
100
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mclient/Rebase.d.cts[39m [2m 4.88 kB[22m [2m│ gzip: 1.14 kB[22m
|
|
101
101
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mprimitives/Union.d.cts[39m [2m 4.58 kB[22m [2m│ gzip: 1.26 kB[22m
|
|
@@ -120,8 +120,8 @@
|
|
|
120
120
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mclient/WebSocketTransport.d.cts[39m [2m 1.22 kB[22m [2m│ gzip: 0.55 kB[22m
|
|
121
121
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mOperationDefinition.d.cts[39m [2m 1.10 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
122
122
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mTransform.d.cts[39m [2m 0.48 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
123
|
-
[34mℹ[39m [33m[CJS][39m 67 files, total: 184.
|
|
124
|
-
[32m✔[39m Build complete in [
|
|
123
|
+
[34mℹ[39m [33m[CJS][39m 67 files, total: 184.57 kB
|
|
124
|
+
[32m✔[39m Build complete in [32m6318ms[39m
|
|
125
125
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m 1.13 kB[22m [2m│ gzip: 0.29 kB[22m
|
|
126
126
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mclient/index.mjs[22m [2m 0.99 kB[22m [2m│ gzip: 0.28 kB[22m
|
|
127
127
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mserver/index.mjs[22m [2m 0.41 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mEffectSchema.mjs.map [2m16.73 kB[22m [2m│ gzip: 3.54 kB[22m
|
|
140
140
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mFractionalIndex.mjs [2m16.49 kB[22m [2m│ gzip: 3.36 kB[22m
|
|
141
141
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mclient/Rebase.mjs.map [2m14.15 kB[22m [2m│ gzip: 3.21 kB[22m
|
|
142
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mserver/ServerDocument.mjs.map [
|
|
142
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mserver/ServerDocument.mjs.map [2m14.09 kB[22m [2m│ gzip: 3.86 kB[22m
|
|
143
143
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mutils/tree-helpers.mjs [2m13.31 kB[22m [2m│ gzip: 3.15 kB[22m
|
|
144
144
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mprimitives/shared.mjs.map [2m13.14 kB[22m [2m│ gzip: 3.69 kB[22m
|
|
145
145
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mprimitives/Array.mjs [2m11.07 kB[22m [2m│ gzip: 2.64 kB[22m
|
|
@@ -172,8 +172,8 @@
|
|
|
172
172
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mtypes/index.mjs.map [2m 3.71 kB[22m [2m│ gzip: 0.78 kB[22m
|
|
173
173
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mutils/tree-helpers.d.mts.map [2m 3.61 kB[22m [2m│ gzip: 1.31 kB[22m
|
|
174
174
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mclient/StateMonitor.mjs [2m 3.60 kB[22m [2m│ gzip: 1.23 kB[22m
|
|
175
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mserver/ServerDocument.mjs [2m 3.56 kB[22m [2m│ gzip: 1.13 kB[22m
|
|
175
176
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mprimitives/shared.mjs [2m 3.55 kB[22m [2m│ gzip: 1.25 kB[22m
|
|
176
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mserver/ServerDocument.mjs [2m 3.50 kB[22m [2m│ gzip: 1.12 kB[22m
|
|
177
177
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mprimitives/Boolean.mjs [2m 3.40 kB[22m [2m│ gzip: 1.04 kB[22m
|
|
178
178
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mprimitives/Literal.mjs [2m 3.31 kB[22m [2m│ gzip: 1.04 kB[22m
|
|
179
179
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mprimitives/Array.d.mts.map [2m 3.26 kB[22m [2m│ gzip: 1.35 kB[22m
|
|
@@ -203,7 +203,7 @@
|
|
|
203
203
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mPrimitive.mjs.map [2m 1.05 kB[22m [2m│ gzip: 0.29 kB[22m
|
|
204
204
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mclient/Rebase.d.mts.map [2m 1.03 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
205
205
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mEffectSchema.d.mts.map [2m 1.00 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
206
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mserver/ServerDocument.d.mts.map [2m 0.
|
|
206
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mserver/ServerDocument.d.mts.map [2m 0.97 kB[22m [2m│ gzip: 0.49 kB[22m
|
|
207
207
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs [2m 0.90 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
208
208
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mOperationDefinition.d.mts.map [2m 0.89 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
209
209
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocument.d.mts.map [2m 0.84 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
@@ -240,8 +240,8 @@
|
|
|
240
240
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mprimitives/Struct.d.mts[39m [2m 6.96 kB[22m [2m│ gzip: 1.85 kB[22m
|
|
241
241
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mprimitives/shared.d.mts[39m [2m 6.89 kB[22m [2m│ gzip: 2.09 kB[22m
|
|
242
242
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mclient/ClientDocument.d.mts[39m [2m 6.09 kB[22m [2m│ gzip: 1.69 kB[22m
|
|
243
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mserver/ServerDocument.d.mts[39m [2m 5.50 kB[22m [2m│ gzip: 1.76 kB[22m
|
|
243
244
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mprimitives/Either.d.mts[39m [2m 5.44 kB[22m [2m│ gzip: 1.54 kB[22m
|
|
244
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mserver/ServerDocument.d.mts[39m [2m 5.11 kB[22m [2m│ gzip: 1.62 kB[22m
|
|
245
245
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mprimitives/Array.d.mts[39m [2m 5.04 kB[22m [2m│ gzip: 1.45 kB[22m
|
|
246
246
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mclient/Rebase.d.mts[39m [2m 4.91 kB[22m [2m│ gzip: 1.15 kB[22m
|
|
247
247
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mprimitives/Union.d.mts[39m [2m 4.61 kB[22m [2m│ gzip: 1.27 kB[22m
|
|
@@ -266,5 +266,5 @@
|
|
|
266
266
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mclient/WebSocketTransport.d.mts[39m [2m 1.22 kB[22m [2m│ gzip: 0.55 kB[22m
|
|
267
267
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mOperationDefinition.d.mts[39m [2m 1.10 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
268
268
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mTransform.d.mts[39m [2m 0.48 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
269
|
-
[34mℹ[39m [34m[ESM][39m 144 files, total:
|
|
270
|
-
[32m✔[39m Build complete in [
|
|
269
|
+
[34mℹ[39m [34m[ESM][39m 144 files, total: 853.49 kB
|
|
270
|
+
[32m✔[39m Build complete in [32m6353ms[39m
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Transaction } from "../Transaction.cjs";
|
|
2
|
-
import { AnyPrimitive, InferSetInput, InferState } from "../primitives/shared.cjs";
|
|
2
|
+
import { AnyPrimitive, InferSetInput, InferSnapshot, InferState } from "../primitives/shared.cjs";
|
|
3
3
|
|
|
4
4
|
//#region src/server/ServerDocument.d.ts
|
|
5
5
|
declare namespace ServerDocument_d_exports {
|
|
@@ -85,6 +85,14 @@ interface ServerDocument<TSchema extends AnyPrimitive> {
|
|
|
85
85
|
readonly schema: TSchema;
|
|
86
86
|
/** Returns the current authoritative state */
|
|
87
87
|
get(): InferState<TSchema> | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* Returns a readonly snapshot of the entire document state for rendering.
|
|
90
|
+
* The snapshot is a type-safe, readonly structure where:
|
|
91
|
+
* - Required fields and fields with defaults are guaranteed to be defined
|
|
92
|
+
* - Optional fields may be undefined
|
|
93
|
+
* - Trees are converted from flat state to nested/hierarchical structure
|
|
94
|
+
*/
|
|
95
|
+
toSnapshot(): InferSnapshot<TSchema>;
|
|
88
96
|
/** Returns the current version number */
|
|
89
97
|
getVersion(): number;
|
|
90
98
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerDocument.d.cts","names":[],"sources":["../../src/server/ServerDocument.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAWiB,kBAAA;;wBAEO;;;;;;;UAQP,YAAA;;EAVA,SAAA,aAAkB,EAAA,MAAA;EAUlB,SAAA,MAAY,EAAA,MAAA;AAS7B;AASA;;;AAAgE,UAT/C,eAAA,CAS+C;EAAe,SAAA,IAAA,EAAA,UAAA;EASnE,SAAA,KAAA,EAAY,OAAA;EAQZ,SAAA,OAAA,EAAc,MAAA;AAW1B;;;;AAIqB,KAhCT,aAAA,GAAgB,kBAgCP,GAhC4B,YAgC5B,GAhC2C,eAgC3C;;;;AAS+B,KAhCxC,YAAA,GAgCwC;EAUnC,SAAA,OAAA,EAAc,IAAA;EAAiB,SAAA,OAAA,EAAA,MAAA;CAE7B,GAAA;EAGW,SAAA,OAAA,EAAA,KAAA;EAArB,SAAA,MAAA,EAAA,MAAA;
|
|
1
|
+
{"version":3,"file":"ServerDocument.d.cts","names":[],"sources":["../../src/server/ServerDocument.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAWiB,kBAAA;;wBAEO;;;;;;;UAQP,YAAA;;EAVA,SAAA,aAAkB,EAAA,MAAA;EAUlB,SAAA,MAAY,EAAA,MAAA;AAS7B;AASA;;;AAAgE,UAT/C,eAAA,CAS+C;EAAe,SAAA,IAAA,EAAA,UAAA;EASnE,SAAA,KAAA,EAAY,OAAA;EAQZ,SAAA,OAAA,EAAc,MAAA;AAW1B;;;;AAIqB,KAhCT,aAAA,GAAgB,kBAgCP,GAhC4B,YAgC5B,GAhC2C,eAgC3C;;;;AAS+B,KAhCxC,YAAA,GAgCwC;EAUnC,SAAA,OAAA,EAAc,IAAA;EAAiB,SAAA,OAAA,EAAA,MAAA;CAE7B,GAAA;EAGW,SAAA,OAAA,EAAA,KAAA;EAArB,SAAA,MAAA,EAAA,MAAA;CAS+B;;;;;AAmClB,KAnFV,cAAA,GAmFU;EAA0B,SAAA,KAAA,EAAA,IAAA;EAM/B,SAAA,WAAA,EAAA,MAAA;CAAe,GAAA;EAgBnB,SAoMZ,KAAA,EAAA,KAAA;EApMoC,SAAA,MAAA,EAAA,MAAA;CACJ;;;;AAChB,UAhGA,qBAgGA,CAAA,gBAhGsC,YAgGtC,CAAA,CAAA;;mBA9FE;;qBAEE,cAAwB;;;;;0BAKnB,WAAqB;;;;kCAIb;;;;;;;;;UAUjB,+BAA+B;;mBAE7B;;SAGV,WAAqB;;;;;;;;gBASd,cAAwB;;;;;;;;;;;;;wBAehB,cAA0B;;;;;;;;qBAS7B;;;;;;;;;;sBAWC,cAA0B;;;;;iBAM/B;;;;;;;;;;cAgBJ,uBAAwB,uBAC1B,sBAAsB,aAC9B,eAAe"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Transaction } from "../Transaction.mjs";
|
|
2
|
-
import { AnyPrimitive, InferSetInput, InferState } from "../primitives/shared.mjs";
|
|
2
|
+
import { AnyPrimitive, InferSetInput, InferSnapshot, InferState } from "../primitives/shared.mjs";
|
|
3
3
|
import "../Primitive.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/server/ServerDocument.d.ts
|
|
@@ -86,6 +86,14 @@ interface ServerDocument<TSchema extends AnyPrimitive> {
|
|
|
86
86
|
readonly schema: TSchema;
|
|
87
87
|
/** Returns the current authoritative state */
|
|
88
88
|
get(): InferState<TSchema> | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* Returns a readonly snapshot of the entire document state for rendering.
|
|
91
|
+
* The snapshot is a type-safe, readonly structure where:
|
|
92
|
+
* - Required fields and fields with defaults are guaranteed to be defined
|
|
93
|
+
* - Optional fields may be undefined
|
|
94
|
+
* - Trees are converted from flat state to nested/hierarchical structure
|
|
95
|
+
*/
|
|
96
|
+
toSnapshot(): InferSnapshot<TSchema>;
|
|
89
97
|
/** Returns the current version number */
|
|
90
98
|
getVersion(): number;
|
|
91
99
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerDocument.d.mts","names":[],"sources":["../../src/server/ServerDocument.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;UAWiB,kBAAA;;wBAEO;;;;;;;UAQP,YAAA;;;EAVA,SAAA,MAAA,EAAA,MAAkB;AAUnC;AASA;AASA;;AAAiD,UAThC,eAAA,CASgC;EAAe,SAAA,IAAA,EAAA,UAAA;EAAe,SAAA,KAAA,EAAA,OAAA;EASnE,SAAA,OAAY,EAAA,MAAA;AAQxB;AAWA;;;AAI6C,KAhCjC,aAAA,GAAgB,kBAgCiB,GAhCI,YAgCJ,GAhCmB,eAgCnB;;;;AASX,KAhCtB,YAAA,GAgCsB;EAAkB,SAAA,OAAA,EAAA,IAAA;EAUnC,SAAA,OAAA,EAAc,MAAA;CAAiB,GAAA;EAE7B,SAAA,OAAA,EAAA,KAAA;EAGW,SAAA,MAAA,EAAA,MAAA;CAArB;;;;;
|
|
1
|
+
{"version":3,"file":"ServerDocument.d.mts","names":[],"sources":["../../src/server/ServerDocument.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;UAWiB,kBAAA;;wBAEO;;;;;;;UAQP,YAAA;;;EAVA,SAAA,MAAA,EAAA,MAAkB;AAUnC;AASA;AASA;;AAAiD,UAThC,eAAA,CASgC;EAAe,SAAA,IAAA,EAAA,UAAA;EAAe,SAAA,KAAA,EAAA,OAAA;EASnE,SAAA,OAAY,EAAA,MAAA;AAQxB;AAWA;;;AAI6C,KAhCjC,aAAA,GAAgB,kBAgCiB,GAhCI,YAgCJ,GAhCmB,eAgCnB;;;;AASX,KAhCtB,YAAA,GAgCsB;EAAkB,SAAA,OAAA,EAAA,IAAA;EAUnC,SAAA,OAAA,EAAc,MAAA;CAAiB,GAAA;EAE7B,SAAA,OAAA,EAAA,KAAA;EAGW,SAAA,MAAA,EAAA,MAAA;CAArB;;;;;AAiCY,KAxET,cAAA,GAwES;EAWC,SAAA,KAAA,EAAA,IAAA;EAA0B,SAAA,WAAA,EAAA,MAAA;CAM/B,GAAA;EAAe,SAAA,KAAA,EAAA,KAAA;EAgBnB,SAoMZ,MAAA,EAAA,MAAA;CApMoC;;;;AAElC,UAhGc,qBAgGd,CAAA,gBAhGoD,YAgGpD,CAAA,CAAA;EAAc;mBA9FE;;qBAEE,cAAwB;;;;;0BAKnB,WAAqB;;;;kCAIb;;;;;;;;;UAUjB,+BAA+B;;mBAE7B;;SAGV,WAAqB;;;;;;;;gBASd,cAAwB;;;;;;;;;;;;;wBAehB,cAA0B;;;;;;;;qBAS7B;;;;;;;;;;sBAWC,cAA0B;;;;;iBAM/B;;;;;;;;;;cAgBJ,uBAAwB,uBAC1B,sBAAsB,aAC9B,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerDocument.mjs","names":["Document.make","_transactionOrder: string[]","Transaction.isEmpty"],"sources":["../../src/server/ServerDocument.ts"],"sourcesContent":["import * as Document from \"../Document\";\nimport * as Transaction from \"../Transaction\";\nimport type * as Primitive from \"../Primitive\";\n\n// =============================================================================\n// Server Message Types (matching client's Transport expectations)\n// =============================================================================\n\n/**\n * Message sent when broadcasting a committed transaction.\n */\nexport interface TransactionMessage {\n readonly type: \"transaction\";\n readonly transaction: Transaction.Transaction;\n /** Server-assigned version number for ordering */\n readonly version: number;\n}\n\n/**\n * Message sent when a transaction is rejected.\n */\nexport interface ErrorMessage {\n readonly type: \"error\";\n readonly transactionId: string;\n readonly reason: string;\n}\n\n/**\n * Message sent as a full state snapshot.\n */\nexport interface SnapshotMessage {\n readonly type: \"snapshot\";\n readonly state: unknown;\n readonly version: number;\n}\n\n/**\n * Union of all server messages that can be broadcast.\n */\nexport type ServerMessage = TransactionMessage | ErrorMessage | SnapshotMessage;\n\n// =============================================================================\n// Submit Result Types\n// =============================================================================\n\n/**\n * Result of submitting a transaction to the server.\n */\nexport type SubmitResult =\n | { readonly success: true; readonly version: number }\n | { readonly success: false; readonly reason: string };\n\n/**\n * Result of validating a transaction (two-phase commit: phase 1).\n * If valid, returns the version this transaction will get when applied.\n */\nexport type ValidateResult =\n | { readonly valid: true; readonly nextVersion: number }\n | { readonly valid: false; readonly reason: string };\n\n// =============================================================================\n// Server Document Types\n// =============================================================================\n\n/**\n * Options for creating a ServerDocument.\n */\nexport interface ServerDocumentOptions<TSchema extends Primitive.AnyPrimitive> {\n /** The schema defining the document structure */\n readonly schema: TSchema;\n /** Initial value for new documents (uses set input format, gets converted to state) */\n readonly initial?: Primitive.InferSetInput<TSchema>;\n /**\n * Raw initial state (already in internal state format).\n * Use this when restoring from storage. Takes precedence over `initial`.\n */\n readonly initialState?: Primitive.InferState<TSchema>;\n /** Initial version number (optional, defaults to 0) */\n readonly initialVersion?: number;\n /** Called when a transaction is successfully applied and should be broadcast */\n readonly onBroadcast: (message: TransactionMessage) => void;\n /** Called when a transaction is rejected (optional, for logging/metrics) */\n readonly onRejection?: (transactionId: string, reason: string) => void;\n /** Maximum number of processed transaction IDs to track for deduplication */\n readonly maxTransactionHistory?: number;\n}\n\n/**\n * A ServerDocument maintains the authoritative state and processes client transactions.\n */\nexport interface ServerDocument<TSchema extends Primitive.AnyPrimitive> {\n /** The schema defining this document's structure */\n readonly schema: TSchema;\n\n /** Returns the current authoritative state */\n get(): Primitive.InferState<TSchema> | undefined;\n\n /** Returns the current version number */\n getVersion(): number;\n\n /**\n * Phase 1 of two-phase commit: Validates a transaction without side effects.\n * Returns the version this transaction would get if applied.\n * Does NOT modify state, increment version, record transaction, or broadcast.\n *\n * Use this to validate before writing to WAL, then call apply() after WAL success.\n *\n * @param transaction - The transaction to validate\n * @returns ValidateResult with nextVersion if valid, or reason if invalid\n */\n validate(transaction: Transaction.Transaction): ValidateResult;\n\n /**\n * Phase 2 of two-phase commit: Applies a pre-validated transaction.\n * MUST only be called after validate() succeeded AND WAL write succeeded.\n * Mutates state, increments version, records transaction ID, and broadcasts.\n *\n * @param transaction - The transaction to apply (must have been validated first)\n */\n apply(transaction: Transaction.Transaction): void;\n\n /**\n * Submits a transaction for processing (combines validate + apply).\n * Validates and applies the transaction if valid, or rejects it with a reason.\n *\n * For two-phase commit with WAL, use validate() then apply() instead.\n *\n * @param transaction - The transaction to process\n * @returns SubmitResult indicating success with version or failure with reason\n */\n submit(transaction: Transaction.Transaction): SubmitResult;\n\n /**\n * Returns a snapshot of the current state and version.\n * Used to initialize new clients or resync after drift.\n */\n getSnapshot(): SnapshotMessage;\n\n /**\n * Checks if a transaction has already been processed.\n * @param transactionId - The transaction ID to check\n */\n hasProcessed(transactionId: string): boolean;\n}\n\n// =============================================================================\n// Server Document Implementation\n// =============================================================================\n\n/**\n * Creates a new ServerDocument for the given schema.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n options: ServerDocumentOptions<TSchema>\n): ServerDocument<TSchema> => {\n const {\n schema,\n initial,\n initialState,\n initialVersion = 0,\n onBroadcast,\n onRejection,\n maxTransactionHistory = 1000,\n } = options;\n\n // ==========================================================================\n // Internal State\n // ==========================================================================\n\n // The authoritative document\n // initialState (raw) takes precedence over initial (needs conversion)\n let _document = Document.make(schema, { initial, initialState });\n\n // Current version number (incremented on each successful transaction)\n let _version = initialVersion;\n\n // Track processed transaction IDs for deduplication\n const _processedTransactions = new Set<string>();\n const _transactionOrder: string[] = [];\n\n // ==========================================================================\n // Helper Functions\n // ==========================================================================\n\n /**\n * Records a transaction as processed, maintaining the history limit.\n */\n const recordTransaction = (transactionId: string): void => {\n _processedTransactions.add(transactionId);\n _transactionOrder.push(transactionId);\n\n // Evict oldest transactions if over limit\n while (_transactionOrder.length > maxTransactionHistory) {\n const oldest = _transactionOrder.shift();\n if (oldest) {\n _processedTransactions.delete(oldest);\n }\n }\n };\n\n /**\n * Validates that the transaction can be applied to the current state.\n * Creates a temporary document and attempts to apply the operations.\n */\n const validateTransaction = (\n transaction: Transaction.Transaction\n ): { valid: true } | { valid: false; reason: string } => {\n // Check for empty transaction\n if (Transaction.isEmpty(transaction)) {\n return { valid: false, reason: \"Transaction is empty\" };\n }\n\n // Check for duplicate transaction\n if (_processedTransactions.has(transaction.id)) {\n return { valid: false, reason: \"Transaction has already been processed\" };\n }\n\n // Create a temporary document with current state to test the operations\n // Use initialState (not initial) since currentState is already in flat state format\n const currentState = _document.get();\n const tempDoc = Document.make(schema, { initialState: currentState });\n\n try {\n // Attempt to apply all operations\n tempDoc.apply(transaction.ops);\n return { valid: true };\n } catch (error) {\n // Operations failed to apply\n const message = error instanceof Error ? error.message : String(error);\n return { valid: false, reason: message };\n }\n };\n\n // ==========================================================================\n // Internal Apply Logic\n // ==========================================================================\n\n /**\n * Internal function to apply a transaction and broadcast.\n * Called by both apply() and submit().\n */\n const applyAndBroadcast = (transaction: Transaction.Transaction): void => {\n // Apply the transaction to the authoritative state\n _document.apply(transaction.ops);\n\n // Increment version\n _version += 1;\n\n // Record as processed\n recordTransaction(transaction.id);\n\n // Broadcast the confirmed transaction\n const message: TransactionMessage = {\n type: \"transaction\",\n transaction,\n version: _version,\n };\n onBroadcast(message);\n };\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n\n const serverDocument: ServerDocument<TSchema> = {\n schema,\n\n get: (): Primitive.InferState<TSchema> | undefined => {\n return _document.get();\n },\n\n getVersion: (): number => {\n return _version;\n },\n\n validate: (transaction: Transaction.Transaction): ValidateResult => {\n // Use internal validation helper\n const validation = validateTransaction(transaction);\n\n if (!validation.valid) {\n return {\n valid: false,\n reason: validation.reason,\n };\n }\n\n // Return the version this transaction will get when applied\n return {\n valid: true,\n nextVersion: _version + 1,\n };\n },\n\n apply: (transaction: Transaction.Transaction): void => {\n // Apply and broadcast\n // Note: This assumes validate() was called first and WAL write succeeded\n // We don't re-validate here for performance - caller is responsible\n applyAndBroadcast(transaction);\n },\n\n submit: (transaction: Transaction.Transaction): SubmitResult => {\n // Validate the transaction\n const validation = validateTransaction(transaction);\n\n if (!validation.valid) {\n // Notify rejection callback if provided\n onRejection?.(transaction.id, validation.reason);\n\n return {\n success: false,\n reason: validation.reason,\n };\n }\n\n // Apply the transaction to the authoritative state\n try {\n applyAndBroadcast(transaction);\n } catch (error) {\n // This shouldn't happen since we validated, but handle gracefully\n const reason = error instanceof Error ? error.message : String(error);\n onRejection?.(transaction.id, reason);\n return { success: false, reason };\n }\n\n return {\n success: true,\n version: _version,\n };\n },\n\n getSnapshot: (): SnapshotMessage => {\n return {\n type: \"snapshot\",\n state: _document.get(),\n version: _version,\n };\n },\n\n hasProcessed: (transactionId: string): boolean => {\n return _processedTransactions.has(transactionId);\n },\n };\n\n return serverDocument;\n};\n"],"mappings":";;;;;;;;;AAwJA,MAAa,QACX,YAC4B;CAC5B,MAAM,EACJ,QACA,SACA,cACA,iBAAiB,GACjB,aACA,aACA,wBAAwB,QACtB;CAQJ,IAAI,YAAYA,OAAc,QAAQ;EAAE;EAAS;EAAc,CAAC;CAGhE,IAAI,WAAW;CAGf,MAAM,yCAAyB,IAAI,KAAa;CAChD,MAAMC,oBAA8B,EAAE;;;;CAStC,MAAM,qBAAqB,kBAAgC;AACzD,yBAAuB,IAAI,cAAc;AACzC,oBAAkB,KAAK,cAAc;AAGrC,SAAO,kBAAkB,SAAS,uBAAuB;GACvD,MAAM,SAAS,kBAAkB,OAAO;AACxC,OAAI,OACF,wBAAuB,OAAO,OAAO;;;;;;;CAS3C,MAAM,uBACJ,gBACuD;AAEvD,MAAIC,QAAoB,YAAY,CAClC,QAAO;GAAE,OAAO;GAAO,QAAQ;GAAwB;AAIzD,MAAI,uBAAuB,IAAI,YAAY,GAAG,CAC5C,QAAO;GAAE,OAAO;GAAO,QAAQ;GAA0C;EAK3E,MAAM,eAAe,UAAU,KAAK;EACpC,MAAM,UAAUF,OAAc,QAAQ,EAAE,cAAc,cAAc,CAAC;AAErE,MAAI;AAEF,WAAQ,MAAM,YAAY,IAAI;AAC9B,UAAO,EAAE,OAAO,MAAM;WACf,OAAO;AAGd,UAAO;IAAE,OAAO;IAAO,QADP,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9B;;;;;;;CAY5C,MAAM,qBAAqB,gBAA+C;AAExE,YAAU,MAAM,YAAY,IAAI;AAGhC,cAAY;AAGZ,oBAAkB,YAAY,GAAG;AAQjC,cALoC;GAClC,MAAM;GACN;GACA,SAAS;GACV,CACmB;;AAsFtB,QA/EgD;EAC9C;EAEA,WAAsD;AACpD,UAAO,UAAU,KAAK;;EAGxB,kBAA0B;AACxB,UAAO;;EAGT,WAAW,gBAAyD;GAElE,MAAM,aAAa,oBAAoB,YAAY;AAEnD,OAAI,CAAC,WAAW,MACd,QAAO;IACL,OAAO;IACP,QAAQ,WAAW;IACpB;AAIH,UAAO;IACL,OAAO;IACP,aAAa,WAAW;IACzB;;EAGH,QAAQ,gBAA+C;AAIrD,qBAAkB,YAAY;;EAGhC,SAAS,gBAAuD;GAE9D,MAAM,aAAa,oBAAoB,YAAY;AAEnD,OAAI,CAAC,WAAW,OAAO;AAErB,kEAAc,YAAY,IAAI,WAAW,OAAO;AAEhD,WAAO;KACL,SAAS;KACT,QAAQ,WAAW;KACpB;;AAIH,OAAI;AACF,sBAAkB,YAAY;YACvB,OAAO;IAEd,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,kEAAc,YAAY,IAAI,OAAO;AACrC,WAAO;KAAE,SAAS;KAAO;KAAQ;;AAGnC,UAAO;IACL,SAAS;IACT,SAAS;IACV;;EAGH,mBAAoC;AAClC,UAAO;IACL,MAAM;IACN,OAAO,UAAU,KAAK;IACtB,SAAS;IACV;;EAGH,eAAe,kBAAmC;AAChD,UAAO,uBAAuB,IAAI,cAAc;;EAEnD"}
|
|
1
|
+
{"version":3,"file":"ServerDocument.mjs","names":["Document.make","_transactionOrder: string[]","Transaction.isEmpty"],"sources":["../../src/server/ServerDocument.ts"],"sourcesContent":["import * as Document from \"../Document\";\nimport * as Transaction from \"../Transaction\";\nimport type * as Primitive from \"../Primitive\";\n\n// =============================================================================\n// Server Message Types (matching client's Transport expectations)\n// =============================================================================\n\n/**\n * Message sent when broadcasting a committed transaction.\n */\nexport interface TransactionMessage {\n readonly type: \"transaction\";\n readonly transaction: Transaction.Transaction;\n /** Server-assigned version number for ordering */\n readonly version: number;\n}\n\n/**\n * Message sent when a transaction is rejected.\n */\nexport interface ErrorMessage {\n readonly type: \"error\";\n readonly transactionId: string;\n readonly reason: string;\n}\n\n/**\n * Message sent as a full state snapshot.\n */\nexport interface SnapshotMessage {\n readonly type: \"snapshot\";\n readonly state: unknown;\n readonly version: number;\n}\n\n/**\n * Union of all server messages that can be broadcast.\n */\nexport type ServerMessage = TransactionMessage | ErrorMessage | SnapshotMessage;\n\n// =============================================================================\n// Submit Result Types\n// =============================================================================\n\n/**\n * Result of submitting a transaction to the server.\n */\nexport type SubmitResult =\n | { readonly success: true; readonly version: number }\n | { readonly success: false; readonly reason: string };\n\n/**\n * Result of validating a transaction (two-phase commit: phase 1).\n * If valid, returns the version this transaction will get when applied.\n */\nexport type ValidateResult =\n | { readonly valid: true; readonly nextVersion: number }\n | { readonly valid: false; readonly reason: string };\n\n// =============================================================================\n// Server Document Types\n// =============================================================================\n\n/**\n * Options for creating a ServerDocument.\n */\nexport interface ServerDocumentOptions<TSchema extends Primitive.AnyPrimitive> {\n /** The schema defining the document structure */\n readonly schema: TSchema;\n /** Initial value for new documents (uses set input format, gets converted to state) */\n readonly initial?: Primitive.InferSetInput<TSchema>;\n /**\n * Raw initial state (already in internal state format).\n * Use this when restoring from storage. Takes precedence over `initial`.\n */\n readonly initialState?: Primitive.InferState<TSchema>;\n /** Initial version number (optional, defaults to 0) */\n readonly initialVersion?: number;\n /** Called when a transaction is successfully applied and should be broadcast */\n readonly onBroadcast: (message: TransactionMessage) => void;\n /** Called when a transaction is rejected (optional, for logging/metrics) */\n readonly onRejection?: (transactionId: string, reason: string) => void;\n /** Maximum number of processed transaction IDs to track for deduplication */\n readonly maxTransactionHistory?: number;\n}\n\n/**\n * A ServerDocument maintains the authoritative state and processes client transactions.\n */\nexport interface ServerDocument<TSchema extends Primitive.AnyPrimitive> {\n /** The schema defining this document's structure */\n readonly schema: TSchema;\n\n /** Returns the current authoritative state */\n get(): Primitive.InferState<TSchema> | undefined;\n\n /**\n * Returns a readonly snapshot of the entire document state for rendering.\n * The snapshot is a type-safe, readonly structure where:\n * - Required fields and fields with defaults are guaranteed to be defined\n * - Optional fields may be undefined\n * - Trees are converted from flat state to nested/hierarchical structure\n */\n toSnapshot(): Primitive.InferSnapshot<TSchema>;\n\n /** Returns the current version number */\n getVersion(): number;\n\n /**\n * Phase 1 of two-phase commit: Validates a transaction without side effects.\n * Returns the version this transaction would get if applied.\n * Does NOT modify state, increment version, record transaction, or broadcast.\n *\n * Use this to validate before writing to WAL, then call apply() after WAL success.\n *\n * @param transaction - The transaction to validate\n * @returns ValidateResult with nextVersion if valid, or reason if invalid\n */\n validate(transaction: Transaction.Transaction): ValidateResult;\n\n /**\n * Phase 2 of two-phase commit: Applies a pre-validated transaction.\n * MUST only be called after validate() succeeded AND WAL write succeeded.\n * Mutates state, increments version, records transaction ID, and broadcasts.\n *\n * @param transaction - The transaction to apply (must have been validated first)\n */\n apply(transaction: Transaction.Transaction): void;\n\n /**\n * Submits a transaction for processing (combines validate + apply).\n * Validates and applies the transaction if valid, or rejects it with a reason.\n *\n * For two-phase commit with WAL, use validate() then apply() instead.\n *\n * @param transaction - The transaction to process\n * @returns SubmitResult indicating success with version or failure with reason\n */\n submit(transaction: Transaction.Transaction): SubmitResult;\n\n /**\n * Returns a snapshot of the current state and version.\n * Used to initialize new clients or resync after drift.\n */\n getSnapshot(): SnapshotMessage;\n\n /**\n * Checks if a transaction has already been processed.\n * @param transactionId - The transaction ID to check\n */\n hasProcessed(transactionId: string): boolean;\n}\n\n// =============================================================================\n// Server Document Implementation\n// =============================================================================\n\n/**\n * Creates a new ServerDocument for the given schema.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n options: ServerDocumentOptions<TSchema>\n): ServerDocument<TSchema> => {\n const {\n schema,\n initial,\n initialState,\n initialVersion = 0,\n onBroadcast,\n onRejection,\n maxTransactionHistory = 1000,\n } = options;\n\n // ==========================================================================\n // Internal State\n // ==========================================================================\n\n // The authoritative document\n // initialState (raw) takes precedence over initial (needs conversion)\n let _document = Document.make(schema, { initial, initialState });\n\n // Current version number (incremented on each successful transaction)\n let _version = initialVersion;\n\n // Track processed transaction IDs for deduplication\n const _processedTransactions = new Set<string>();\n const _transactionOrder: string[] = [];\n\n // ==========================================================================\n // Helper Functions\n // ==========================================================================\n\n /**\n * Records a transaction as processed, maintaining the history limit.\n */\n const recordTransaction = (transactionId: string): void => {\n _processedTransactions.add(transactionId);\n _transactionOrder.push(transactionId);\n\n // Evict oldest transactions if over limit\n while (_transactionOrder.length > maxTransactionHistory) {\n const oldest = _transactionOrder.shift();\n if (oldest) {\n _processedTransactions.delete(oldest);\n }\n }\n };\n\n /**\n * Validates that the transaction can be applied to the current state.\n * Creates a temporary document and attempts to apply the operations.\n */\n const validateTransaction = (\n transaction: Transaction.Transaction\n ): { valid: true } | { valid: false; reason: string } => {\n // Check for empty transaction\n if (Transaction.isEmpty(transaction)) {\n return { valid: false, reason: \"Transaction is empty\" };\n }\n\n // Check for duplicate transaction\n if (_processedTransactions.has(transaction.id)) {\n return { valid: false, reason: \"Transaction has already been processed\" };\n }\n\n // Create a temporary document with current state to test the operations\n // Use initialState (not initial) since currentState is already in flat state format\n const currentState = _document.get();\n const tempDoc = Document.make(schema, { initialState: currentState });\n\n try {\n // Attempt to apply all operations\n tempDoc.apply(transaction.ops);\n return { valid: true };\n } catch (error) {\n // Operations failed to apply\n const message = error instanceof Error ? error.message : String(error);\n return { valid: false, reason: message };\n }\n };\n\n // ==========================================================================\n // Internal Apply Logic\n // ==========================================================================\n\n /**\n * Internal function to apply a transaction and broadcast.\n * Called by both apply() and submit().\n */\n const applyAndBroadcast = (transaction: Transaction.Transaction): void => {\n // Apply the transaction to the authoritative state\n _document.apply(transaction.ops);\n\n // Increment version\n _version += 1;\n\n // Record as processed\n recordTransaction(transaction.id);\n\n // Broadcast the confirmed transaction\n const message: TransactionMessage = {\n type: \"transaction\",\n transaction,\n version: _version,\n };\n onBroadcast(message);\n };\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n\n const serverDocument: ServerDocument<TSchema> = {\n schema,\n\n get: (): Primitive.InferState<TSchema> | undefined => {\n return _document.get();\n },\n\n toSnapshot: (): Primitive.InferSnapshot<TSchema> => {\n return _document.toSnapshot();\n },\n\n getVersion: (): number => {\n return _version;\n },\n\n validate: (transaction: Transaction.Transaction): ValidateResult => {\n // Use internal validation helper\n const validation = validateTransaction(transaction);\n\n if (!validation.valid) {\n return {\n valid: false,\n reason: validation.reason,\n };\n }\n\n // Return the version this transaction will get when applied\n return {\n valid: true,\n nextVersion: _version + 1,\n };\n },\n\n apply: (transaction: Transaction.Transaction): void => {\n // Apply and broadcast\n // Note: This assumes validate() was called first and WAL write succeeded\n // We don't re-validate here for performance - caller is responsible\n applyAndBroadcast(transaction);\n },\n\n submit: (transaction: Transaction.Transaction): SubmitResult => {\n // Validate the transaction\n const validation = validateTransaction(transaction);\n\n if (!validation.valid) {\n // Notify rejection callback if provided\n onRejection?.(transaction.id, validation.reason);\n\n return {\n success: false,\n reason: validation.reason,\n };\n }\n\n // Apply the transaction to the authoritative state\n try {\n applyAndBroadcast(transaction);\n } catch (error) {\n // This shouldn't happen since we validated, but handle gracefully\n const reason = error instanceof Error ? error.message : String(error);\n onRejection?.(transaction.id, reason);\n return { success: false, reason };\n }\n\n return {\n success: true,\n version: _version,\n };\n },\n\n getSnapshot: (): SnapshotMessage => {\n return {\n type: \"snapshot\",\n state: _document.get(),\n version: _version,\n };\n },\n\n hasProcessed: (transactionId: string): boolean => {\n return _processedTransactions.has(transactionId);\n },\n };\n\n return serverDocument;\n};\n"],"mappings":";;;;;;;;;AAiKA,MAAa,QACX,YAC4B;CAC5B,MAAM,EACJ,QACA,SACA,cACA,iBAAiB,GACjB,aACA,aACA,wBAAwB,QACtB;CAQJ,IAAI,YAAYA,OAAc,QAAQ;EAAE;EAAS;EAAc,CAAC;CAGhE,IAAI,WAAW;CAGf,MAAM,yCAAyB,IAAI,KAAa;CAChD,MAAMC,oBAA8B,EAAE;;;;CAStC,MAAM,qBAAqB,kBAAgC;AACzD,yBAAuB,IAAI,cAAc;AACzC,oBAAkB,KAAK,cAAc;AAGrC,SAAO,kBAAkB,SAAS,uBAAuB;GACvD,MAAM,SAAS,kBAAkB,OAAO;AACxC,OAAI,OACF,wBAAuB,OAAO,OAAO;;;;;;;CAS3C,MAAM,uBACJ,gBACuD;AAEvD,MAAIC,QAAoB,YAAY,CAClC,QAAO;GAAE,OAAO;GAAO,QAAQ;GAAwB;AAIzD,MAAI,uBAAuB,IAAI,YAAY,GAAG,CAC5C,QAAO;GAAE,OAAO;GAAO,QAAQ;GAA0C;EAK3E,MAAM,eAAe,UAAU,KAAK;EACpC,MAAM,UAAUF,OAAc,QAAQ,EAAE,cAAc,cAAc,CAAC;AAErE,MAAI;AAEF,WAAQ,MAAM,YAAY,IAAI;AAC9B,UAAO,EAAE,OAAO,MAAM;WACf,OAAO;AAGd,UAAO;IAAE,OAAO;IAAO,QADP,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9B;;;;;;;CAY5C,MAAM,qBAAqB,gBAA+C;AAExE,YAAU,MAAM,YAAY,IAAI;AAGhC,cAAY;AAGZ,oBAAkB,YAAY,GAAG;AAQjC,cALoC;GAClC,MAAM;GACN;GACA,SAAS;GACV,CACmB;;AA0FtB,QAnFgD;EAC9C;EAEA,WAAsD;AACpD,UAAO,UAAU,KAAK;;EAGxB,kBAAoD;AAClD,UAAO,UAAU,YAAY;;EAG/B,kBAA0B;AACxB,UAAO;;EAGT,WAAW,gBAAyD;GAElE,MAAM,aAAa,oBAAoB,YAAY;AAEnD,OAAI,CAAC,WAAW,MACd,QAAO;IACL,OAAO;IACP,QAAQ,WAAW;IACpB;AAIH,UAAO;IACL,OAAO;IACP,aAAa,WAAW;IACzB;;EAGH,QAAQ,gBAA+C;AAIrD,qBAAkB,YAAY;;EAGhC,SAAS,gBAAuD;GAE9D,MAAM,aAAa,oBAAoB,YAAY;AAEnD,OAAI,CAAC,WAAW,OAAO;AAErB,kEAAc,YAAY,IAAI,WAAW,OAAO;AAEhD,WAAO;KACL,SAAS;KACT,QAAQ,WAAW;KACpB;;AAIH,OAAI;AACF,sBAAkB,YAAY;YACvB,OAAO;IAEd,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,kEAAc,YAAY,IAAI,OAAO;AACrC,WAAO;KAAE,SAAS;KAAO;KAAQ;;AAGnC,UAAO;IACL,SAAS;IACT,SAAS;IACV;;EAGH,mBAAoC;AAClC,UAAO;IACL,MAAM;IACN,OAAO,UAAU,KAAK;IACtB,SAAS;IACV;;EAGH,eAAe,kBAAmC;AAChD,UAAO,uBAAuB,IAAI,cAAc;;EAEnD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voidhash/mimic",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"typescript": "5.8.3",
|
|
32
32
|
"vite-tsconfig-paths": "^5.1.4",
|
|
33
33
|
"vitest": "^3.2.4",
|
|
34
|
-
"@voidhash/tsconfig": "1.0.0-beta.
|
|
34
|
+
"@voidhash/tsconfig": "1.0.0-beta.12"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"effect": "^3.19.12"
|
|
@@ -95,6 +95,15 @@ export interface ServerDocument<TSchema extends Primitive.AnyPrimitive> {
|
|
|
95
95
|
/** Returns the current authoritative state */
|
|
96
96
|
get(): Primitive.InferState<TSchema> | undefined;
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Returns a readonly snapshot of the entire document state for rendering.
|
|
100
|
+
* The snapshot is a type-safe, readonly structure where:
|
|
101
|
+
* - Required fields and fields with defaults are guaranteed to be defined
|
|
102
|
+
* - Optional fields may be undefined
|
|
103
|
+
* - Trees are converted from flat state to nested/hierarchical structure
|
|
104
|
+
*/
|
|
105
|
+
toSnapshot(): Primitive.InferSnapshot<TSchema>;
|
|
106
|
+
|
|
98
107
|
/** Returns the current version number */
|
|
99
108
|
getVersion(): number;
|
|
100
109
|
|
|
@@ -269,6 +278,10 @@ export const make = <TSchema extends Primitive.AnyPrimitive>(
|
|
|
269
278
|
return _document.get();
|
|
270
279
|
},
|
|
271
280
|
|
|
281
|
+
toSnapshot: (): Primitive.InferSnapshot<TSchema> => {
|
|
282
|
+
return _document.toSnapshot();
|
|
283
|
+
},
|
|
284
|
+
|
|
272
285
|
getVersion: (): number => {
|
|
273
286
|
return _version;
|
|
274
287
|
},
|