solid-objects 0.17.3 → 0.17.5

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 CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.5 - 2026-10-09
4
+
5
+ - Correct `docs/agents.md` and `docs/fit.md`: Solid Objects Pro ships for
6
+ Node.js as `@solidobjects/pro` from the private registry at
7
+ <https://solidobjects.pro>, beside the Rails gem. The docs said that its
8
+ Node build was in development.
9
+
10
+ ## 0.17.4 - 2026-10-08
11
+
12
+ - Step 12 of `docs/agents.md` now says plainly that every authorization
13
+ callback denies by default in the browser too. A worker with no
14
+ `authorizeMessage` and no `authorizeQuery` answers no call. The install
15
+ step points to the browser policy and to `runtime.run(signal)`, and the
16
+ checks start with the policy. In an evaluation, two agent answers gave the
17
+ browser install with no policy after they read that a browser policy is
18
+ not a security boundary.
19
+ - A new Chromium test proves that a browser worker with no authorization
20
+ callbacks rejects actor calls with `Unauthorized`.
21
+
3
22
  ## 0.17.3 - 2026-10-08
4
23
 
5
24
  - `docs/agents.md` has a new step 12 for the browser runtime. It covers when
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.17.3";
1
+ export declare const VERSION = "0.17.5";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.17.3";
1
+ export const VERSION = "0.17.5";
2
2
  //# sourceMappingURL=version.js.map
package/docs/agents.md CHANGED
@@ -19,27 +19,27 @@ Use Solid Objects only if you can answer yes to most of these questions:
19
19
 
20
20
  Select a simpler tool in these cases:
21
21
 
22
- | Requirement | Use instead |
23
- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
24
- | The invariant fits in one request | A transaction, a constraint, or `SELECT ... FOR UPDATE` |
25
- | CPU-intensive or parallel work | `worker_threads` or a worker pool. An actor serializes work |
26
- | Thousands of writes for each second to one key | A counter column or a cache. Solid Objects Pro covers this case for Rails; its Node build is in development |
27
- | One atomic change across two actor identities | One SQL transaction on normal tables |
28
- | Exactly-once calls to an external API | Not available from any actor library. Use provider idempotency keys |
29
- | Replay of named workflow steps from a step log | A durable execution engine, such as DBOS or Temporal |
22
+ | Requirement | Use instead |
23
+ | ---------------------------------------------- | ---------------------------------------------------------------------------------- |
24
+ | The invariant fits in one request | A transaction, a constraint, or `SELECT ... FOR UPDATE` |
25
+ | CPU-intensive or parallel work | `worker_threads` or a worker pool. An actor serializes work |
26
+ | Thousands of writes for each second to one key | A counter column, a cache, or Solid Objects Pro, which ships for Node.js and Rails |
27
+ | One atomic change across two actor identities | One SQL transaction on normal tables |
28
+ | Exactly-once calls to an external API | Not available from any actor library. Use provider idempotency keys |
29
+ | Replay of named workflow steps from a step log | A durable execution engine, such as DBOS or Temporal |
30
30
 
31
31
  The full list is in [Choosing Solid Objects](fit.md). The category guide is
32
32
  [Virtual actors in TypeScript and Node.js](virtual-actors.md).
33
33
 
34
34
  ## 2. Package identity
35
35
 
36
- | Item | Value |
37
- | ------------------ | ----------------------------------------------------------------------------------------------------- |
38
- | npm package | `solid-objects` |
39
- | Repository | <https://github.com/cardmagic/solid-objects-js> |
40
- | Website | <https://solidobjects.dev/js> |
41
- | Ruby on Rails gem | `solid_objects`, a separate implementation of the same model |
42
- | Commercial package | `@solidobjects/pro`, a separate paid package in development. The open-source package does not need it |
36
+ | Item | Value |
37
+ | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
38
+ | npm package | `solid-objects` |
39
+ | Repository | <https://github.com/cardmagic/solid-objects-js> |
40
+ | Website | <https://solidobjects.dev/js> |
41
+ | Ruby on Rails gem | `solid_objects`, a separate implementation of the same model |
42
+ | Commercial package | `@solidobjects/pro`, a separate paid package from the private registry at <https://solidobjects.pro>. The open-source package does not need it |
43
43
 
