solid-objects 0.13.3 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +212 -67
  3. package/dist/actor.d.ts +1 -0
  4. package/dist/actor.d.ts.map +1 -1
  5. package/dist/actor.js +9 -0
  6. package/dist/actor.js.map +1 -1
  7. package/dist/broadcast-worker.d.ts +1 -1
  8. package/dist/broadcast-worker.d.ts.map +1 -1
  9. package/dist/broadcast-worker.js +1 -1
  10. package/dist/broadcast-worker.js.map +1 -1
  11. package/dist/broken-pipe.d.ts +5 -0
  12. package/dist/broken-pipe.d.ts.map +1 -0
  13. package/dist/broken-pipe.js +8 -0
  14. package/dist/broken-pipe.js.map +1 -0
  15. package/dist/browser/host.d.ts +8 -0
  16. package/dist/browser/host.d.ts.map +1 -0
  17. package/dist/browser/host.js +22 -0
  18. package/dist/browser/host.js.map +1 -0
  19. package/dist/browser/tab-host.d.ts +43 -0
  20. package/dist/browser/tab-host.d.ts.map +1 -0
  21. package/dist/browser/tab-host.js +196 -0
  22. package/dist/browser/tab-host.js.map +1 -0
  23. package/dist/cli.d.ts +1 -0
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +6 -3
  26. package/dist/cli.js.map +1 -1
  27. package/dist/context.js +2 -2
  28. package/dist/context.js.map +1 -1
  29. package/dist/database/deadline.js +2 -2
  30. package/dist/database/deadline.js.map +1 -1
  31. package/dist/database/mysql.d.ts +1 -0
  32. package/dist/database/mysql.d.ts.map +1 -1
  33. package/dist/database/mysql.js +1 -0
  34. package/dist/database/mysql.js.map +1 -1
  35. package/dist/database/postgresql.d.ts +1 -0
  36. package/dist/database/postgresql.d.ts.map +1 -1
  37. package/dist/database/postgresql.js +1 -0
  38. package/dist/database/postgresql.js.map +1 -1
  39. package/dist/database/shared-sqlite-wasm.d.ts +74 -0
  40. package/dist/database/shared-sqlite-wasm.d.ts.map +1 -0
  41. package/dist/database/shared-sqlite-wasm.js +542 -0
  42. package/dist/database/shared-sqlite-wasm.js.map +1 -0
  43. package/dist/database/sqlite-wasm.d.ts +30 -0
  44. package/dist/database/sqlite-wasm.d.ts.map +1 -0
  45. package/dist/database/sqlite-wasm.js +185 -0
  46. package/dist/database/sqlite-wasm.js.map +1 -0
  47. package/dist/database/sqlite.d.ts +1 -0
  48. package/dist/database/sqlite.d.ts.map +1 -1
  49. package/dist/database/sqlite.js +1 -0
  50. package/dist/database/sqlite.js.map +1 -1
  51. package/dist/database/transaction-context.js +2 -2
  52. package/dist/database/transaction-context.js.map +1 -1
  53. package/dist/doctor.js +1 -1
  54. package/dist/doctor.js.map +1 -1
  55. package/dist/effect-worker.d.ts +1 -1
  56. package/dist/effect-worker.d.ts.map +1 -1
  57. package/dist/effect-worker.js +1 -1
  58. package/dist/effect-worker.js.map +1 -1
  59. package/dist/examples/quickstart-report.js +127 -0
  60. package/dist/examples/quickstart-report.js.map +1 -0
  61. package/dist/examples/sqlite-quickstart.js +59 -7
  62. package/dist/examples/sqlite-quickstart.js.map +1 -1
  63. package/dist/executable.js +4 -0
  64. package/dist/executable.js.map +1 -1
  65. package/dist/index.d.ts +3 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/platform/context-store.d.ts +11 -0
  70. package/dist/platform/context-store.d.ts.map +1 -0
  71. package/dist/platform/context-store.js +28 -0
  72. package/dist/platform/context-store.js.map +1 -0
  73. package/dist/platform/host-identity.d.ts +11 -0
  74. package/dist/platform/host-identity.d.ts.map +1 -0
  75. package/dist/platform/host-identity.js +17 -0
  76. package/dist/platform/host-identity.js.map +1 -0
  77. package/dist/platform/node.d.ts +2 -0
  78. package/dist/platform/node.d.ts.map +1 -0
  79. package/dist/platform/node.js +11 -0
  80. package/dist/platform/node.js.map +1 -0
  81. package/dist/platform/turn-context-store.d.ts +7 -0
  82. package/dist/platform/turn-context-store.d.ts.map +1 -0
  83. package/dist/platform/turn-context-store.js +17 -0
  84. package/dist/platform/turn-context-store.js.map +1 -0
  85. package/dist/platform/uuid.d.ts +2 -0
  86. package/dist/platform/uuid.d.ts.map +1 -0
  87. package/dist/platform/uuid.js +4 -0
  88. package/dist/platform/uuid.js.map +1 -0
  89. package/dist/platform/web-locks.d.ts +2 -0
  90. package/dist/platform/web-locks.d.ts.map +1 -0
  91. package/dist/platform/web-locks.js +8 -0
  92. package/dist/platform/web-locks.js.map +1 -0
  93. package/dist/reference.d.ts +16 -1
  94. package/dist/reference.d.ts.map +1 -1
  95. package/dist/reference.js +12 -0
  96. package/dist/reference.js.map +1 -1
  97. package/dist/reminder-scheduler.d.ts +1 -1
  98. package/dist/reminder-scheduler.d.ts.map +1 -1
  99. package/dist/reminder-scheduler.js +1 -1
  100. package/dist/reminder-scheduler.js.map +1 -1
  101. package/dist/repository.d.ts.map +1 -1
  102. package/dist/repository.js +13 -6
  103. package/dist/repository.js.map +1 -1
  104. package/dist/runtime.d.ts +25 -1
  105. package/dist/runtime.d.ts.map +1 -1
  106. package/dist/runtime.js +62 -1
  107. package/dist/runtime.js.map +1 -1
  108. package/dist/serialization.d.ts.map +1 -1
  109. package/dist/serialization.js +2 -1
  110. package/dist/serialization.js.map +1 -1
  111. package/dist/signals.d.ts +9 -0
  112. package/dist/signals.d.ts.map +1 -0
  113. package/dist/signals.js +299 -0
  114. package/dist/signals.js.map +1 -0
  115. package/dist/transmit-effect.d.ts +2 -0
  116. package/dist/transmit-effect.d.ts.map +1 -0
  117. package/dist/transmit-effect.js +2 -0
  118. package/dist/transmit-effect.js.map +1 -0
  119. package/dist/transmit.d.ts +27 -0
  120. package/dist/transmit.d.ts.map +1 -0
  121. package/dist/transmit.js +105 -0
  122. package/dist/transmit.js.map +1 -0
  123. package/dist/version.d.ts +1 -1
  124. package/dist/version.js +1 -1
  125. package/dist/web/index.d.ts +1 -0
  126. package/dist/web/index.d.ts.map +1 -1
  127. package/dist/web/index.js +1 -0
  128. package/dist/web/index.js.map +1 -1
  129. package/dist/worker.d.ts +1 -1
  130. package/dist/worker.d.ts.map +1 -1
  131. package/dist/worker.js +1 -1
  132. package/dist/worker.js.map +1 -1
  133. package/docs/api.md +262 -20
  134. package/docs/architecture.md +50 -23
  135. package/docs/authorization.md +6 -5
  136. package/docs/benchmarks.md +87 -65
  137. package/docs/browser-protocol.md +62 -3
  138. package/docs/comparisons.md +14 -9
  139. package/docs/configuration.md +2 -2
  140. package/docs/correctness.md +30 -17
  141. package/docs/dashboard.md +6 -6
  142. package/docs/errors-and-recovery.md +12 -12
  143. package/docs/fit.md +5 -0
  144. package/docs/operations.md +33 -19
  145. package/docs/parity.md +137 -47
  146. package/docs/releasing.md +6 -6
  147. package/docs/state-and-lifecycle.md +12 -8
  148. package/docs/support.md +60 -20
  149. package/examples/quickstart-report.ts +151 -0
  150. package/examples/sqlite-quickstart.ts +76 -16
  151. package/package.json +37 -2
