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.
- package/CHANGELOG.md +114 -0
- package/README.md +212 -67
- package/dist/actor.d.ts +1 -0
- package/dist/actor.d.ts.map +1 -1
- package/dist/actor.js +9 -0
- package/dist/actor.js.map +1 -1
- package/dist/broadcast-worker.d.ts +1 -1
- package/dist/broadcast-worker.d.ts.map +1 -1
- package/dist/broadcast-worker.js +1 -1
- package/dist/broadcast-worker.js.map +1 -1
- package/dist/broken-pipe.d.ts +5 -0
- package/dist/broken-pipe.d.ts.map +1 -0
- package/dist/broken-pipe.js +8 -0
- package/dist/broken-pipe.js.map +1 -0
- package/dist/browser/host.d.ts +8 -0
- package/dist/browser/host.d.ts.map +1 -0
- package/dist/browser/host.js +22 -0
- package/dist/browser/host.js.map +1 -0
- package/dist/browser/tab-host.d.ts +43 -0
- package/dist/browser/tab-host.d.ts.map +1 -0
- package/dist/browser/tab-host.js +196 -0
- package/dist/browser/tab-host.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -3
- package/dist/cli.js.map +1 -1
- package/dist/context.js +2 -2
- package/dist/context.js.map +1 -1
- package/dist/database/deadline.js +2 -2
- package/dist/database/deadline.js.map +1 -1
- package/dist/database/mysql.d.ts +1 -0
- package/dist/database/mysql.d.ts.map +1 -1
- package/dist/database/mysql.js +1 -0
- package/dist/database/mysql.js.map +1 -1
- package/dist/database/postgresql.d.ts +1 -0
- package/dist/database/postgresql.d.ts.map +1 -1
- package/dist/database/postgresql.js +1 -0
- package/dist/database/postgresql.js.map +1 -1
- package/dist/database/shared-sqlite-wasm.d.ts +74 -0
- package/dist/database/shared-sqlite-wasm.d.ts.map +1 -0
- package/dist/database/shared-sqlite-wasm.js +542 -0
- package/dist/database/shared-sqlite-wasm.js.map +1 -0
- package/dist/database/sqlite-wasm.d.ts +30 -0
- package/dist/database/sqlite-wasm.d.ts.map +1 -0
- package/dist/database/sqlite-wasm.js +185 -0
- package/dist/database/sqlite-wasm.js.map +1 -0
- package/dist/database/sqlite.d.ts +1 -0
- package/dist/database/sqlite.d.ts.map +1 -1
- package/dist/database/sqlite.js +1 -0
- package/dist/database/sqlite.js.map +1 -1
- package/dist/database/transaction-context.js +2 -2
- package/dist/database/transaction-context.js.map +1 -1
- package/dist/doctor.js +1 -1
- package/dist/doctor.js.map +1 -1
- package/dist/effect-worker.d.ts +1 -1
- package/dist/effect-worker.d.ts.map +1 -1
- package/dist/effect-worker.js +1 -1
- package/dist/effect-worker.js.map +1 -1
- package/dist/examples/quickstart-report.js +127 -0
- package/dist/examples/quickstart-report.js.map +1 -0
- package/dist/examples/sqlite-quickstart.js +59 -7
- package/dist/examples/sqlite-quickstart.js.map +1 -1
- package/dist/executable.js +4 -0
- package/dist/executable.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/platform/context-store.d.ts +11 -0
- package/dist/platform/context-store.d.ts.map +1 -0
- package/dist/platform/context-store.js +28 -0
- package/dist/platform/context-store.js.map +1 -0
- package/dist/platform/host-identity.d.ts +11 -0
- package/dist/platform/host-identity.d.ts.map +1 -0
- package/dist/platform/host-identity.js +17 -0
- package/dist/platform/host-identity.js.map +1 -0
- package/dist/platform/node.d.ts +2 -0
- package/dist/platform/node.d.ts.map +1 -0
- package/dist/platform/node.js +11 -0
- package/dist/platform/node.js.map +1 -0
- package/dist/platform/turn-context-store.d.ts +7 -0
- package/dist/platform/turn-context-store.d.ts.map +1 -0
- package/dist/platform/turn-context-store.js +17 -0
- package/dist/platform/turn-context-store.js.map +1 -0
- package/dist/platform/uuid.d.ts +2 -0
- package/dist/platform/uuid.d.ts.map +1 -0
- package/dist/platform/uuid.js +4 -0
- package/dist/platform/uuid.js.map +1 -0
- package/dist/platform/web-locks.d.ts +2 -0
- package/dist/platform/web-locks.d.ts.map +1 -0
- package/dist/platform/web-locks.js +8 -0
- package/dist/platform/web-locks.js.map +1 -0
- package/dist/reference.d.ts +16 -1
- package/dist/reference.d.ts.map +1 -1
- package/dist/reference.js +12 -0
- package/dist/reference.js.map +1 -1
- package/dist/reminder-scheduler.d.ts +1 -1
- package/dist/reminder-scheduler.d.ts.map +1 -1
- package/dist/reminder-scheduler.js +1 -1
- package/dist/reminder-scheduler.js.map +1 -1
- package/dist/repository.d.ts.map +1 -1
- package/dist/repository.js +13 -6
- package/dist/repository.js.map +1 -1
- package/dist/runtime.d.ts +25 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +62 -1
- package/dist/runtime.js.map +1 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2 -1
- package/dist/serialization.js.map +1 -1
- package/dist/signals.d.ts +9 -0
- package/dist/signals.d.ts.map +1 -0
- package/dist/signals.js +299 -0
- package/dist/signals.js.map +1 -0
- package/dist/transmit-effect.d.ts +2 -0
- package/dist/transmit-effect.d.ts.map +1 -0
- package/dist/transmit-effect.js +2 -0
- package/dist/transmit-effect.js.map +1 -0
- package/dist/transmit.d.ts +27 -0
- package/dist/transmit.d.ts.map +1 -0
- package/dist/transmit.js +105 -0
- package/dist/transmit.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web/index.d.ts +1 -0
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +1 -0
- package/dist/web/index.js.map +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/docs/api.md +262 -20
- package/docs/architecture.md +50 -23
- package/docs/authorization.md +6 -5
- package/docs/benchmarks.md +87 -65
- package/docs/browser-protocol.md +62 -3
- package/docs/comparisons.md +14 -9
- package/docs/configuration.md +2 -2
- package/docs/correctness.md +30 -17
- package/docs/dashboard.md +6 -6
- package/docs/errors-and-recovery.md +12 -12
- package/docs/fit.md +5 -0
- package/docs/operations.md +33 -19
- package/docs/parity.md +137 -47
- package/docs/releasing.md +6 -6
- package/docs/state-and-lifecycle.md +12 -8
- package/docs/support.md +60 -20
- package/examples/quickstart-report.ts +151 -0
- package/examples/sqlite-quickstart.ts +76 -16
- 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(
|
|
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:
|
|
126
|
+
Array.from({ length: SAME_IDENTITY_CALLS }, (_value, index) => index + 1),
|
|
65
127
|
)
|
|
66
128
|
sameIdentityFinalState = await counter.count
|
|
67
|
-
assert.equal(sameIdentityFinalState,
|
|
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
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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.
|
|
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
|
},
|