44
44
  Solid Objects is not SolidJS and has no relation to it. It is not affiliated
45
45
  with Cloudflare.
@@ -361,6 +361,11 @@ npm install solid-objects @sqlite.org/sqlite-wasm
361
361
  `@sqlite.org/sqlite-wasm` 3.50 or newer is an optional peer dependency. The
362
362
  browser runtime needs it.
363
363
 
364
+ Every authorization callback denies by default in the browser too. Write the
365
+ policy in [Authorize in the browser](#authorize-in-the-browser) before you call
366
+ an actor. Reminders and effects run only while the worker calls
367
+ `runtime.run(signal)`.
368
+
364
369
  ### Choose the entry point
365
370
 
366
371
  | Need | Use |
@@ -464,10 +469,16 @@ and calls time out before it expires.
464
469
 
465
470
  ### Authorize in the browser
466
471
 
467
- The page and the worker run on the user's device, and the user can change
468
- their code. A browser policy limits what your own page can call. It is not a
469
- security boundary. Authorize again on the server for each write that leaves the
470
- device.
472
+ All authorization callbacks deny by default, in the browser as in Node.js. A
473
+ worker that sets no `authorizeMessage` and no `authorizeQuery` answers no call.
474
+ Each call fails with `Unauthorized`. Allow the actor types that your page uses,
475
+ as `allowNoteDrafts` does in the example. Do not remove the deny-by-default
476
+ behavior.
477
+
478
+ The browser policy is still not a security boundary. The page and the worker
479
+ run on the user's device, and the user can change their code. The policy limits
480
+ what your own page can call. Authorize again on the server for each write that
481
+ leaves the device.
471
482
 
472
483
  ### Rules for browser actors
473
484
 
@@ -552,10 +563,12 @@ The [public API](api.md#solid-objectstransmit) and the
552
563
 
553
564
  ### Verify a browser implementation
554
565
 
555
- 1. Call an operation, reload the page, and confirm that the state is the same.
556
- 2. Send concurrent calls to one identity from two tabs. Assert the final state.
557
- 3. Close the tab that holds the database. Confirm that the other tab continues.
558
- 4. On each target engine, confirm that persistent storage opens, or fails with
566
+ 1. Confirm that the worker sets `authorizeMessage` and `authorizeQuery`.
567
+ Without them, every call fails with `Unauthorized`.
568
+ 2. Call an operation, reload the page, and confirm that the state is the same.
569
+ 3. Send concurrent calls to one identity from two tabs. Assert the final state.
570
+ 4. Close the tab that holds the database. Confirm that the other tab continues.
571
+ 5. On each target engine, confirm that persistent storage opens, or fails with
559
572
  a clear error.
560
- 5. If you send writes to a server, confirm that the server rejects a device
573
+ 6. If you send writes to a server, confirm that the server rejects a device
561
574
  that it cannot authenticate, and applies a repeated write once.
package/docs/fit.md CHANGED
@@ -42,8 +42,8 @@ history, and no actor-state migration contract.
42
42
  fits, because each check is one durable ordered message. For the high-QPS
43
43
  limiter, see [Solid Objects Pro](https://solidobjects.pro/): grouped commits
44
44
  coalesce concurrent writes into one insert, and ephemeral operations keep
45
- loss-tolerant calls out of the durable journal. It ships for the Rails gem
46
- today, and the Node build is in development. Distributed per-actor rate
45
+ loss-tolerant calls out of the durable journal. It ships for Node.js as
46
+ `@solidobjects/pro` and for the Rails gem. Distributed per-actor rate
47
47
  limits, global admission control, and cache-capacity eviction are answered
48
48
  there rather than in this runtime, and are not open roadmap items here.
49
49
  - Durable workflow replay across named steps is more important than a mutable
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solid-objects",
3
- "version": "0.17.3",
3
+ "version": "0.17.5",
4
4
  "description": "SQL-backed virtual actor library for TypeScript and Node.js, with durable state, ordered operations, and automatic activation on SQLite, PostgreSQL, or MySQL",
5
5
  "type": "module",
6
6
  "license": "MIT",