@@ -6,6 +6,17 @@ import { join, resolve } from "node:path"
6
6
  import { fileURLToPath } from "node:url"
7
7
  import { Actor, createRuntime } from "solid-objects"
8
8
  import { sqlite } from "solid-objects/database/sqlite"
9
+ import { createInterface } from "node:readline/promises"
10
+ import {
11
+ answerAllowsRun,
12
+ formatQuickstartPlan,
13
+ formatQuickstartPrompt,
14
+ formatQuickstartReport,
15
+ formatQuickstartStop,
16
+ type QuickstartSummary,
17
+ } from "./quickstart-report.js"
18
+
19
+ const SAME_IDENTITY_CALLS = 25
9
20
 
10
21
  class Counter extends Actor {
11
22
  static override readonly actorType = "QuickstartCounter"
@@ -27,12 +38,61 @@ class Counter extends Actor {
27
38
  }
28
39
  }
29
40
 
41
+ const COUNTER_SOURCE = `class Counter extends Actor {
42
+ static override readonly actorType = "QuickstartCounter"
43
+
44
+ count = 0
45
+
46
+ increment(): number {
47
+ this.count += 1
48
+ return this.count
49
+ }
50
+
51
+ async pause({ milliseconds }: { milliseconds: number }) {
52
+ const startedAt = performance.now()
53
+ await new Promise((done) => setTimeout(done, milliseconds))
54
+ return { startedAt, finishedAt: performance.now() }
55
+ }
56
+ }`
57
+
58
+ async function confirmRun(options: {
59
+ format?: "report" | "json"
60
+ confirm?: () => boolean | Promise<boolean>
61
+ }): Promise<boolean> {
62
+ if (options.format === "json") return true
63
+ if (options.confirm) return options.confirm()
64
+ if (!process.stdin.isTTY) return true
65
+ const questions = createInterface({ input: process.stdin, output: process.stdout })
66
+ try {
67
+ return answerAllowsRun(await questions.question(formatQuickstartPrompt()))
68
+ } catch {
69
+ return false
70
+ } finally {
71
+ questions.close()
72
+ }
73
+ }
74
+
30
75
  export async function runQuickstart(
31
76
  options: {
32
77
  signal?: AbortSignal
33
78
  write?: (value: string) => void
79
+ format?: "report" | "json"
80
+ confirm?: () => boolean | Promise<boolean>
34
81
  } = {},
35
82
  ): Promise<void> {
83
+ const write = options.write ?? ((value: string) => process.stdout.write(value))
84
+ if (options.format !== "json") {
85
+ write(
86
+ formatQuickstartPlan({
87
+ sameIdentityCalls: SAME_IDENTITY_CALLS,
88
+ actorSource: COUNTER_SOURCE,
89
+ }),
90
+ )
91
+ }
92
+ if (!(await confirmRun(options))) {
93
+ write(formatQuickstartStop())
94
+ return
95
+ }
36
96
  const directory = await mkdtemp(join(tmpdir(), "solid-objects-quickstart-"))
37
97
  const databasePath = join(directory, "state.sqlite3")
38
98
  const runtime = createRuntime({
@@ -58,13 +118,15 @@ export async function runQuickstart(
58
118
  running = runtime.run(shutdown.signal)
59
119
 
60
120
  const counter = runtime.ref(Counter, "room-1")
61
- const results = await Promise.all(Array.from({ length: 25 }, () => counter.increment()))
121
+ const results = await Promise.all(
122
+ Array.from({ length: SAME_IDENTITY_CALLS }, () => counter.increment()),
123
+ )
62
124
  assert.deepEqual(
63
125
  [...results].sort((left, right) => left - right),
64
- Array.from({ length: 25 }, (_value, index) => index + 1),
126
+ Array.from({ length: SAME_IDENTITY_CALLS }, (_value, index) => index + 1),
65
127
  )
66
128
  sameIdentityFinalState = await counter.count
67
- assert.equal(sameIdentityFinalState, 25)
129
+ assert.equal(sameIdentityFinalState, SAME_IDENTITY_CALLS)
68
130
 
69
131
  const pauses = await Promise.all([
70
132
  runtime.ref(Counter, "room-2").send.pause({ milliseconds: 100 }),
@@ -89,19 +151,17 @@ export async function runQuickstart(
89
151
  }
90
152
 
91
153
  assert.equal(existsSync(directory), false)
92
- const write = options.write ?? ((value: string) => process.stdout.write(value))
93
- write(
94
- `${JSON.stringify(
95
- {
96
- sameIdentityCalls: 25,
97
- sameIdentityFinalState,
98
- independentIdentitiesOverlapped,
99
- temporaryStateRemoved: true,
100
- },
101
- null,
102
- 2,
103
- )}\n`,
104
- )
154
+ const summary: QuickstartSummary = {
155
+ sameIdentityCalls: SAME_IDENTITY_CALLS,
156
+ sameIdentityFinalState,
157
+ independentIdentitiesOverlapped,
158
+ temporaryStateRemoved: true,
159
+ }
160
+ if (options.format === "json") {
161
+ write(`${JSON.stringify(summary, null, 2)}\n`)
162
+ return
163
+ }
164
+ write(formatQuickstartReport(summary))
105
165
  }
106
166
 
107
167
  if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solid-objects",
3
- "version": "0.13.3",
3
+ "version": "0.14.1",
4
4
  "description": "Race-free realtime state per application identity, backed by your SQL database",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -46,6 +46,14 @@
46
46
  "types": "./dist/database/sqlite.d.ts",
47
47
  "import": "./dist/database/sqlite.js"
48
48
  },
49
+ "./database/sqlite-wasm": {
50
+ "types": "./dist/database/sqlite-wasm.d.ts",
51
+ "import": "./dist/database/sqlite-wasm.js"
52
+ },
53
+ "./database/shared-sqlite-wasm": {
54
+ "types": "./dist/database/shared-sqlite-wasm.d.ts",
55
+ "import": "./dist/database/shared-sqlite-wasm.js"
56
+ },
49
57
  "./database/postgresql": {
50
58
  "types": "./dist/database/postgresql.d.ts",
51
59
  "import": "./dist/database/postgresql.js"
@@ -62,6 +70,22 @@
62
70
  "types": "./dist/browser/index.d.ts",
63
71
  "import": "./dist/browser/index.js"
64
72
  },
73
+ "./browser/host": {
74
+ "types": "./dist/browser/host.d.ts",
75
+ "import": "./dist/browser/host.js"
76
+ },
77
+ "./browser/tab-host": {
78
+ "types": "./dist/browser/tab-host.d.ts",
79
+ "import": "./dist/browser/tab-host.js"
80
+ },
81
+ "./signals": {
82
+ "types": "./dist/signals.d.ts",
83
+ "import": "./dist/signals.js"
84
+ },
85
+ "./transmit": {
86
+ "types": "./dist/transmit.d.ts",
87
+ "import": "./dist/transmit.js"
88
+ },
65
89
  "./web": {
66
90
  "types": "./dist/web/index.d.ts",
67
91
  "import": "./dist/web/index.js"
@@ -69,7 +93,8 @@
69
93
  },
70
94
  "scripts": {
71
95
  "build": "pnpm run clean && tsc -p tsconfig.build.json && tsc -p tsconfig.quickstart-build.json && node scripts/prepare-executable.mjs",
72
- "check": "pnpm run check:parameters && pnpm run check:documentation && tsc -p tsconfig.json --noEmit && tsc -p tsconfig.examples.json --noEmit",
96
+ "check": "pnpm run check:parameters && pnpm run check:documentation && pnpm run check:browser-imports && tsc -p tsconfig.json --noEmit && tsc -p tsconfig.examples.json --noEmit",
97
+ "check:browser-imports": "node scripts/check-browser-imports.mjs",
73
98
  "check:documentation": "node scripts/check-documentation.mjs",
74
99
  "check:parameters": "node scripts/check-parameter-style.mjs",
75
100
  "clean": "node scripts/clean.mjs",
@@ -91,6 +116,7 @@
91
116
  },
92
117
  "devDependencies": {
93
118
  "@playwright/test": "^1.62.1",
119
+ "@sqlite.org/sqlite-wasm": "3.53.0-build1",
94
120
  "@types/node": "^24.0.0",
95
121
  "@types/pg": "^8.21.0",
96
122
  "@types/ws": "^8.18.1",
@@ -99,16 +125,25 @@
99
125
  "pg": "^8.23.0",
100
126
  "prettier": "^3.9.6",
101
127
  "redis": "^6.2.1",
128
+ "signal-polyfill": "^0.2.2",
102
129
  "typescript": "^5.9.0",
103
130
  "vitest": "^4.1.10",
104
131
  "ws": "^8.21.3"
105
132
  },
106
133
  "peerDependencies": {
134
+ "@sqlite.org/sqlite-wasm": ">=3.50.0-build1",
135
+ "signal-polyfill": ">=0.2.2",
107
136
  "mysql2": "^3.23.3",
108
137
  "pg": "^8.23.0",
109
138
  "redis": "^6.2.1"
110
139
  },
111
140
  "peerDependenciesMeta": {
141
+ "@sqlite.org/sqlite-wasm": {
142
+ "optional": true
143
+ },
144
+ "signal-polyfill": {
145
+ "optional": true
146
+ },
112
147
  "mysql2": {
113
148
  "optional": true
114
149
  },