@voidhash/mimic 1.0.0-beta.7 → 1.0.0-beta.9

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @voidhash/mimic@1.0.0-beta.7 build /home/runner/work/mimic/mimic/packages/mimic
2
+ > @voidhash/mimic@1.0.0-beta.9 build /home/runner/work/mimic/mimic/packages/mimic
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.18.2 powered by rolldown v1.0.0-beta.55
@@ -31,7 +31,7 @@
31
31
  ℹ [CJS] dist/primitives/Literal.cjs  3.89 kB │ gzip: 1.06 kB
32
32
  ℹ [CJS] dist/client/StateMonitor.cjs  3.71 kB │ gzip: 1.27 kB
33
33
  ℹ [CJS] dist/primitives/shared.cjs  3.69 kB │ gzip: 1.25 kB
34
- ℹ [CJS] dist/server/ServerDocument.cjs  3.66 kB │ gzip: 1.14 kB
34
+ ℹ [CJS] dist/server/ServerDocument.cjs  3.68 kB │ gzip: 1.15 kB
35
35
  ℹ [CJS] dist/server/errors.cjs  3.29 kB │ gzip: 0.70 kB
36
36
  ℹ [CJS] dist/primitives/TreeNode.cjs  2.67 kB │ gzip: 0.92 kB
37
37
  ℹ [CJS] dist/Presence.cjs  2.36 kB │ gzip: 0.87 kB
@@ -52,7 +52,7 @@
52
52
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutPropertiesLoose.cjs  0.37 kB │ gzip: 0.24 kB
53
53
  ℹ [CJS] dist/client/Transport.cjs  0.21 kB │ gzip: 0.16 kB
54
54
  ℹ [CJS] dist/Transform.cjs  0.20 kB │ gzip: 0.16 kB
55
- ℹ [CJS] 44 files, total: 214.77 kB
55
+ ℹ [CJS] 44 files, total: 214.79 kB
56
56
  ℹ [CJS] dist/primitives/Tree.d.cts.map  6.90 kB │ gzip: 2.60 kB
57
57
  ℹ [CJS] dist/primitives/Struct.d.cts.map  4.62 kB │ gzip: 1.95 kB
58
58
  ℹ [CJS] dist/utils/tree-helpers.d.cts.map  3.61 kB │ gzip: 1.31 kB
@@ -70,7 +70,7 @@
70
70
  ℹ [CJS] dist/primitives/Lazy.d.cts.map  1.44 kB │ gzip: 0.69 kB
71
71
  ℹ [CJS] dist/client/Rebase.d.cts.map  1.02 kB │ gzip: 0.47 kB
72
72
  ℹ [CJS] dist/EffectSchema.d.cts.map  1.00 kB │ gzip: 0.48 kB
73
- ℹ [CJS] dist/server/ServerDocument.d.cts.map  0.92 kB │ gzip: 0.46 kB
73
+ ℹ [CJS] dist/server/ServerDocument.d.cts.map  0.93 kB │ gzip: 0.47 kB
74
74
  ℹ [CJS] dist/OperationDefinition.d.cts.map  0.89 kB │ gzip: 0.42 kB
75
75
  ℹ [CJS] dist/Document.d.cts.map  0.85 kB │ gzip: 0.46 kB
76
76
  ℹ [CJS] dist/Operation.d.cts.map  0.81 kB │ gzip: 0.42 kB
@@ -95,8 +95,8 @@
95
95
  ℹ [CJS] dist/primitives/shared.d.cts  6.89 kB │ gzip: 2.09 kB
96
96
  ℹ [CJS] dist/client/ClientDocument.d.cts  6.07 kB │ gzip: 1.68 kB
97
97
  ℹ [CJS] dist/primitives/Either.d.cts  5.44 kB │ gzip: 1.54 kB
98
+ ℹ [CJS] dist/server/ServerDocument.d.cts  5.08 kB │ gzip: 1.62 kB
98
99
  ℹ [CJS] dist/primitives/Array.d.cts  5.01 kB │ gzip: 1.44 kB
99
- ℹ [CJS] dist/server/ServerDocument.d.cts  4.90 kB │ gzip: 1.55 kB
100
100
  ℹ [CJS] dist/client/Rebase.d.cts  4.88 kB │ gzip: 1.14 kB
