@voidhash/mimic-effect 0.0.3 → 0.0.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.
- package/.turbo/turbo-build.log +24 -24
- package/dist/DocumentManager.cjs +3 -3
- package/dist/DocumentManager.d.cts +2 -2
- package/dist/DocumentManager.mjs +2 -2
- package/dist/DocumentManager.mjs.map +1 -1
- package/dist/MimicAuthService.d.cts +1 -1
- package/dist/MimicConfig.cjs +3 -1
- package/dist/MimicConfig.d.cts +17 -1
- package/dist/MimicConfig.d.cts.map +1 -1
- package/dist/MimicConfig.d.mts +16 -0
- package/dist/MimicConfig.d.mts.map +1 -1
- package/dist/MimicConfig.mjs +3 -1
- package/dist/MimicConfig.mjs.map +1 -1
- package/dist/MimicDataStorage.d.cts +1 -1
- package/dist/MimicServer.cjs +3 -111
- package/dist/MimicServer.d.cts +11 -97
- package/dist/MimicServer.d.cts.map +1 -1
- package/dist/MimicServer.d.mts +11 -97
- package/dist/MimicServer.d.mts.map +1 -1
- package/dist/MimicServer.mjs +10 -117
- package/dist/MimicServer.mjs.map +1 -1
- package/dist/PresenceManager.cjs +2 -2
- package/dist/PresenceManager.d.cts +1 -1
- package/dist/PresenceManager.mjs +1 -1
- package/dist/WebSocketHandler.cjs +2 -3
- package/dist/WebSocketHandler.d.cts +1 -1
- package/dist/WebSocketHandler.d.mts +1 -1
- package/dist/WebSocketHandler.mjs +2 -2
- package/package.json +3 -3
- package/src/DocumentManager.ts +2 -2
- package/src/MimicConfig.ts +22 -1
- package/src/MimicServer.ts +11 -161
- package/tests/DocumentManager.test.ts +61 -0
- package/tests/MimicConfig.test.ts +72 -0
- package/tests/MimicServer.test.ts +55 -162
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @voidhash/mimic-effect@0.0.
|
|
2
|
+
> @voidhash/mimic-effect@0.0.4 build /home/runner/work/mimic/mimic/packages/mimic-effect
|
|
3
3
|
> tsdown
|
|
4
4
|
|
|
5
5
|
[34mℹ[39m tsdown [2mv0.18.2[22m powered by rolldown [2mv1.0.0-beta.55[22m
|
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
10
|
[34mℹ[39m Build start
|
|
11
11
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m 2.79 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
12
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mWebSocketHandler.cjs [2m13.
|
|
13
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicServer.cjs [
|
|
14
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mDocumentManager.cjs [2m 4.
|
|
12
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mWebSocketHandler.cjs [2m13.83 kB[22m [2m│ gzip: 2.46 kB[22m
|
|
13
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicServer.cjs [2m 5.93 kB[22m [2m│ gzip: 1.78 kB[22m
|
|
14
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mDocumentManager.cjs [2m 4.69 kB[22m [2m│ gzip: 1.38 kB[22m
|
|
15
15
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mPresenceManager.cjs [2m 4.25 kB[22m [2m│ gzip: 1.19 kB[22m
|
|
16
16
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicDataStorage.cjs [2m 3.13 kB[22m [2m│ gzip: 0.96 kB[22m
|
|
17
17
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mDocumentProtocol.cjs [2m 2.85 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
18
18
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22merrors.cjs [2m 2.33 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
19
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicConfig.cjs [2m 2.32 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
19
20
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mstorage/InMemoryDataStorage.cjs [2m 2.21 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
20
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicConfig.cjs [2m 2.15 kB[22m [2m│ gzip: 0.74 kB[22m
|
|
21
21
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicAuthService.cjs [2m 2.12 kB[22m [2m│ gzip: 0.69 kB[22m
|
|
22
22
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mauth/NoAuth.cjs [2m 1.52 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
23
23
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m_virtual/rolldown_runtime.cjs [2m 1.31 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
@@ -26,41 +26,41 @@
|
|
|
26
26
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs [2m 0.52 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
27
27
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs [2m 0.40 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
28
28
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs [2m 0.37 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
29
|
-
[34mℹ[39m [33m[CJS][39m 18 files, total:
|
|
29
|
+
[34mℹ[39m [33m[CJS][39m 18 files, total: 52.04 kB
|
|
30
30
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicDataStorage.d.cts.map [2m1.96 kB[22m [2m│ gzip: 0.73 kB[22m
|
|
31
31
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mDocumentProtocol.d.cts.map [2m1.35 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
32
32
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicAuthService.d.cts.map [2m0.97 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
33
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[
|
|
34
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicConfig.d.cts.map [2m0.77 kB[22m [2m│ gzip: 0.41 kB[22m
|
|
33
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicConfig.d.cts.map [2m0.88 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
35
34
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22merrors.d.cts.map [2m0.77 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
36
35
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mWebSocketHandler.d.cts.map [2m0.74 kB[22m [2m│ gzip: 0.35 kB[22m
|
|
37
36
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mPresenceManager.d.cts.map [2m0.69 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
37
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mMimicServer.d.cts.map [2m0.63 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
38
38
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mDocumentManager.d.cts.map [2m0.52 kB[22m [2m│ gzip: 0.29 kB[22m
|
|
39
39
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mstorage/InMemoryDataStorage.d.cts.map [2m0.26 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
40
40
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mauth/NoAuth.d.cts.map [2m0.22 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
41
41
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m1.52 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
42
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mMimicServer.d.cts[39m [2m7.24 kB[22m [2m│ gzip: 2.01 kB[22m
|
|
43
42
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mMimicDataStorage.d.cts[39m [2m4.84 kB[22m [2m│ gzip: 1.19 kB[22m
|
|
43
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mMimicConfig.d.cts[39m [2m4.11 kB[22m [2m│ gzip: 1.11 kB[22m
|
|
44
44
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32merrors.d.cts[39m [2m4.08 kB[22m [2m│ gzip: 0.75 kB[22m
|
|
45
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mMimicServer.d.cts[39m [2m4.00 kB[22m [2m│ gzip: 1.47 kB[22m
|
|
45
46
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mDocumentProtocol.d.cts[39m [2m3.78 kB[22m [2m│ gzip: 0.78 kB[22m
|
|
46
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mMimicConfig.d.cts[39m [2m3.47 kB[22m [2m│ gzip: 0.94 kB[22m
|
|
47
47
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mPresenceManager.d.cts[39m [2m3.00 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
48
48
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mMimicAuthService.d.cts[39m [2m2.38 kB[22m [2m│ gzip: 0.77 kB[22m
|
|
49
49
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mDocumentManager.d.cts[39m [2m1.77 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
50
50
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mWebSocketHandler.d.cts[39m [2m1.73 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
51
51
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mauth/NoAuth.d.cts[39m [2m0.72 kB[22m [2m│ gzip: 0.40 kB[22m
|
|
52
52
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mstorage/InMemoryDataStorage.d.cts[39m [2m0.65 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
53
|
-
[34mℹ[39m [33m[CJS][39m 23 files, total:
|
|
54
|
-
[32m✔[39m Build complete in [
|
|
53
|
+
[34mℹ[39m [33m[CJS][39m 23 files, total: 41.59 kB
|
|
54
|
+
[32m✔[39m Build complete in [32m6093ms[39m
|
|
55
55
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m 1.45 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
56
56
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mWebSocketHandler.mjs.map [2m29.74 kB[22m [2m│ gzip: 5.00 kB[22m
|
|
57
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[
|
|
58
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mWebSocketHandler.mjs [2m12.38 kB[22m [2m│ gzip: 2.34 kB[22m
|
|
57
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mWebSocketHandler.mjs [2m12.36 kB[22m [2m│ gzip: 2.34 kB[22m
|
|
59
58
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mPresenceManager.mjs.map [2m10.45 kB[22m [2m│ gzip: 2.54 kB[22m
|
|
60
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentManager.mjs.map [2m 9.
|
|
61
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicServer.mjs
|
|
59
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentManager.mjs.map [2m 9.84 kB[22m [2m│ gzip: 2.81 kB[22m
|
|
60
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicServer.mjs.map [2m 9.65 kB[22m [2m│ gzip: 3.00 kB[22m
|
|
62
61
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicDataStorage.mjs.map [2m 6.27 kB[22m [2m│ gzip: 1.55 kB[22m
|
|
63
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicConfig.mjs.map [2m
|
|
62
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicConfig.mjs.map [2m 5.48 kB[22m [2m│ gzip: 1.50 kB[22m
|
|
63
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicServer.mjs [2m 5.12 kB[22m [2m│ gzip: 1.69 kB[22m
|
|
64
64
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicAuthService.mjs.map [2m 4.09 kB[22m [2m│ gzip: 1.10 kB[22m
|
|
65
65
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentProtocol.mjs.map [2m 4.07 kB[22m [2m│ gzip: 1.01 kB[22m
|
|
66
66
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentManager.mjs [2m 3.75 kB[22m [2m│ gzip: 1.25 kB[22m
|
|
@@ -71,19 +71,19 @@
|
|
|
71
71
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentProtocol.mjs [2m 2.44 kB[22m [2m│ gzip: 0.73 kB[22m
|
|
72
72
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicDataStorage.d.mts.map [2m 1.96 kB[22m [2m│ gzip: 0.73 kB[22m
|
|
73
73
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22merrors.mjs [2m 1.95 kB[22m [2m│ gzip: 0.57 kB[22m
|
|
74
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicConfig.mjs [2m 1.90 kB[22m [2m│ gzip: 0.70 kB[22m
|
|
74
75
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mauth/NoAuth.mjs.map [2m 1.82 kB[22m [2m│ gzip: 0.68 kB[22m
|
|
75
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicConfig.mjs [2m 1.75 kB[22m [2m│ gzip: 0.65 kB[22m
|
|
76
76
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicAuthService.mjs [2m 1.74 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
77
77
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mstorage/InMemoryDataStorage.mjs [2m 1.68 kB[22m [2m│ gzip: 0.71 kB[22m
|
|
78
78
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentProtocol.d.mts.map [2m 1.35 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
79
79
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mauth/NoAuth.mjs [2m 1.21 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
80
80
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicAuthService.d.mts.map [2m 0.97 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
81
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicServer.d.mts.map [2m 0.95 kB[22m [2m│ gzip: 0.43 kB[22m
|
|
82
81
|
[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
|
|
83
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicConfig.d.mts.map [2m 0.
|
|
82
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicConfig.d.mts.map [2m 0.88 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
84
83
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22merrors.d.mts.map [2m 0.77 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
85
84
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mWebSocketHandler.d.mts.map [2m 0.74 kB[22m [2m│ gzip: 0.35 kB[22m
|
|
86
85
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mPresenceManager.d.mts.map [2m 0.69 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
86
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mMimicServer.d.mts.map [2m 0.63 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
87
87
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mDocumentManager.d.mts.map [2m 0.52 kB[22m [2m│ gzip: 0.29 kB[22m
|
|
88
88
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs [2m 0.47 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
89
89
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs [2m 0.43 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
@@ -93,16 +93,16 @@
|
|
|
93
93
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mstorage/InMemoryDataStorage.d.mts.map [2m 0.26 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
94
94
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mauth/NoAuth.d.mts.map [2m 0.22 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
95
95
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m 1.52 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
96
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mMimicServer.d.mts[39m [2m 7.24 kB[22m [2m│ gzip: 2.01 kB[22m
|
|
97
96
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mMimicDataStorage.d.mts[39m [2m 4.84 kB[22m [2m│ gzip: 1.19 kB[22m
|
|
97
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mMimicConfig.d.mts[39m [2m 4.11 kB[22m [2m│ gzip: 1.11 kB[22m
|
|
98
98
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32merrors.d.mts[39m [2m 4.08 kB[22m [2m│ gzip: 0.75 kB[22m
|
|
99
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mMimicServer.d.mts[39m [2m 4.00 kB[22m [2m│ gzip: 1.47 kB[22m
|
|
99
100
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mDocumentProtocol.d.mts[39m [2m 3.78 kB[22m [2m│ gzip: 0.78 kB[22m
|
|
100
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mMimicConfig.d.mts[39m [2m 3.47 kB[22m [2m│ gzip: 0.94 kB[22m
|
|
101
101
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mPresenceManager.d.mts[39m [2m 3.00 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
102
102
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mMimicAuthService.d.mts[39m [2m 2.38 kB[22m [2m│ gzip: 0.77 kB[22m
|
|
103
103
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mDocumentManager.d.mts[39m [2m 1.77 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
104
104
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mWebSocketHandler.d.mts[39m [2m 1.73 kB[22m [2m│ gzip: 0.63 kB[22m
|
|
105
105
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mauth/NoAuth.d.mts[39m [2m 0.72 kB[22m [2m│ gzip: 0.40 kB[22m
|
|
106
106
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mstorage/InMemoryDataStorage.d.mts[39m [2m 0.65 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
107
|
-
[34mℹ[39m [34m[ESM][39m 52 files, total:
|
|
108
|
-
[32m✔[39m Build complete in [
|
|
107
|
+
[34mℹ[39m [34m[ESM][39m 52 files, total: 171.79 kB
|
|
108
|
+
[32m✔[39m Build complete in [32m6104ms[39m
|
package/dist/DocumentManager.cjs
CHANGED
|
@@ -5,14 +5,14 @@ let effect_Effect = require("effect/Effect");
|
|
|
5
5
|
effect_Effect = require_rolldown_runtime.__toESM(effect_Effect);
|
|
6
6
|
let effect_Layer = require("effect/Layer");
|
|
7
7
|
effect_Layer = require_rolldown_runtime.__toESM(effect_Layer);
|
|
8
|
-
let effect_Context = require("effect/Context");
|
|
9
|
-
effect_Context = require_rolldown_runtime.__toESM(effect_Context);
|
|
10
8
|
let effect_PubSub = require("effect/PubSub");
|
|
11
9
|
effect_PubSub = require_rolldown_runtime.__toESM(effect_PubSub);
|
|
12
10
|
let effect_Ref = require("effect/Ref");
|
|
13
11
|
effect_Ref = require_rolldown_runtime.__toESM(effect_Ref);
|
|
14
12
|
let effect_HashMap = require("effect/HashMap");
|
|
15
13
|
effect_HashMap = require_rolldown_runtime.__toESM(effect_HashMap);
|
|
14
|
+
let effect_Context = require("effect/Context");
|
|
15
|
+
effect_Context = require_rolldown_runtime.__toESM(effect_Context);
|
|
16
16
|
let effect_Stream = require("effect/Stream");
|
|
17
17
|
effect_Stream = require_rolldown_runtime.__toESM(effect_Stream);
|
|
18
18
|
let _voidhash_mimic_server = require("@voidhash/mimic/server");
|
|
@@ -45,7 +45,7 @@ const makeDocumentManager = effect_Effect.gen(function* () {
|
|
|
45
45
|
return existing.value;
|
|
46
46
|
}
|
|
47
47
|
const rawState = yield* effect_Effect.catchAll(storage.load(documentId), () => effect_Effect.succeed(void 0));
|
|
48
|
-
const initialState = rawState !== void 0 ? yield* storage.onLoad(rawState) :
|
|
48
|
+
const initialState = rawState !== void 0 ? yield* storage.onLoad(rawState) : config.initial;
|
|
49
49
|
const pubsub = yield* effect_PubSub.unbounded();
|
|
50
50
|
const serverDocument = _voidhash_mimic_server.ServerDocument.make({
|
|
51
51
|
schema: config.schema,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ServerBroadcast, SnapshotMessage, SubmitResult } from "./DocumentProtocol.cjs";
|
|
2
2
|
import { MimicServerConfigTag } from "./MimicConfig.cjs";
|
|
3
3
|
import { MimicDataStorageTag } from "./MimicDataStorage.cjs";
|
|
4
|
-
import * as Effect from "effect/Effect";
|
|
5
4
|
import * as Layer from "effect/Layer";
|
|
6
|
-
import * as Context from "effect/Context";
|
|
7
5
|
import { Transaction } from "@voidhash/mimic";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Context from "effect/Context";
|
|
8
8
|
import * as Scope from "effect/Scope";
|
|
9
9
|
import * as Stream from "effect/Stream";
|
|
10
10
|
|
package/dist/DocumentManager.mjs
CHANGED
|
@@ -3,10 +3,10 @@ import { MimicServerConfigTag } from "./MimicConfig.mjs";
|
|
|
3
3
|
import { MimicDataStorageTag } from "./MimicDataStorage.mjs";
|
|
4
4
|
import * as Effect from "effect/Effect";
|
|
5
5
|
import * as Layer from "effect/Layer";
|
|
6
|
-
import * as Context from "effect/Context";
|
|
7
6
|
import * as PubSub from "effect/PubSub";
|
|
8
7
|
import * as Ref from "effect/Ref";
|
|
9
8
|
import * as HashMap from "effect/HashMap";
|
|
9
|
+
import * as Context from "effect/Context";
|
|
10
10
|
import * as Stream from "effect/Stream";
|
|
11
11
|
import { ServerDocument } from "@voidhash/mimic/server";
|
|
12
12
|
|
|
@@ -38,7 +38,7 @@ const makeDocumentManager = Effect.gen(function* () {
|
|
|
38
38
|
return existing.value;
|
|
39
39
|
}
|
|
40
40
|
const rawState = yield* Effect.catchAll(storage.load(documentId), () => Effect.succeed(void 0));
|
|
41
|
-
const initialState = rawState !== void 0 ? yield* storage.onLoad(rawState) :
|
|
41
|
+
const initialState = rawState !== void 0 ? yield* storage.onLoad(rawState) : config.initial;
|
|
42
42
|
const pubsub = yield* PubSub.unbounded();
|
|
43
43
|
const serverDocument = ServerDocument.make({
|
|
44
44
|
schema: config.schema,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentManager.mjs","names":["instance: DocumentInstance","layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n>"],"sources":["../src/DocumentManager.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Document manager that handles multiple document instances.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PubSub from \"effect/PubSub\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Context from \"effect/Context\";\nimport * as Scope from \"effect/Scope\";\nimport * as Stream from \"effect/Stream\";\nimport type { Primitive, Transaction } from \"@voidhash/mimic\";\nimport { ServerDocument } from \"@voidhash/mimic/server\";\n\nimport * as Protocol from \"./DocumentProtocol.js\";\nimport { MimicServerConfigTag } from \"./MimicConfig.js\";\nimport { MimicDataStorageTag } from \"./MimicDataStorage.js\";\nimport { DocumentNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Document Instance\n// =============================================================================\n\n/**\n * A managed document instance that holds state and manages subscribers.\n */\ninterface DocumentInstance {\n /** The underlying ServerDocument */\n readonly document: ServerDocument.ServerDocument<Primitive.AnyPrimitive>;\n /** PubSub for broadcasting messages to subscribers */\n readonly pubsub: PubSub.PubSub<Protocol.ServerBroadcast>;\n /** Reference count for cleanup */\n readonly refCount: Ref.Ref<number>;\n}\n\n// =============================================================================\n// Document Manager Service\n// =============================================================================\n\n/**\n * Service interface for the DocumentManager.\n */\nexport interface DocumentManager {\n /**\n * Submit a transaction to a document.\n */\n readonly submit: (\n documentId: string,\n transaction: Transaction.Transaction\n ) => Effect.Effect<Protocol.SubmitResult>;\n\n /**\n * Get a snapshot of a document.\n */\n readonly getSnapshot: (\n documentId: string\n ) => Effect.Effect<Protocol.SnapshotMessage>;\n\n /**\n * Subscribe to broadcasts for a document.\n * Returns a Stream of server broadcasts.\n */\n readonly subscribe: (\n documentId: string\n ) => Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n >;\n}\n\n/**\n * Context tag for DocumentManager.\n */\nexport class DocumentManagerTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/DocumentManager\"\n)<DocumentManagerTag, DocumentManager>() {}\n\n// =============================================================================\n// Document Manager Implementation\n// =============================================================================\n\n/**\n * Create the DocumentManager service.\n */\nconst makeDocumentManager = Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const storage = yield* MimicDataStorageTag;\n \n // Map of document ID to document instance\n const documents = yield* Ref.make(\n HashMap.empty<string, DocumentInstance>()\n );\n\n // Get or create a document instance\n const getOrCreateDocument = (\n documentId: string\n ): Effect.Effect<DocumentInstance> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"Some\") {\n // Increment ref count\n yield* Ref.update(existing.value.refCount, (n) => n + 1);\n return existing.value;\n }\n\n // Load initial state from storage\n const rawState = yield* Effect.catchAll(\n storage.load(documentId),\n () => Effect.succeed(undefined)\n );\n\n // Transform loaded state with onLoad hook\n const initialState = rawState !== undefined\n ? yield* storage.onLoad(rawState)\n :
|
|
1
|
+
{"version":3,"file":"DocumentManager.mjs","names":["instance: DocumentInstance","layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n>"],"sources":["../src/DocumentManager.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Document manager that handles multiple document instances.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PubSub from \"effect/PubSub\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Context from \"effect/Context\";\nimport * as Scope from \"effect/Scope\";\nimport * as Stream from \"effect/Stream\";\nimport type { Primitive, Transaction } from \"@voidhash/mimic\";\nimport { ServerDocument } from \"@voidhash/mimic/server\";\n\nimport * as Protocol from \"./DocumentProtocol.js\";\nimport { MimicServerConfigTag } from \"./MimicConfig.js\";\nimport { MimicDataStorageTag } from \"./MimicDataStorage.js\";\nimport { DocumentNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Document Instance\n// =============================================================================\n\n/**\n * A managed document instance that holds state and manages subscribers.\n */\ninterface DocumentInstance {\n /** The underlying ServerDocument */\n readonly document: ServerDocument.ServerDocument<Primitive.AnyPrimitive>;\n /** PubSub for broadcasting messages to subscribers */\n readonly pubsub: PubSub.PubSub<Protocol.ServerBroadcast>;\n /** Reference count for cleanup */\n readonly refCount: Ref.Ref<number>;\n}\n\n// =============================================================================\n// Document Manager Service\n// =============================================================================\n\n/**\n * Service interface for the DocumentManager.\n */\nexport interface DocumentManager {\n /**\n * Submit a transaction to a document.\n */\n readonly submit: (\n documentId: string,\n transaction: Transaction.Transaction\n ) => Effect.Effect<Protocol.SubmitResult>;\n\n /**\n * Get a snapshot of a document.\n */\n readonly getSnapshot: (\n documentId: string\n ) => Effect.Effect<Protocol.SnapshotMessage>;\n\n /**\n * Subscribe to broadcasts for a document.\n * Returns a Stream of server broadcasts.\n */\n readonly subscribe: (\n documentId: string\n ) => Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n >;\n}\n\n/**\n * Context tag for DocumentManager.\n */\nexport class DocumentManagerTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/DocumentManager\"\n)<DocumentManagerTag, DocumentManager>() {}\n\n// =============================================================================\n// Document Manager Implementation\n// =============================================================================\n\n/**\n * Create the DocumentManager service.\n */\nconst makeDocumentManager = Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const storage = yield* MimicDataStorageTag;\n \n // Map of document ID to document instance\n const documents = yield* Ref.make(\n HashMap.empty<string, DocumentInstance>()\n );\n\n // Get or create a document instance\n const getOrCreateDocument = (\n documentId: string\n ): Effect.Effect<DocumentInstance> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"Some\") {\n // Increment ref count\n yield* Ref.update(existing.value.refCount, (n) => n + 1);\n return existing.value;\n }\n\n // Load initial state from storage\n const rawState = yield* Effect.catchAll(\n storage.load(documentId),\n () => Effect.succeed(undefined)\n );\n\n // Transform loaded state with onLoad hook, or use configured initial state for new docs\n const initialState = rawState !== undefined\n ? yield* storage.onLoad(rawState)\n : config.initial;\n\n // Create PubSub for broadcasting\n const pubsub = yield* PubSub.unbounded<Protocol.ServerBroadcast>();\n\n // Create ServerDocument with broadcast callback\n const serverDocument = ServerDocument.make({\n schema: config.schema,\n initialState: initialState as Primitive.InferState<typeof config.schema> | undefined,\n maxTransactionHistory: config.maxTransactionHistory,\n onBroadcast: (transactionMessage) => {\n // Get current state and save to storage\n const currentState = serverDocument.get();\n \n // Run save in background (fire-and-forget with error logging)\n Effect.runFork(\n Effect.gen(function* () {\n if (currentState !== undefined) {\n const transformedState = yield* storage.onSave(currentState);\n yield* Effect.catchAll(\n storage.save(documentId, transformedState),\n (error) => Effect.logError(\"Failed to save document\", error)\n );\n }\n })\n );\n\n // Broadcast to subscribers\n Effect.runSync(\n PubSub.publish(pubsub, {\n type: \"transaction\",\n transaction: transactionMessage.transaction as Protocol.Transaction,\n version: transactionMessage.version,\n })\n );\n },\n onRejection: (transactionId, reason) => {\n Effect.runSync(\n PubSub.publish(pubsub, {\n type: \"error\",\n transactionId,\n reason,\n })\n );\n },\n });\n\n const refCount = yield* Ref.make(1);\n\n const instance: DocumentInstance = {\n document: serverDocument,\n pubsub,\n refCount,\n };\n\n // Store in map\n yield* Ref.update(documents, (map) =>\n HashMap.set(map, documentId, instance)\n );\n\n return instance;\n });\n\n // Submit a transaction\n const submit = (\n documentId: string,\n transaction: Transaction.Transaction\n ): Effect.Effect<Protocol.SubmitResult> =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n const result = instance.document.submit(transaction);\n return result;\n });\n\n // Get a snapshot\n const getSnapshot = (\n documentId: string\n ): Effect.Effect<Protocol.SnapshotMessage> =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n const snapshot = instance.document.getSnapshot();\n return snapshot;\n });\n\n // Subscribe to broadcasts\n const subscribe = (\n documentId: string\n ): Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n > =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n\n // Subscribe to the PubSub\n const queue = yield* PubSub.subscribe(instance.pubsub);\n\n // Ensure cleanup on scope close\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Decrement ref count\n const count = yield* Ref.updateAndGet(\n instance.refCount,\n (n) => n - 1\n );\n\n // If no more subscribers, we could clean up the document\n // For now, we keep it alive (could add idle timeout)\n })\n );\n\n // Convert queue to stream\n return Stream.fromQueue(queue);\n });\n\n const manager: DocumentManager = {\n submit,\n getSnapshot,\n subscribe,\n };\n\n return manager;\n});\n\n/**\n * Layer that provides DocumentManager.\n * Requires MimicServerConfigTag and MimicDataStorageTag.\n */\nexport const layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n> = Layer.effect(DocumentManagerTag, makeDocumentManager);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2EA,IAAa,qBAAb,cAAwC,QAAQ,IAC9C,gDACD,EAAuC,CAAC;;;;AASzC,MAAM,sBAAsB,OAAO,IAAI,aAAa;CAClD,MAAM,SAAS,OAAO;CACtB,MAAM,UAAU,OAAO;CAGvB,MAAM,YAAY,OAAO,IAAI,KAC3B,QAAQ,OAAiC,CAC1C;CAGD,MAAM,uBACJ,eAEA,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,IAAI,IAAI,UAAU;EACzC,MAAM,WAAW,QAAQ,IAAI,SAAS,WAAW;AAEjD,MAAI,SAAS,SAAS,QAAQ;AAE5B,UAAO,IAAI,OAAO,SAAS,MAAM,WAAW,MAAM,IAAI,EAAE;AACxD,UAAO,SAAS;;EAIlB,MAAM,WAAW,OAAO,OAAO,SAC7B,QAAQ,KAAK,WAAW,QAClB,OAAO,QAAQ,OAAU,CAChC;EAGD,MAAM,eAAe,aAAa,SAC9B,OAAO,QAAQ,OAAO,SAAS,GAC/B,OAAO;EAGX,MAAM,SAAS,OAAO,OAAO,WAAqC;EAGlE,MAAM,iBAAiB,eAAe,KAAK;GACzC,QAAQ,OAAO;GACD;GACd,uBAAuB,OAAO;GAC9B,cAAc,uBAAuB;IAEnC,MAAM,eAAe,eAAe,KAAK;AAGzC,WAAO,QACL,OAAO,IAAI,aAAa;AACtB,SAAI,iBAAiB,QAAW;MAC9B,MAAM,mBAAmB,OAAO,QAAQ,OAAO,aAAa;AAC5D,aAAO,OAAO,SACZ,QAAQ,KAAK,YAAY,iBAAiB,GACzC,UAAU,OAAO,SAAS,2BAA2B,MAAM,CAC7D;;MAEH,CACH;AAGD,WAAO,QACL,OAAO,QAAQ,QAAQ;KACrB,MAAM;KACN,aAAa,mBAAmB;KAChC,SAAS,mBAAmB;KAC7B,CAAC,CACH;;GAEH,cAAc,eAAe,WAAW;AACtC,WAAO,QACL,OAAO,QAAQ,QAAQ;KACrB,MAAM;KACN;KACA;KACD,CAAC,CACH;;GAEJ,CAAC;EAIF,MAAMA,WAA6B;GACjC,UAAU;GACV;GACA,UALe,OAAO,IAAI,KAAK,EAAE;GAMlC;AAGD,SAAO,IAAI,OAAO,YAAY,QAC5B,QAAQ,IAAI,KAAK,YAAY,SAAS,CACvC;AAED,SAAO;GACP;CAGJ,MAAM,UACJ,YACA,gBAEA,OAAO,IAAI,aAAa;AAGtB,UAFiB,OAAO,oBAAoB,WAAW,EAC/B,SAAS,OAAO,YAAY;GAEpD;CAGJ,MAAM,eACJ,eAEA,OAAO,IAAI,aAAa;AAGtB,UAFiB,OAAO,oBAAoB,WAAW,EAC7B,SAAS,aAAa;GAEhD;CAGJ,MAAM,aACJ,eAMA,OAAO,IAAI,aAAa;EACtB,MAAM,WAAW,OAAO,oBAAoB,WAAW;EAGvD,MAAM,QAAQ,OAAO,OAAO,UAAU,SAAS,OAAO;AAGtD,SAAO,OAAO,mBACZ,OAAO,IAAI,aAAa;AAER,UAAO,IAAI,aACvB,SAAS,WACR,MAAM,IAAI,EACZ;IAID,CACH;AAGD,SAAO,OAAO,UAAU,MAAM;GAC9B;AAQJ,QANiC;EAC/B;EACA;EACA;EACD;EAGD;;;;;AAMF,MAAaC,QAIT,MAAM,OAAO,oBAAoB,oBAAoB"}
|
package/dist/MimicConfig.cjs
CHANGED
|
@@ -5,6 +5,7 @@ let effect_Context = require("effect/Context");
|
|
|
5
5
|
effect_Context = require_rolldown_runtime.__toESM(effect_Context);
|
|
6
6
|
let effect_Duration = require("effect/Duration");
|
|
7
7
|
effect_Duration = require_rolldown_runtime.__toESM(effect_Duration);
|
|
8
|
+
let _voidhash_mimic = require("@voidhash/mimic");
|
|
8
9
|
|
|
9
10
|
//#region src/MimicConfig.ts
|
|
10
11
|
/**
|
|
@@ -27,7 +28,8 @@ const make = (options) => {
|
|
|
27
28
|
maxTransactionHistory: (_options$maxTransacti = options.maxTransactionHistory) !== null && _options$maxTransacti !== void 0 ? _options$maxTransacti : 1e3,
|
|
28
29
|
heartbeatInterval: effect_Duration.decode((_options$heartbeatInt = options.heartbeatInterval) !== null && _options$heartbeatInt !== void 0 ? _options$heartbeatInt : "30 seconds"),
|
|
29
30
|
heartbeatTimeout: effect_Duration.decode((_options$heartbeatTim = options.heartbeatTimeout) !== null && _options$heartbeatTim !== void 0 ? _options$heartbeatTim : "10 seconds"),
|
|
30
|
-
presence: options.presence
|
|
31
|
+
presence: options.presence,
|
|
32
|
+
initial: options.initial !== void 0 ? _voidhash_mimic.Primitive.applyDefaults(options.schema, options.initial) : void 0
|
|
31
33
|
};
|
|
32
34
|
};
|
|
33
35
|
/**
|
package/dist/MimicConfig.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Layer from "effect/Layer";
|
|
2
|
-
import * as Context from "effect/Context";
|
|
3
2
|
import { Presence, Primitive } from "@voidhash/mimic";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
4
4
|
import * as Duration from "effect/Duration";
|
|
5
5
|
import { DurationInput } from "effect/Duration";
|
|
6
6
|
|
|
@@ -45,6 +45,12 @@ interface MimicServerConfig<TSchema extends Primitive.AnyPrimitive = Primitive.A
|
|
|
45
45
|
* @default undefined (presence disabled)
|
|
46
46
|
*/
|
|
47
47
|
readonly presence: Presence.AnyPresence | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Initial state for new documents.
|
|
50
|
+
* Used when a document is created and no existing state is found in storage.
|
|
51
|
+
* @default undefined (documents start empty)
|
|
52
|
+
*/
|
|
53
|
+
readonly initial: Primitive.InferState<TSchema> | undefined;
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
56
|
* Options for creating a MimicServerConfig.
|
|
@@ -80,6 +86,16 @@ interface MimicServerConfigOptions<TSchema extends Primitive.AnyPrimitive = Prim
|
|
|
80
86
|
* @default undefined (presence disabled)
|
|
81
87
|
*/
|
|
82
88
|
readonly presence?: Presence.AnyPresence;
|
|
89
|
+
/**
|
|
90
|
+
* Initial state for new documents.
|
|
91
|
+
* Used when a document is created and no existing state is found in storage.
|
|
92
|
+
*
|
|
93
|
+
* Type-safe: required fields (without defaults) must be provided,
|
|
94
|
+
* while optional fields and fields with defaults can be omitted.
|
|
95
|
+
*
|
|
96
|
+
* @default undefined (documents start empty or use schema defaults)
|
|
97
|
+
*/
|
|
98
|
+
readonly initial?: Primitive.InferSetInput<TSchema>;
|
|
83
99
|
}
|
|
84
100
|
/**
|
|
85
101
|
* Create a MimicServerConfig from options.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MimicConfig.d.cts","names":[],"sources":["../src/MimicConfig.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;AAoBiB,UAAA,iBAAiB,CAAA,gBAAiB,SAAA,CAAU,YAA3B,GAA0C,SAAA,CAAU,YAApD,CAAA,CAAA;EAAiB;;;EAU3B,SAAS,MAAA,EANd,OAMc;EAYH;;;;
|
|
1
|
+
{"version":3,"file":"MimicConfig.d.cts","names":[],"sources":["../src/MimicConfig.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;AAoBiB,UAAA,iBAAiB,CAAA,gBAAiB,SAAA,CAAU,YAA3B,GAA0C,SAAA,CAAU,YAApD,CAAA,CAAA;EAAiB;;;EAU3B,SAAS,MAAA,EANd,OAMc;EAYH;;;;EAoBV,SAAU,WAAA,EAhCN,QAAA,CAAS,QAgCH;EAAU;AAMxC;;;EAImB,SAAA,qBAAA,EAAA,MAAA;EAMM;;;;EAoCoB,SAAA,iBAAA,EAxEf,QAAA,CAAS,QAwEM;EAAxB;;AAMrB;;EACoC,SAAA,gBAAA,EAzEP,QAAA,CAAS,QAyEF;EAAzB;;;;AAWR;qBA7EkB,QAAA,CAAS;;;;;AAsF9B;EAOa,SAGuC,OAAA,EAzFhC,SAAA,CAAU,UAyFsB,CAzFX,OAyFW,CAAA,GAAA,SAAA;;;;;AAD3C,UAlFQ,wBAkFR,CAAA,gBAlFiD,SAAA,CAAU,YAkF3D,GAlF0E,SAAA,CAAU,YAkFpF,CAAA,CAAA;EAAK;;;mBA9EK;;;;;yBAMM;;;;;;;;;;+BAYM;;;;;8BAMD;;;;;;sBAOR,QAAA,CAAS;;;;;;;;;;qBAWV,SAAA,CAAU,cAAc;;;;;cAMhC,uBAAwB,SAAA,CAAU,uBACpC,yBAAyB,aACjC,kBAAkB;cAUlB;;;;cASU,oBAAA,SAA6B,yBAAA;;;;cAO7B,wBAAyB,SAAA,CAAU,uBACrC,yBAAyB,aACjC,KAAA,CAAM,MAAM"}
|
package/dist/MimicConfig.d.mts
CHANGED
|
@@ -45,6 +45,12 @@ interface MimicServerConfig<TSchema extends Primitive.AnyPrimitive = Primitive.A
|
|
|
45
45
|
* @default undefined (presence disabled)
|
|
46
46
|
*/
|
|
47
47
|
readonly presence: Presence.AnyPresence | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Initial state for new documents.
|
|
50
|
+
* Used when a document is created and no existing state is found in storage.
|
|
51
|
+
* @default undefined (documents start empty)
|
|
52
|
+
*/
|
|
53
|
+
readonly initial: Primitive.InferState<TSchema> | undefined;
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
56
|
* Options for creating a MimicServerConfig.
|
|
@@ -80,6 +86,16 @@ interface MimicServerConfigOptions<TSchema extends Primitive.AnyPrimitive = Prim
|
|
|
80
86
|
* @default undefined (presence disabled)
|
|
81
87
|
*/
|
|
82
88
|
readonly presence?: Presence.AnyPresence;
|
|
89
|
+
/**
|
|
90
|
+
* Initial state for new documents.
|
|
91
|
+
* Used when a document is created and no existing state is found in storage.
|
|
92
|
+
*
|
|
93
|
+
* Type-safe: required fields (without defaults) must be provided,
|
|
94
|
+
* while optional fields and fields with defaults can be omitted.
|
|
95
|
+
*
|
|
96
|
+
* @default undefined (documents start empty or use schema defaults)
|
|
97
|
+
*/
|
|
98
|
+
readonly initial?: Primitive.InferSetInput<TSchema>;
|
|
83
99
|
}
|
|
84
100
|
/**
|
|
85
101
|
* Create a MimicServerConfig from options.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MimicConfig.d.mts","names":[],"sources":["../src/MimicConfig.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;AAoBiB,UAAA,iBAAiB,CAAA,gBAAiB,SAAA,CAAU,YAA3B,GAA0C,SAAA,CAAU,YAApD,CAAA,CAAA;EAAiB;;;EAU3B,SAAS,MAAA,EANd,OAMc;EAYH;;;;
|
|
1
|
+
{"version":3,"file":"MimicConfig.d.mts","names":[],"sources":["../src/MimicConfig.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;AAoBiB,UAAA,iBAAiB,CAAA,gBAAiB,SAAA,CAAU,YAA3B,GAA0C,SAAA,CAAU,YAApD,CAAA,CAAA;EAAiB;;;EAU3B,SAAS,MAAA,EANd,OAMc;EAYH;;;;EAoBV,SAAU,WAAA,EAhCN,QAAA,CAAS,QAgCH;EAAU;AAMxC;;;EAImB,SAAA,qBAAA,EAAA,MAAA;EAMM;;;;EAoCoB,SAAA,iBAAA,EAxEf,QAAA,CAAS,QAwEM;EAAxB;;AAMrB;;EACoC,SAAA,gBAAA,EAzEP,QAAA,CAAS,QAyEF;EAAzB;;;;AAWR;qBA7EkB,QAAA,CAAS;;;;;AAsF9B;EAOa,SAGuC,OAAA,EAzFhC,SAAA,CAAU,UAyFsB,CAzFX,OAyFW,CAAA,GAAA,SAAA;;;;;AAD3C,UAlFQ,wBAkFR,CAAA,gBAlFiD,SAAA,CAAU,YAkF3D,GAlF0E,SAAA,CAAU,YAkFpF,CAAA,CAAA;EAAK;;;mBA9EK;;;;;yBAMM;;;;;;;;;;+BAYM;;;;;8BAMD;;;;;;sBAOR,QAAA,CAAS;;;;;;;;;;qBAWV,SAAA,CAAU,cAAc;;;;;cAMhC,uBAAwB,SAAA,CAAU,uBACpC,yBAAyB,aACjC,kBAAkB;cAUlB;;;;cASU,oBAAA,SAA6B,yBAAA;;;;cAO7B,wBAAyB,SAAA,CAAU,uBACrC,yBAAyB,aACjC,KAAA,CAAM,MAAM"}
|
package/dist/MimicConfig.mjs
CHANGED
|
@@ -2,6 +2,7 @@ import { __export } from "./_virtual/rolldown_runtime.mjs";
|
|
|
2
2
|
import * as Layer from "effect/Layer";
|
|
3
3
|
import * as Context from "effect/Context";
|
|
4
4
|
import * as Duration from "effect/Duration";
|
|
5
|
+
import { Primitive } from "@voidhash/mimic";
|
|
5
6
|
|
|
6
7
|
//#region src/MimicConfig.ts
|
|
7
8
|
/**
|
|
@@ -24,7 +25,8 @@ const make = (options) => {
|
|
|
24
25
|
maxTransactionHistory: (_options$maxTransacti = options.maxTransactionHistory) !== null && _options$maxTransacti !== void 0 ? _options$maxTransacti : 1e3,
|
|
25
26
|
heartbeatInterval: Duration.decode((_options$heartbeatInt = options.heartbeatInterval) !== null && _options$heartbeatInt !== void 0 ? _options$heartbeatInt : "30 seconds"),
|
|
26
27
|
heartbeatTimeout: Duration.decode((_options$heartbeatTim = options.heartbeatTimeout) !== null && _options$heartbeatTim !== void 0 ? _options$heartbeatTim : "10 seconds"),
|
|
27
|
-
presence: options.presence
|
|
28
|
+
presence: options.presence,
|
|
29
|
+
initial: options.initial !== void 0 ? Primitive.applyDefaults(options.schema, options.initial) : void 0
|
|
28
30
|
};
|
|
29
31
|
};
|
|
30
32
|
/**
|
package/dist/MimicConfig.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MimicConfig.mjs","names":[],"sources":["../src/MimicConfig.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Configuration types for the Mimic server.\n */\nimport * as Context from \"effect/Context\";\nimport * as Duration from \"effect/Duration\";\nimport type { DurationInput } from \"effect/Duration\";\nimport * as Layer from \"effect/Layer\";\nimport
|
|
1
|
+
{"version":3,"file":"MimicConfig.mjs","names":[],"sources":["../src/MimicConfig.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Configuration types for the Mimic server.\n */\nimport * as Context from \"effect/Context\";\nimport * as Duration from \"effect/Duration\";\nimport type { DurationInput } from \"effect/Duration\";\nimport * as Layer from \"effect/Layer\";\nimport { Primitive, Presence } from \"@voidhash/mimic\";\n\n// =============================================================================\n// Mimic Server Configuration\n// =============================================================================\n\n/**\n * Configuration for the Mimic server.\n * \n * Note: Authentication and persistence are now handled by injectable services\n * (MimicAuthService and MimicDataStorage) rather than config options.\n */\nexport interface MimicServerConfig<TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive> {\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n\n /**\n * Maximum idle time for a document before it is cleaned up.\n * @default \"5 minutes\"\n */\n readonly maxIdleTime: Duration.Duration;\n\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory: number;\n\n /**\n * Heartbeat interval for WebSocket connections.\n * @default \"30 seconds\"\n */\n readonly heartbeatInterval: Duration.Duration;\n\n /**\n * Timeout for heartbeat responses before considering connection dead.\n * @default \"10 seconds\"\n */\n readonly heartbeatTimeout: Duration.Duration;\n\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n * @default undefined (presence disabled)\n */\n readonly presence: Presence.AnyPresence | undefined;\n\n /**\n * Initial state for new documents.\n * Used when a document is created and no existing state is found in storage.\n * @default undefined (documents start empty)\n */\n readonly initial: Primitive.InferState<TSchema> | undefined;\n}\n\n/**\n * Options for creating a MimicServerConfig.\n */\nexport interface MimicServerConfigOptions<TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive> {\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n\n /**\n * Maximum idle time for a document before it is cleaned up.\n * @default \"5 minutes\"\n */\n readonly maxIdleTime?: DurationInput;\n\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory?: number;\n\n /**\n * Heartbeat interval for WebSocket connections.\n * @default \"30 seconds\"\n */\n readonly heartbeatInterval?: DurationInput;\n\n /**\n * Timeout for heartbeat responses.\n * @default \"10 seconds\"\n */\n readonly heartbeatTimeout?: DurationInput;\n\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n * @default undefined (presence disabled)\n */\n readonly presence?: Presence.AnyPresence;\n\n /**\n * Initial state for new documents.\n * Used when a document is created and no existing state is found in storage.\n *\n * Type-safe: required fields (without defaults) must be provided,\n * while optional fields and fields with defaults can be omitted.\n *\n * @default undefined (documents start empty or use schema defaults)\n */\n readonly initial?: Primitive.InferSetInput<TSchema>;\n}\n\n/**\n * Create a MimicServerConfig from options.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicServerConfigOptions<TSchema>\n): MimicServerConfig<TSchema> => ({\n schema: options.schema,\n maxIdleTime: Duration.decode(options.maxIdleTime ?? \"5 minutes\"),\n maxTransactionHistory: options.maxTransactionHistory ?? 1000,\n heartbeatInterval: Duration.decode(options.heartbeatInterval ?? \"30 seconds\"),\n heartbeatTimeout: Duration.decode(options.heartbeatTimeout ?? \"10 seconds\"),\n presence: options.presence,\n initial: options.initial !== undefined\n ? Primitive.applyDefaults(options.schema, options.initial as Partial<Primitive.InferState<TSchema>>)\n : undefined,\n});\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicServerConfig.\n */\nexport class MimicServerConfigTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicServerConfig\"\n)<MimicServerConfigTag, MimicServerConfig>() {}\n\n/**\n * Create a Layer that provides MimicServerConfig.\n */\nexport const layer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicServerConfigOptions<TSchema>\n): Layer.Layer<MimicServerConfigTag> =>\n Layer.succeed(MimicServerConfigTag, make(options));\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwHA,MAAa,QACX,YAC+B;;QAAC;EAChC,QAAQ,QAAQ;EAChB,aAAa,SAAS,+BAAO,QAAQ,kFAAe,YAAY;EAChE,gDAAuB,QAAQ,8FAAyB;EACxD,mBAAmB,SAAS,gCAAO,QAAQ,0FAAqB,aAAa;EAC7E,kBAAkB,SAAS,gCAAO,QAAQ,yFAAoB,aAAa;EAC3E,UAAU,QAAQ;EAClB,SAAS,QAAQ,YAAY,SACzB,UAAU,cAAc,QAAQ,QAAQ,QAAQ,QAAkD,GAClG;EACL;;;;;AASD,IAAa,uBAAb,cAA0C,QAAQ,IAChD,kDACD,EAA2C,CAAC;;;;AAK7C,MAAa,SACX,YAEA,MAAM,QAAQ,sBAAsB,KAAK,QAAQ,CAAC"}
|
package/dist/MimicServer.cjs
CHANGED
|
@@ -10,9 +10,6 @@ let effect_Effect = require("effect/Effect");
|
|
|
10
10
|
effect_Effect = require_rolldown_runtime.__toESM(effect_Effect);
|
|
11
11
|
let effect_Layer = require("effect/Layer");
|
|
12
12
|
effect_Layer = require_rolldown_runtime.__toESM(effect_Layer);
|
|
13
|
-
let effect_Context = require("effect/Context");
|
|
14
|
-
effect_Context = require_rolldown_runtime.__toESM(effect_Context);
|
|
15
|
-
let _effect_platform_SocketServer = require("@effect/platform/SocketServer");
|
|
16
13
|
let _effect_platform = require("@effect/platform");
|
|
17
14
|
|
|
18
15
|
//#region src/MimicServer.ts
|
|
@@ -21,120 +18,14 @@ let _effect_platform = require("@effect/platform");
|
|
|
21
18
|
* Mimic server layer composition.
|
|
22
19
|
*/
|
|
23
20
|
var MimicServer_exports = /* @__PURE__ */ require_rolldown_runtime.__export({
|
|
24
|
-
MimicWebSocketHandler: () => MimicWebSocketHandler,
|
|
25
21
|
documentManagerLayer: () => documentManagerLayer,
|
|
26
|
-
|
|
27
|
-
layer: () => layer,
|
|
28
|
-
layerHttpLayerRouter: () => layerHttpLayerRouter,
|
|
29
|
-
run: () => run
|
|
22
|
+
layerHttpLayerRouter: () => layerHttpLayerRouter
|
|
30
23
|
});
|
|
31
24
|
/**
|
|
32
|
-
* Tag for the WebSocket handler function.
|
|
33
|
-
*/
|
|
34
|
-
var MimicWebSocketHandler = class extends effect_Context.Tag("@voidhash/mimic-server-effect/MimicWebSocketHandler")() {};
|
|
35
|
-
/**
|
|
36
|
-
* Create a Mimic WebSocket handler layer.
|
|
37
|
-
*
|
|
38
|
-
* This layer provides a handler function that can be used with any WebSocket server
|
|
39
|
-
* implementation. The handler takes a socket and document ID and manages the
|
|
40
|
-
* document synchronization.
|
|
41
|
-
*
|
|
42
|
-
* By default, uses in-memory storage and no authentication.
|
|
43
|
-
* Override these by providing MimicDataStorage and MimicAuthService layers.
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* import { MimicServer, MimicAuthService } from "@voidhash/mimic-effect";
|
|
48
|
-
* import { Primitive } from "@voidhash/mimic";
|
|
49
|
-
*
|
|
50
|
-
* const TodoSchema = Primitive.Struct({
|
|
51
|
-
* title: Primitive.String(),
|
|
52
|
-
* completed: Primitive.Boolean(),
|
|
53
|
-
* });
|
|
54
|
-
*
|
|
55
|
-
* // Create the handler layer with defaults
|
|
56
|
-
* const HandlerLayer = MimicServer.layer({
|
|
57
|
-
* basePath: "/mimic/todo",
|
|
58
|
-
* schema: TodoSchema
|
|
59
|
-
* });
|
|
60
|
-
*
|
|
61
|
-
* // Or with custom auth
|
|
62
|
-
* const HandlerLayerWithAuth = MimicServer.layer({
|
|
63
|
-
* basePath: "/mimic/todo",
|
|
64
|
-
* schema: TodoSchema
|
|
65
|
-
* }).pipe(
|
|
66
|
-
* Layer.provideMerge(MimicAuthService.layer({
|
|
67
|
-
* authHandler: (token) => ({ success: true, userId: "user-123" })
|
|
68
|
-
* }))
|
|
69
|
-
* );
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
const layer = (options) => {
|
|
73
|
-
const configLayer = require_MimicConfig.layer({
|
|
74
|
-
schema: options.schema,
|
|
75
|
-
maxTransactionHistory: options.maxTransactionHistory,
|
|
76
|
-
presence: options.presence
|
|
77
|
-
});
|
|
78
|
-
return effect_Layer.merge(effect_Layer.effect(MimicWebSocketHandler, require_WebSocketHandler.makeHandler).pipe(effect_Layer.provide(require_DocumentManager.layer), effect_Layer.provide(require_PresenceManager.layer), effect_Layer.provide(configLayer)), require_DocumentManager.layer.pipe(effect_Layer.provide(configLayer))).pipe(effect_Layer.provide(require_InMemoryDataStorage.layerDefault), effect_Layer.provide(require_NoAuth.layerDefault));
|
|
79
|
-
};
|
|
80
|
-
/**
|
|
81
|
-
* Create the Mimic server handler layer.
|
|
82
|
-
* This layer provides the WebSocket handler that can be used with any WebSocket server.
|
|
83
|
-
*
|
|
84
|
-
* @example
|
|
85
|
-
* ```typescript
|
|
86
|
-
* import { MimicServer } from "@voidhash/mimic-server-effect";
|
|
87
|
-
* import { SocketServer } from "@effect/platform/SocketServer";
|
|
88
|
-
* import { Primitive } from "@voidhash/mimic";
|
|
89
|
-
*
|
|
90
|
-
* // Define your document schema
|
|
91
|
-
* const TodoSchema = Primitive.Struct({
|
|
92
|
-
* title: Primitive.String(),
|
|
93
|
-
* completed: Primitive.Boolean(),
|
|
94
|
-
* });
|
|
95
|
-
*
|
|
96
|
-
* // Create the server layer
|
|
97
|
-
* const serverLayer = MimicServer.handlerLayer({
|
|
98
|
-
* schema: TodoSchema,
|
|
99
|
-
* });
|
|
100
|
-
*
|
|
101
|
-
* // Run with your socket server
|
|
102
|
-
* Effect.gen(function* () {
|
|
103
|
-
* const handler = yield* MimicServer.MimicWebSocketHandler;
|
|
104
|
-
* const server = yield* SocketServer;
|
|
105
|
-
*
|
|
106
|
-
* yield* server.run((socket) =>
|
|
107
|
-
* // Extract document ID from request and call handler
|
|
108
|
-
* handler(socket, "my-document-id")
|
|
109
|
-
* );
|
|
110
|
-
* }).pipe(
|
|
111
|
-
* Effect.provide(serverLayer),
|
|
112
|
-
* Effect.provide(YourSocketServerLayer),
|
|
113
|
-
* );
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
const handlerLayer = (options) => effect_Layer.effect(MimicWebSocketHandler, require_WebSocketHandler.makeHandler).pipe(effect_Layer.provide(require_DocumentManager.layer), effect_Layer.provide(require_PresenceManager.layer), effect_Layer.provide(require_MimicConfig.layer(options)), effect_Layer.provide(require_InMemoryDataStorage.layerDefault), effect_Layer.provide(require_NoAuth.layerDefault));
|
|
117
|
-
/**
|
|
118
25
|
* Create the document manager layer.
|
|
119
26
|
*/
|
|
120
27
|
const documentManagerLayer = (options) => require_DocumentManager.layer.pipe(effect_Layer.provide(require_MimicConfig.layer(options)), effect_Layer.provide(require_InMemoryDataStorage.layerDefault), effect_Layer.provide(require_NoAuth.layerDefault));
|
|
121
28
|
/**
|
|
122
|
-
* Run a Mimic WebSocket server with the provided handler.
|
|
123
|
-
*
|
|
124
|
-
* This is a helper that:
|
|
125
|
-
* 1. Gets the WebSocket handler from context
|
|
126
|
-
* 2. Runs the socket server with the handler
|
|
127
|
-
*
|
|
128
|
-
* Note: The document ID extraction from socket is implementation-specific.
|
|
129
|
-
* You may need to customize this based on your socket server.
|
|
130
|
-
*/
|
|
131
|
-
const run = (extractDocumentId$1) => effect_Effect.gen(function* () {
|
|
132
|
-
const handler = yield* MimicWebSocketHandler;
|
|
133
|
-
yield* (yield* _effect_platform_SocketServer.SocketServer).run((socket) => effect_Effect.gen(function* () {
|
|
134
|
-
yield* handler(socket, yield* extractDocumentId$1(socket));
|
|
135
|
-
}).pipe(effect_Effect.catchAll((error) => effect_Effect.logError("Connection error", error))));
|
|
136
|
-
});
|
|
137
|
-
/**
|
|
138
29
|
* Create the HTTP handler effect for WebSocket upgrade.
|
|
139
30
|
* This handler:
|
|
140
31
|
* 1. Extracts the document ID from the URL path
|
|
@@ -209,7 +100,8 @@ const layerHttpLayerRouter = (options) => {
|
|
|
209
100
|
const configLayer = require_MimicConfig.layer({
|
|
210
101
|
schema: options.schema,
|
|
211
102
|
maxTransactionHistory: options.maxTransactionHistory,
|
|
212
|
-
presence: options.presence
|
|
103
|
+
presence: options.presence,
|
|
104
|
+
initial: options.initial
|
|
213
105
|
});
|
|
214
106
|
const authLayer = (_options$authLayer = options.authLayer) !== null && _options$authLayer !== void 0 ? _options$authLayer : require_NoAuth.layerDefault;
|
|
215
107
|
const storageLayer = (_options$storageLayer = options.storageLayer) !== null && _options$storageLayer !== void 0 ? _options$storageLayer : require_InMemoryDataStorage.layerDefault;
|