101
101
  ℹ [CJS] dist/primitives/Union.d.cts  4.58 kB │ gzip: 1.26 kB
102
102
  ℹ [CJS] dist/primitives/TreeNode.d.cts  4.28 kB │ gzip: 1.29 kB
@@ -120,8 +120,8 @@
120
120
  ℹ [CJS] dist/client/WebSocketTransport.d.cts  1.22 kB │ gzip: 0.55 kB
121
121
  ℹ [CJS] dist/OperationDefinition.d.cts  1.10 kB │ gzip: 0.37 kB
122
122
  ℹ [CJS] dist/Transform.d.cts  0.48 kB │ gzip: 0.26 kB
123
- ℹ [CJS] 67 files, total: 183.93 kB
124
- ✔ Build complete in 6048ms
123
+ ℹ [CJS] 67 files, total: 184.12 kB
124
+ ✔ Build complete in 6244ms
125
125
  ℹ [ESM] dist/index.mjs  1.13 kB │ gzip: 0.29 kB
126
126
  ℹ [ESM] dist/client/index.mjs  0.99 kB │ gzip: 0.28 kB
127
127
  ℹ [ESM] dist/server/index.mjs  0.41 kB │ gzip: 0.17 kB
@@ -139,8 +139,8 @@
139
139
  ℹ [ESM] dist/EffectSchema.mjs.map 16.73 kB │ gzip: 3.54 kB
140
140
  ℹ [ESM] dist/FractionalIndex.mjs 16.49 kB │ gzip: 3.36 kB
141
141
  ℹ [ESM] dist/client/Rebase.mjs.map 14.15 kB │ gzip: 3.21 kB
142
+ ℹ [ESM] dist/server/ServerDocument.mjs.map 13.55 kB │ gzip: 3.69 kB
142
143
  ℹ [ESM] dist/utils/tree-helpers.mjs 13.31 kB │ gzip: 3.15 kB
143
- ℹ [ESM] dist/server/ServerDocument.mjs.map 13.26 kB │ gzip: 3.59 kB
144
144
  ℹ [ESM] dist/primitives/shared.mjs.map 13.14 kB │ gzip: 3.69 kB
145
145
  ℹ [ESM] dist/primitives/Array.mjs 11.07 kB │ gzip: 2.64 kB
146
146
  ℹ [ESM] dist/Document.mjs.map 10.89 kB │ gzip: 3.31 kB
@@ -173,7 +173,7 @@
173
173
  ℹ [ESM] dist/utils/tree-helpers.d.mts.map  3.61 kB │ gzip: 1.31 kB
174
174
  ℹ [ESM] dist/client/StateMonitor.mjs  3.60 kB │ gzip: 1.23 kB
175
175
  ℹ [ESM] dist/primitives/shared.mjs  3.55 kB │ gzip: 1.25 kB
176
- ℹ [ESM] dist/server/ServerDocument.mjs  3.49 kB │ gzip: 1.11 kB
176
+ ℹ [ESM] dist/server/ServerDocument.mjs  3.50 kB │ gzip: 1.12 kB
177
177
  ℹ [ESM] dist/primitives/Boolean.mjs  3.40 kB │ gzip: 1.04 kB
178
178
  ℹ [ESM] dist/primitives/Literal.mjs  3.31 kB │ gzip: 1.04 kB
179
179
  ℹ [ESM] dist/primitives/Array.d.mts.map  3.26 kB │ gzip: 1.35 kB
@@ -203,14 +203,14 @@
203
203
  ℹ [ESM] dist/Primitive.mjs.map  1.05 kB │ gzip: 0.29 kB
204
204
  ℹ [ESM] dist/client/Rebase.d.mts.map  1.03 kB │ gzip: 0.48 kB
205
205
  ℹ [ESM] dist/EffectSchema.d.mts.map  1.00 kB │ gzip: 0.48 kB
206
+ ℹ [ESM] dist/server/ServerDocument.d.mts.map  0.92 kB │ gzip: 0.46 kB
206
207
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs  0.90 kB │ gzip: 0.42 kB
207
- ℹ [ESM] dist/server/ServerDocument.d.mts.map  0.90 kB │ gzip: 0.46 kB
208
208
  ℹ [ESM] dist/OperationDefinition.d.mts.map  0.89 kB │ gzip: 0.42 kB
209
209
  ℹ [ESM] dist/Document.d.mts.map  0.84 kB │ gzip: 0.46 kB
210
210
  ℹ [ESM] dist/Operation.d.mts.map  0.81 kB │ gzip: 0.42 kB
211
211
  ℹ [ESM] dist/OperationPath.d.mts.map  0.77 kB │ gzip: 0.43 kB
212
212
  ℹ [ESM] dist/client/errors.d.mts.map  0.74 kB │ gzip: 0.38 kB
213
- ℹ [ESM] dist/Presence.d.mts.map  0.69 kB │ gzip: 0.38 kB
213
+ ℹ [ESM] dist/Presence.d.mts.map  0.69 kB │ gzip: 0.39 kB
214
214
  ℹ [ESM] dist/Transform.mjs.map  0.67 kB │ gzip: 0.30 kB
215
215
  ℹ [ESM] dist/client/StateMonitor.d.mts.map  0.63 kB │ gzip: 0.35 kB
216
216
  ℹ [ESM] dist/Transaction.d.mts.map  0.56 kB │ gzip: 0.32 kB
@@ -241,8 +241,8 @@
241
241
  ℹ [ESM] dist/primitives/shared.d.mts  6.89 kB │ gzip: 2.09 kB
242
242
  ℹ [ESM] dist/client/ClientDocument.d.mts  6.09 kB │ gzip: 1.69 kB
243
243
  ℹ [ESM] dist/primitives/Either.d.mts  5.44 kB │ gzip: 1.54 kB
244
+ ℹ [ESM] dist/server/ServerDocument.d.mts  5.11 kB │ gzip: 1.62 kB
244
245
  ℹ [ESM] dist/primitives/Array.d.mts  5.04 kB │ gzip: 1.45 kB
245
- ℹ [ESM] dist/server/ServerDocument.d.mts  4.93 kB │ gzip: 1.56 kB
246
246
  ℹ [ESM] dist/client/Rebase.d.mts  4.91 kB │ gzip: 1.15 kB
247
247
  ℹ [ESM] dist/primitives/Union.d.mts  4.61 kB │ gzip: 1.27 kB
248
248
  ℹ [ESM] dist/primitives/TreeNode.d.mts  4.31 kB │ gzip: 1.29 kB
@@ -266,5 +266,5 @@
266
266
  ℹ [ESM] dist/client/WebSocketTransport.d.mts  1.22 kB │ gzip: 0.55 kB
267
267
  ℹ [ESM] dist/OperationDefinition.d.mts  1.10 kB │ gzip: 0.37 kB
268
268
  ℹ [ESM] dist/Transform.d.mts  0.48 kB │ gzip: 0.26 kB
269
- ℹ [ESM] 144 files, total: 851.93 kB
270
- ✔ Build complete in 6104ms
269
+ ℹ [ESM] 144 files, total: 852.43 kB
270
+ ✔ Build complete in 6325ms
@@ -1 +1 @@
1
- {"version":3,"file":"Presence.d.mts","names":[],"sources":["../src/Presence.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAeiB;;;mBAGE,MAAA,CAAO,OAAO;;EAHhB,SAAA,KAAQ,EAKP,KALO;;;;;AAWR,UAAA,eAAe,CAAA,KAAA,CAEC,CAAA;EAMrB;EAKA,SAAA,MAAW,EAXJ,MAAA,CAAO,MAWA,CAXO,KAWC,CAAA;AASlC;AA8BA;;;AAAwE,KA5C5D,KA4C4D,CAAA,UA5C5C,QA4C4C,CAAA,GAAA,CAAA,CAAA,GA5C3B,CA4C2B,CAAA,OAAA,CAAA;;;AAmBxE;AACqB,KA3DT,WAAA,GAAc,QA2DL,CAAA,GAAA,CAAA;;;;AAcR,UAhEI,aAyEhB,CAAA,QAAA,OAAA,CAAA,CAAA;EARoB;EAAT,SAAA,IAAA,EA/DK,KA+DL;EAET;EAAK,SAAA,MAAA,CAAA,EAAA,MAAA;AAeR;;;;;;;;;;;;;;;;;;;;cApDa,uBAAyB,gBAAgB,WAAS,SAAS;;;;;;;;;;cAmB3D,4BACD,SAAS,0BAElB;;;;;;;;;cAYU,gCACD,SAAS,0BAElB;;;;;;;;cAeU,2BACD,SAAS,kCAEV"}
1
+ {"version":3,"file":"Presence.d.mts","names":[],"sources":["../src/Presence.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAeiB;;;mBAGE,MAAA,CAAO,OAAO;;EAHhB,SAAA,KAAQ,EAKP,KALO;;;;;AAWR,UAAA,eAAe,CAAA,KAAA,CAAA,CAEC;EAMrB;EAKA,SAAA,MAAW,EAXJ,MAAA,CAAO,MAWA,CAXO,KAWC,CAAA;AASlC;AA8BA;;;AAAwE,KA5C5D,KA4C4D,CAAA,UA5C5C,QA4C4C,CAAA,GAAA,CAAA,CAAA,GA5C3B,CA4C2B,CAAA,OAAA,CAAA;;;AAmBxE;AACqB,KA3DT,WAAA,GAAc,QA2DL,CAAA,GAAA,CAAA;;;;AAcR,UAhEI,aAyEhB,CAAA,QAAA,OAAA,CAAA,CAAA;EARoB;EAAT,SAAA,IAAA,EA/DK,KA+DL;EAET;EAAK,SAAA,MAAA,CAAA,EAAA,MAAA;AAeR;;;;;;;;;;;;;;;;;;;;cApDa,uBAAyB,gBAAgB,WAAS,SAAS;;;;;;;;;;cAmB3D,4BACD,SAAS,0BAElB;;;;;;;;;cAYU,gCACD,SAAS,0BAElB;;;;;;;;cAeU,2BACD,SAAS,kCAEV"}
@@ -8,8 +8,11 @@ var ServerDocument_exports = /* @__PURE__ */ require_rolldown_runtime.__export({
8
8
  * Creates a new ServerDocument for the given schema.
9
9
  */
10
10
  const make = (options) => {
11
- const { schema, initialState, initialVersion = 0, onBroadcast, onRejection, maxTransactionHistory = 1e3 } = options;
12
- let _document = require_Document.make(schema, { initial: initialState });
11
+ const { schema, initial, initialState, initialVersion = 0, onBroadcast, onRejection, maxTransactionHistory = 1e3 } = options;
12
+ let _document = require_Document.make(schema, {
13
+ initial,
14
+ initialState
15
+ });
13
16
  let _version = initialVersion;
14
17
  const _processedTransactions = /* @__PURE__ */ new Set();
15
18
  const _transactionOrder = [];
@@ -61,8 +61,13 @@ type ValidateResult = {
61
61
  interface ServerDocumentOptions<TSchema extends AnyPrimitive> {
62
62
  /** The schema defining the document structure */
63
63
  readonly schema: TSchema;
64
- /** Initial value (optional, will use schema defaults if not provided) - uses set input format */
65
- readonly initialState?: InferSetInput<TSchema>;
64
+ /** Initial value for new documents (uses set input format, gets converted to state) */
65
+ readonly initial?: InferSetInput<TSchema>;
66
+ /**
67
+ * Raw initial state (already in internal state format).
68
+ * Use this when restoring from storage. Takes precedence over `initial`.
69
+ */
70
+ readonly initialState?: InferState<TSchema>;
66
71
  /** Initial version number (optional, defaults to 0) */
67
72
  readonly initialVersion?: number;
68
73
  /** Called when a transaction is successfully applied and should be broadcast */
@@ -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;;;;AAI0B,KAhCd,aAAA,GAAgB,kBAgCF,GAhCuB,YAgCvB,GAhCsC,eAgCtC;;;AAc1B;AAAgD,KArCpC,YAAA,GAqCoC;EAE7B,SAAA,OAAA,EAAA,IAAA;EAGW,SAAA,OAAA,EAAA,MAAA;CAArB,GAAA;EAee,SAAA,OAAA,EAAA,KAAA;EAA0B,SAAA,MAAA,EAAA,MAAA;CAS7B;;;;;AAiCR,KA3FD,cAAA,GAyRX;EA9LoC,SAAA,KAAA,EAAA,IAAA;EACJ,SAAA,WAAA,EAAA,MAAA;CAAtB,GAAA;EACO,SAAA,KAAA,EAAA,KAAA;EAAf,SAAA,MAAA,EAAA,MAAA;CAAc;;;;UAlFA,sCAAsC;;mBAEpC;;0BAEO,cAAwB;;;;kCAIhB;;;;;;;;;UAUjB,+BAA+B;;mBAE7B;;SAGV,WAAqB;;;;;;;;;;;;;wBAeN,cAA0B;;;;;;;;qBAS7B;;;;;;;;;;sBAWC,cAA0B;;;;;iBAM/B;;;;;;;;;;cAgBJ,uBAAwB,uBAC1B,sBAAsB,aAC9B,eAAe"}
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;CAee;;;;;AA0BP,KAhFL,cAAA,GAgFK;EAAe,SAAA,KAAA,EAAA,IAAA;EAgBnB,SAgMZ,WAAA,EAAA,MAAA;CAhMoC,GAAA;EACJ,SAAA,KAAA,EAAA,KAAA;EAAtB,SAAA,MAAA,EAAA,MAAA;CACO;;;;UAvFD,sCAAsC;;mBAEpC;;qBAEE,cAAwB;;;;;0BAKnB,WAAqB;;;;kCAIb;;;;;;;;;UAUjB,+BAA+B;;mBAE7B;;SAGV,WAAqB;;;;;;;;;;;;;wBAeN,cAA0B;;;;;;;;qBAS7B;;;;;;;;;;sBAWC,cAA0B;;;;;iBAM/B;;;;;;;;;;cAgBJ,uBAAwB,uBAC1B,sBAAsB,aAC9B,eAAe"}
@@ -62,8 +62,13 @@ type ValidateResult = {
62
62
  interface ServerDocumentOptions<TSchema extends AnyPrimitive> {
63
63
  /** The schema defining the document structure */
64
64
  readonly schema: TSchema;
65
- /** Initial value (optional, will use schema defaults if not provided) - uses set input format */
66
- readonly initialState?: InferSetInput<TSchema>;
65
+ /** Initial value for new documents (uses set input format, gets converted to state) */
66
+ readonly initial?: InferSetInput<TSchema>;
67
+ /**
68
+ * Raw initial state (already in internal state format).
69
+ * Use this when restoring from storage. Takes precedence over `initial`.
70
+ */
71
+ readonly initialState?: InferState<TSchema>;
67
72
  /** Initial version number (optional, defaults to 0) */
68
73
  readonly initialVersion?: number;
69
74
  /** Called when a transaction is successfully applied and should be broadcast */
@@ -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;;;AAIkD,KAhCtC,aAAA,GAAgB,kBAgCsB,GAhCD,YAgCC,GAhCc,eAgCd;;;;AAcjC,KArCL,YAAA,GAqCmB;EAAiB,SAAA,OAAA,EAAA,IAAA;EAE7B,SAAA,OAAA,EAAA,MAAA;CAGW,GAAA;EAArB,SAAA,OAAA,EAAA,KAAA;EAee,SAAA,MAAA,EAAA,MAAA;CAA0B;;;;;AA0BlB,KA3EpB,cAAA,GA2EoB;EAgBnB,SA8LZ,KAAA,EAAA,IAAA;EA9LoC,SAAA,WAAA,EAAA,MAAA;CACJ,GAAA;EAAtB,SAAA,KAAA,EAAA,KAAA;EACO,SAAA,MAAA,EAAA,MAAA;CAAf;;;;UAlFc,sCAAsC;;mBAEpC;;0BAEO,cAAwB;;;;kCAIhB;;;;;;;;;UAUjB,+BAA+B;;mBAE7B;;SAGV,WAAqB;;;;;;;;;;;;;wBAeN,cAA0B;;;;;;;;qBAS7B;;;;;;;;;;sBAWC,cAA0B;;;;;iBAM/B;;;;;;;;;;cAgBJ,uBAAwB,uBAC1B,sBAAsB,aAC9B,eAAe"}
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;;;;;AAmCuC,KA1EpC,cAAA,GA0EoC;EAM/B,SAAA,KAAA,EAAA,IAAA;EAAe,SAAA,WAAA,EAAA,MAAA;AAgBhC,CAAA,GAAa;EAAwB,SAAA,KAAA,EAAA,KAAA;EACJ,SAAA,MAAA,EAAA,MAAA;CAAtB;;;;UAtFM,sCAAsC;;mBAEpC;;qBAEE,cAAwB;;;;;0BAKnB,WAAqB;;;;kCAIb;;;;;;;;;UAUjB,+BAA+B;;mBAE7B;;SAGV,WAAqB;;;;;;;;;;;;;wBAeN,cAA0B;;;;;;;;qBAS7B;;;;;;;;;;sBAWC,cAA0B;;;;;iBAM/B;;;;;;;;;;cAgBJ,uBAAwB,uBAC1B,sBAAsB,aAC9B,eAAe"}
@@ -8,8 +8,11 @@ var ServerDocument_exports = /* @__PURE__ */ __export({ make: () => make });
8
8
  * Creates a new ServerDocument for the given schema.
9
9
  */
10
10
  const make = (options) => {
11
- const { schema, initialState, initialVersion = 0, onBroadcast, onRejection, maxTransactionHistory = 1e3 } = options;
12
- let _document = make$1(schema, { initial: initialState });
11
+ const { schema, initial, initialState, initialVersion = 0, onBroadcast, onRejection, maxTransactionHistory = 1e3 } = options;
12
+ let _document = make$1(schema, {
13
+ initial,
14
+ initialState
15
+ });
13
16
  let _version = initialVersion;
14
17
  const _processedTransactions = /* @__PURE__ */ new Set();
15
18
  const _transactionOrder = [];
@@ -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 (optional, will use schema defaults if not provided) - uses set input format */\n readonly initialState?: Primitive.InferSetInput<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 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 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":";;;;;;;;;AAmJA,MAAa,QACX,YAC4B;CAC5B,MAAM,EACJ,QACA,cACA,iBAAiB,GACjB,aACA,aACA,wBAAwB,QACtB;CAOJ,IAAI,YAAYA,OAAc,QAAQ,EAAE,SAAS,cAAc,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 /** 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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voidhash/mimic",
3
- "version": "1.0.0-beta.7",
3
+ "version": "1.0.0-beta.9",
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.7"
34
+ "@voidhash/tsconfig": "1.0.0-beta.9"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "effect": "^3.19.12"
@@ -68,8 +68,13 @@ export type ValidateResult =
68
68
  export interface ServerDocumentOptions<TSchema extends Primitive.AnyPrimitive> {
69
69
  /** The schema defining the document structure */
70
70
  readonly schema: TSchema;
71
- /** Initial value (optional, will use schema defaults if not provided) - uses set input format */
72
- readonly initialState?: Primitive.InferSetInput<TSchema>;
71
+ /** Initial value for new documents (uses set input format, gets converted to state) */
72
+ readonly initial?: Primitive.InferSetInput<TSchema>;
73
+ /**
74
+ * Raw initial state (already in internal state format).
75
+ * Use this when restoring from storage. Takes precedence over `initial`.
76
+ */
77
+ readonly initialState?: Primitive.InferState<TSchema>;
73
78
  /** Initial version number (optional, defaults to 0) */
74
79
  readonly initialVersion?: number;
75
80
  /** Called when a transaction is successfully applied and should be broadcast */
@@ -150,6 +155,7 @@ export const make = <TSchema extends Primitive.AnyPrimitive>(
150
155
  ): ServerDocument<TSchema> => {
151
156
  const {
152
157
  schema,
158
+ initial,
153
159
  initialState,
154
160
  initialVersion = 0,
155
161
  onBroadcast,
@@ -162,7 +168,8 @@ export const make = <TSchema extends Primitive.AnyPrimitive>(
162
168
  // ==========================================================================
163
169
 
164
170
  // The authoritative document
165
- let _document = Document.make(schema, { initial: initialState });
171
+ // initialState (raw) takes precedence over initial (needs conversion)
172
+ let _document = Document.make(schema, { initial, initialState });
166
173
 
167
174
  // Current version number (incremented on each successful transaction)
168
175
  let _version = initialVersion;