@pyric/cli 0.1.0-alpha.13 → 0.1.0-alpha.15
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/dist/assurance/.generated/conformance-verdicts.d.ts +120 -75
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +120 -75
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +208 -285
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/service-command-records/database-rules-generate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-generate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-generate.js +3 -0
- package/dist/cli/service-command-records/database-rules-generate.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-lint.js +3 -0
- package/dist/cli/service-command-records/database-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/database-rules-simulate.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-validate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-validate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-validate.js +3 -0
- package/dist/cli/service-command-records/database-rules-validate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.js +3 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-lint.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-validate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-validate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-validate.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-validate.js.map +1 -0
- package/dist/cli/service-command-records/storage-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-lint.js +3 -0
- package/dist/cli/service-command-records/storage-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/storage-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/storage-rules-simulate.js.map +1 -0
- package/dist/cli/service-commands.d.ts +7 -0
- package/dist/cli/service-commands.d.ts.map +1 -1
- package/dist/cli/service-commands.generated.d.ts +35 -0
- package/dist/cli/service-commands.generated.d.ts.map +1 -0
- package/dist/cli/service-commands.generated.js +25 -0
- package/dist/cli/service-commands.generated.js.map +1 -0
- package/dist/cli/service-commands.js +23 -40
- package/dist/cli/service-commands.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +63 -0
- package/dist/functions-rtdb/development-runtime.d.ts.map +1 -0
- package/dist/functions-rtdb/development-runtime.js +244 -0
- package/dist/functions-rtdb/development-runtime.js.map +1 -0
- package/dist/serve/bridge-mount.d.ts +32 -2
- package/dist/serve/bridge-mount.d.ts.map +1 -1
- package/dist/serve/bridge-mount.js +232 -18
- package/dist/serve/bridge-mount.js.map +1 -1
- package/dist/serve/bundler.d.ts +4 -18
- package/dist/serve/bundler.d.ts.map +1 -1
- package/dist/serve/bundler.js +15 -37
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/entries/app-client.d.ts.map +1 -1
- package/dist/serve/entries/app-client.js +5 -5
- package/dist/serve/entries/app-client.js.map +1 -1
- package/dist/serve/entries/auth-helper-core.d.ts +23 -6
- package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-core.js +55 -24
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/database.d.ts +28 -0
- package/dist/serve/entries/database.d.ts.map +1 -1
- package/dist/serve/entries/database.js +95 -26
- package/dist/serve/entries/database.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +21 -12
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/html-injection.d.ts +5 -0
- package/dist/serve/html-injection.d.ts.map +1 -0
- package/dist/serve/html-injection.js +59 -0
- package/dist/serve/html-injection.js.map +1 -0
- package/dist/serve/namespace.d.ts +6 -22
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +23 -145
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/runtime/worker-generation.d.ts +10 -2
- package/dist/serve/runtime/worker-generation.d.ts.map +1 -1
- package/dist/serve/runtime/worker-generation.js +29 -8
- package/dist/serve/runtime/worker-generation.js.map +1 -1
- package/dist/serve/runtime/worker-replacement.d.ts +1 -2
- package/dist/serve/runtime/worker-replacement.d.ts.map +1 -1
- package/dist/serve/sandbox-session.d.ts +78 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -0
- package/dist/serve/sandbox-session.js +171 -0
- package/dist/serve/sandbox-session.js.map +1 -0
- package/dist/serve/server.d.ts +5 -2
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +21 -5
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/site-tree.d.ts +8 -0
- package/dist/serve/site-tree.d.ts.map +1 -0
- package/dist/serve/site-tree.js +113 -0
- package/dist/serve/site-tree.js.map +1 -0
- package/dist/serve/site-ui/_astro/RulesCodeEditor.CzwHdCi9.js +23 -0
- package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +1 -0
- package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +1 -0
- package/dist/serve/site-ui/_astro/app.BnMC0ywl.js +109 -0
- package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +1 -0
- package/dist/serve/site-ui/_astro/app.DVXXR-WI.js +1 -0
- package/dist/serve/site-ui/_astro/chess-showcase.DzPO6kz0.js +1 -0
- package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +1 -0
- package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +354 -0
- package/dist/serve/site-ui/_astro/client.D2ORs4B-.js +25 -0
- package/dist/serve/site-ui/_astro/example-runtime.CM0H02rx.js +291 -0
- package/dist/serve/site-ui/_astro/index.B4Kh80he.js +1 -0
- package/dist/serve/site-ui/_astro/index.DBy5LfQW.js +9 -0
- package/dist/serve/site-ui/_astro/index.DNyk7q8W.js +9 -0
- package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +9 -0
- package/dist/serve/site-ui/_astro/reads.D1exkX1-.js +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.BqMePr5V.js +1153 -0
- package/dist/serve/site-ui/_astro/seed.BCn5DhHS.js +20 -0
- package/dist/serve/site-ui/auth/index.html +11 -0
- package/dist/serve/site-ui/docs/_rhythm/index.html +100 -0
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +43 -0
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +26 -0
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +70 -0
- package/dist/serve/{docs-ui → site-ui}/docs/ai-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/api-reference/index.html +68 -0
- package/dist/serve/{docs-ui → site-ui}/docs/app-compat/index.html +3 -3
- package/dist/serve/{docs-ui → site-ui}/docs/auth-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +64 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +66 -0
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +84 -0
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +71 -0
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +66 -0
- package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-storage.md +2 -2
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +67 -0
- package/dist/serve/site-ui/docs/conformance-scores/index.html +50 -0
- package/dist/serve/{docs-ui → site-ui}/docs/conformance-scores.md +3 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +531 -0
- package/dist/serve/{docs-ui → site-ui}/docs/database-compat/index.html +211 -168
- package/dist/serve/{docs-ui → site-ui}/docs/database-compat.md +208 -170
- package/dist/serve/site-ui/docs/examples/chess/index.html +384 -0
- package/dist/serve/site-ui/docs/examples/chess.md +57 -0
- package/dist/serve/site-ui/docs/examples/index.html +3 -0
- package/dist/serve/site-ui/docs/examples.md +4 -0
- package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat/index.html +55 -91
- package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat.md +52 -88
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +73 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +29 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +33 -0
- package/dist/serve/{docs-ui → site-ui}/docs/index.json +595 -26
- package/dist/serve/site-ui/docs/messaging-compat/index.html +324 -0
- package/dist/serve/{docs-ui → site-ui}/docs/messaging-compat.md +71 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +28 -0
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +74 -0
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +45 -0
- package/dist/serve/site-ui/docs/overview/index.html +17 -0
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +186 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api/index.html +318 -202
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api.md +154 -27
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +318 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +160 -0
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +425 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +60 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +507 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +258 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +308 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +68 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +11 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api/index.html +1186 -1384
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api.md +817 -1291
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +126 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-vite-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2641 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-database-reference-api.md +1055 -158
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api/index.html +311 -249
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api.md +72 -54
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +509 -0
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +182 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api/index.html +7 -26
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api.md +13 -23
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +121 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +203 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api/index.html +26 -5
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api.md +22 -22
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api/index.html +5 -15
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api.md +0 -13
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +639 -0
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +100 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +24 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +136 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api/index.html +7 -7
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api.md +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +16 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +176 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api/index.html +10 -11
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api.md +7 -8
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +188 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/rules-compat/index.html +87 -57
- package/dist/serve/{docs-ui → site-ui}/docs/rules-compat.md +84 -54
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +51 -0
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +106 -0
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +41 -0
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +67 -0
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +159 -0
- package/dist/serve/{docs-ui → site-ui}/docs/secure/rules-standard-library.md +2 -2
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +47 -0
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +95 -0
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +82 -0
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +37 -0
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +75 -0
- package/dist/serve/{docs-ui → site-ui}/docs/storage-compat/index.html +8 -8
- package/dist/serve/{docs-ui → site-ui}/docs/storage-compat.md +5 -5
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +132 -0
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +861 -0
- package/dist/serve/site-ui/docs/trust/rules-standard-library.md +344 -0
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +582 -0
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +448 -0
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +14 -0
- package/dist/serve/{docs-ui → site-ui}/docs/tutorial/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/tutorial.md +1 -1
- package/dist/serve/site-ui/examples/chess/index.html +2 -0
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +2 -0
- package/dist/serve/site-ui/firestore/index.html +11 -0
- package/dist/serve/site-ui/index.html +11 -0
- package/dist/serve/{docs-ui → site-ui}/llms.txt +6 -2
- package/dist/serve/site-ui/rtdb/index.html +11 -0
- package/dist/serve/site-ui/settings/index.html +11 -0
- package/dist/serve/site-ui/storage/index.html +11 -0
- package/dist/serve/site-ui/studio-routes.json +1 -0
- package/dist/serve/site-ui/traffic/index.html +11 -0
- package/dist/serve/standalone-assets.d.ts +4 -10
- package/dist/serve/standalone-assets.d.ts.map +1 -1
- package/dist/serve/standalone-assets.js +8 -21
- package/dist/serve/standalone-assets.js.map +1 -1
- package/dist/serve/vite-ai-config.d.ts +2 -0
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +4 -0
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-functions-development.d.ts +29 -0
- package/dist/serve/vite-functions-development.d.ts.map +1 -0
- package/dist/serve/vite-functions-development.js +150 -0
- package/dist/serve/vite-functions-development.js.map +1 -0
- package/dist/serve/vite-generation-bridge.d.ts +17 -0
- package/dist/serve/vite-generation-bridge.d.ts.map +1 -0
- package/dist/serve/vite-generation-bridge.js +47 -0
- package/dist/serve/vite-generation-bridge.js.map +1 -0
- package/dist/serve/vite-generation-functions.d.ts +35 -0
- package/dist/serve/vite-generation-functions.d.ts.map +1 -0
- package/dist/serve/vite-generation-functions.js +46 -0
- package/dist/serve/vite-generation-functions.js.map +1 -0
- package/dist/serve/vite-generation-middleware.d.ts +10 -0
- package/dist/serve/vite-generation-middleware.d.ts.map +1 -0
- package/dist/serve/vite-generation-middleware.js +40 -0
- package/dist/serve/vite-generation-middleware.js.map +1 -0
- package/dist/serve/vite-generation-rules-watch.d.ts +8 -0
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -0
- package/dist/serve/vite-generation-rules-watch.js +33 -0
- package/dist/serve/vite-generation-rules-watch.js.map +1 -0
- package/dist/serve/vite-module-swap.d.ts +16 -0
- package/dist/serve/vite-module-swap.d.ts.map +1 -0
- package/dist/serve/vite-module-swap.js +96 -0
- package/dist/serve/vite-module-swap.js.map +1 -0
- package/dist/serve/vite-page-runtime.d.ts +29 -0
- package/dist/serve/vite-page-runtime.d.ts.map +1 -0
- package/dist/serve/vite-page-runtime.js +71 -0
- package/dist/serve/vite-page-runtime.js.map +1 -0
- package/dist/serve/vite-plugin.d.ts +44 -4
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +62 -864
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts +57 -0
- package/dist/serve/vite-sandbox-generation.d.ts.map +1 -0
- package/dist/serve/vite-sandbox-generation.js +178 -0
- package/dist/serve/vite-sandbox-generation.js.map +1 -0
- package/dist/serve/vite-worker-runtime.d.ts +1 -1
- package/dist/serve/vite-worker-runtime.d.ts.map +1 -1
- package/dist/serve/vite-worker-runtime.js +8 -4
- package/dist/serve/vite-worker-runtime.js.map +1 -1
- package/dist/serve/worker/client/disconnect.d.ts.map +1 -1
- package/dist/serve/worker/client/disconnect.js +2 -0
- package/dist/serve/worker/client/disconnect.js.map +1 -1
- package/dist/serve/worker/client/handles.d.ts +5 -0
- package/dist/serve/worker/client/handles.d.ts.map +1 -1
- package/dist/serve/worker/client/handles.js.map +1 -1
- package/dist/serve/worker/client/pagehide.d.ts +13 -0
- package/dist/serve/worker/client/pagehide.d.ts.map +1 -0
- package/dist/serve/worker/client/pagehide.js +19 -0
- package/dist/serve/worker/client/pagehide.js.map +1 -0
- package/dist/serve/worker/client/rtdb-admin.d.ts +8 -0
- package/dist/serve/worker/client/rtdb-admin.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-admin.js +39 -0
- package/dist/serve/worker/client/rtdb-admin.js.map +1 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts +15 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.js +45 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -0
- package/dist/serve/worker/client/rtdb-controls.d.ts +6 -0
- package/dist/serve/worker/client/rtdb-controls.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-controls.js +8 -0
- package/dist/serve/worker/client/rtdb-controls.js.map +1 -0
- package/dist/serve/worker/client/rtdb-listeners.d.ts +24 -0
- package/dist/serve/worker/client/rtdb-listeners.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-listeners.js +262 -0
- package/dist/serve/worker/client/rtdb-listeners.js.map +1 -0
- package/dist/serve/worker/client/rtdb-reads.d.ts +4 -0
- package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-reads.js +11 -0
- package/dist/serve/worker/client/rtdb-reads.js.map +1 -0
- package/dist/serve/worker/client/rtdb-references.d.ts +19 -0
- package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-references.js +63 -0
- package/dist/serve/worker/client/rtdb-references.js.map +1 -0
- package/dist/serve/worker/client/rtdb-snapshots.d.ts +20 -0
- package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-snapshots.js +64 -0
- package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -0
- package/dist/serve/worker/client/rtdb-transactions.d.ts +14 -0
- package/dist/serve/worker/client/rtdb-transactions.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-transactions.js +34 -0
- package/dist/serve/worker/client/rtdb-transactions.js.map +1 -0
- package/dist/serve/worker/client/rtdb-writes.d.ts +8 -0
- package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-writes.js +65 -0
- package/dist/serve/worker/client/rtdb-writes.js.map +1 -0
- package/dist/serve/worker/client.d.ts +0 -2
- package/dist/serve/worker/client.d.ts.map +1 -1
- package/dist/serve/worker/client.js +0 -2
- package/dist/serve/worker/client.js.map +1 -1
- package/dist/serve/worker/entry.js +2 -2
- package/dist/serve/worker/entry.js.map +1 -1
- package/dist/serve/worker/host/dispatch.d.ts +2 -0
- package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
- package/dist/serve/worker/host/dispatch.js +24 -2
- package/dist/serve/worker/host/dispatch.js.map +1 -1
- package/dist/serve/worker/host/rtdb.d.ts +6 -2
- package/dist/serve/worker/host/rtdb.d.ts.map +1 -1
- package/dist/serve/worker/host/rtdb.js +224 -2
- package/dist/serve/worker/host/rtdb.js.map +1 -1
- package/dist/serve/worker/host/studio.d.ts.map +1 -1
- package/dist/serve/worker/host/studio.js +2 -0
- package/dist/serve/worker/host/studio.js.map +1 -1
- package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
- package/dist/serve/worker/host/subscriptions.js +3 -3
- package/dist/serve/worker/host/subscriptions.js.map +1 -1
- package/dist/serve/worker/host.d.ts +1 -1
- package/dist/serve/worker/host.d.ts.map +1 -1
- package/dist/serve/worker/host.js +1 -1
- package/dist/serve/worker/host.js.map +1 -1
- package/dist/serve/worker/index.d.ts +16 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +17 -4
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/protocol.d.ts +57 -0
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/rtdb-value-equality.d.ts +3 -0
- package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -0
- package/dist/serve/worker/rtdb-value-equality.js +18 -0
- package/dist/serve/worker/rtdb-value-equality.js.map +1 -0
- package/dist/serve/worker/serve-init.js +2 -2
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/serve/worker/service-worker-relay.js +2 -2
- package/dist/serve/worker/service-worker-relay.js.map +1 -1
- package/package.json +7 -5
- package/src/assurance/.generated/conformance-verdicts.ts +120 -75
- package/src/cli/serve.ts +216 -308
- package/src/cli/service-command-records/database-rules-generate.ts +3 -0
- package/src/cli/service-command-records/database-rules-lint.ts +3 -0
- package/src/cli/service-command-records/database-rules-simulate.ts +3 -0
- package/src/cli/service-command-records/database-rules-validate.ts +3 -0
- package/src/cli/service-command-records/firestore-indexes-generate.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-lint.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-resolve.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-simulate.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-validate.ts +3 -0
- package/src/cli/service-command-records/storage-rules-lint.ts +3 -0
- package/src/cli/service-command-records/storage-rules-simulate.ts +3 -0
- package/src/cli/service-commands.generated.ts +27 -0
- package/src/cli/service-commands.test.ts +43 -0
- package/src/cli/service-commands.ts +36 -51
- package/src/conformance/.generated/can-i-use-browser.ts +1 -1
- package/src/conformance/.generated/can-i-use.ts +1 -1
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/functions-rtdb/development-runtime.ts +299 -0
- package/src/serve/bridge-mount.ts +253 -19
- package/src/serve/bundler.ts +17 -36
- package/src/serve/entries/app-client.ts +5 -4
- package/src/serve/entries/auth-helper-core.ts +83 -30
- package/src/serve/entries/database.ts +180 -57
- package/src/serve/entries/init.ts +30 -20
- package/src/serve/html-injection.ts +65 -0
- package/src/serve/namespace.ts +26 -169
- package/src/serve/runtime/worker-generation.ts +29 -7
- package/src/serve/runtime/worker-replacement.ts +1 -1
- package/src/serve/sandbox-session.ts +233 -0
- package/src/serve/server.ts +20 -5
- package/src/serve/site-tree.ts +146 -0
- package/src/serve/standalone-assets.ts +9 -26
- package/src/serve/vite-ai-config.ts +8 -0
- package/src/serve/vite-functions-development.ts +201 -0
- package/src/serve/vite-generation-bridge.ts +66 -0
- package/src/serve/vite-generation-functions.ts +78 -0
- package/src/serve/vite-generation-middleware.ts +56 -0
- package/src/serve/vite-generation-rules-watch.ts +37 -0
- package/src/serve/vite-module-swap.ts +119 -0
- package/src/serve/vite-page-runtime.ts +100 -0
- package/src/serve/vite-plugin.ts +78 -882
- package/src/serve/vite-sandbox-generation.ts +255 -0
- package/src/serve/vite-worker-runtime.ts +12 -5
- package/src/serve/worker/client/disconnect.ts +3 -1
- package/src/serve/worker/client/handles.ts +5 -0
- package/src/serve/worker/client/pagehide.ts +31 -0
- package/src/serve/worker/client/rtdb-admin.ts +74 -0
- package/src/serve/worker/client/rtdb-connection-lifecycle.ts +52 -0
- package/src/serve/worker/client/rtdb-controls.ts +8 -0
- package/src/serve/worker/client/rtdb-listeners.ts +337 -0
- package/src/serve/worker/client/rtdb-reads.ts +12 -0
- package/src/serve/worker/client/rtdb-references.ts +85 -0
- package/src/serve/worker/client/rtdb-snapshots.ts +118 -0
- package/src/serve/worker/client/rtdb-transactions.ts +51 -0
- package/src/serve/worker/client/rtdb-writes.ts +74 -0
- package/src/serve/worker/client.ts +0 -2
- package/src/serve/worker/entry.ts +2 -2
- package/src/serve/worker/host/dispatch.ts +22 -2
- package/src/serve/worker/host/rtdb.ts +243 -2
- package/src/serve/worker/host/studio.ts +2 -0
- package/src/serve/worker/host/subscriptions.ts +8 -4
- package/src/serve/worker/host.ts +1 -1
- package/src/serve/worker/index.ts +58 -10
- package/src/serve/worker/protocol.ts +23 -2
- package/src/serve/worker/rtdb-value-equality.ts +17 -0
- package/src/serve/worker/serve-init.ts +2 -2
- package/src/serve/worker/service-worker-relay.ts +2 -2
- package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +0 -1
- package/dist/serve/docs-ui/docs/_rhythm/index.html +0 -100
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +0 -43
- package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +0 -26
- package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +0 -70
- package/dist/serve/docs-ui/docs/api-reference/index.html +0 -68
- package/dist/serve/docs-ui/docs/build/ai-logic/index.html +0 -64
- package/dist/serve/docs-ui/docs/build/authentication/index.html +0 -66
- package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +0 -70
- package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +0 -71
- package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +0 -66
- package/dist/serve/docs-ui/docs/build/realtime-database/index.html +0 -67
- package/dist/serve/docs-ui/docs/conformance-scores/index.html +0 -50
- package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +0 -531
- package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +0 -73
- package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +0 -29
- package/dist/serve/docs-ui/docs/get-started/start-building/index.html +0 -33
- package/dist/serve/docs-ui/docs/messaging-compat/index.html +0 -265
- package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +0 -28
- package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +0 -74
- package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +0 -45
- package/dist/serve/docs-ui/docs/overview/index.html +0 -17
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +0 -186
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +0 -318
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +0 -160
- package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +0 -425
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +0 -60
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +0 -507
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +0 -258
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +0 -51
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +0 -308
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +0 -68
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +0 -11
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +0 -126
- package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +0 -1852
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +0 -509
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +0 -182
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +0 -121
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +0 -203
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +0 -639
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +0 -100
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +0 -24
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +0 -136
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +0 -16
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +0 -176
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +0 -188
- package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +0 -51
- package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +0 -106
- package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +0 -41
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +0 -67
- package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +0 -159
- package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +0 -47
- package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +0 -95
- package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +0 -82
- package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +0 -37
- package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +0 -75
- package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +0 -132
- package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +0 -14
- package/dist/serve/docs-ui/index.html +0 -1
- package/dist/serve/studio-ui/assets/RulesCodeEditor-BDlH-5lp.js +0 -23
- package/dist/serve/studio-ui/assets/index-Bf9SSE8L.js +0 -1218
- package/dist/serve/studio-ui/assets/index-BlSGru_r.css +0 -1
- package/dist/serve/studio-ui/assets/seed-D_UjxfOU.js +0 -20
- package/dist/serve/studio-ui/index.html +0 -32
- package/dist/serve/worker/client/rtdb.d.ts +0 -36
- package/dist/serve/worker/client/rtdb.d.ts.map +0 -1
- package/dist/serve/worker/client/rtdb.js +0 -241
- package/dist/serve/worker/client/rtdb.js.map +0 -1
- package/src/serve/worker/client/rtdb.ts +0 -311
- /package/dist/serve/{docs-ui → site-ui}/404.html +0 -0
- /package/dist/serve/{docs-ui → site-ui}/_astro/_slug_.CXh9yTP1.css +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/_rhythm.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/set-up-your-agent.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/watch-and-review.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/work-with-an-agent.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ai-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/api-reference.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/app-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/auth-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/ai-logic.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/authentication.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-firestore.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-messaging.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/realtime-database.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/create-pyric-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/functions-rtdb-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/get-started/how-the-swap-works.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/get-started/start-building.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/index.html +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/resolve-runtime-status.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/see-whats-happening.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/shape-your-data.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/overview.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-app-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-storage-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-scripting-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-app-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-browser-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-browser-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-docs-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-credentials-node-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-register-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-sw-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-database-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-firestore-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-agents-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/audit-your-rules.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/firestore-rules-limits.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/read-a-denial.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/rtdb-rules-in-typescript.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/secure-it-with-rules.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/simulate-and-lint.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/write-a-rules-test-suite.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ship/ship-to-production.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ship/test-in-node.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/trust/how-we-know-it-matches-firebase.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/trust/versioning-and-compatibility.md +0 -0
- /package/dist/serve/{studio-ui → site-ui}/pyric-logo.svg +0 -0
|
@@ -55,7 +55,7 @@ import { createIndexedDBBackend } from 'pyric/sandbox';
|
|
|
55
55
|
|
|
56
56
|
import {
|
|
57
57
|
handleMessage,
|
|
58
|
-
|
|
58
|
+
cleanupPortWithDisconnect,
|
|
59
59
|
type HostCtx,
|
|
60
60
|
type PortLike,
|
|
61
61
|
} from './host.js';
|
|
@@ -188,7 +188,7 @@ workerScope.onconnect = (e: MessageEvent) => {
|
|
|
188
188
|
// best-effort; subscriptions also GC when the worker itself dies.
|
|
189
189
|
port.addEventListener('close', () => {
|
|
190
190
|
retirement.disconnect(port);
|
|
191
|
-
if (_ctx)
|
|
191
|
+
if (_ctx) void cleanupPortWithDisconnect(_ctx, port as unknown as PortLike).catch(() => undefined);
|
|
192
192
|
});
|
|
193
193
|
};
|
|
194
194
|
|
|
@@ -61,7 +61,7 @@ import { isFirestoreReadOp, handleFirestoreReadOp } from './firestore-reads.js';
|
|
|
61
61
|
import { isFirestoreWriteOp, handleFirestoreWriteOp } from './firestore-writes.js';
|
|
62
62
|
import { isRulesOp, handleRulesOp } from './rules.js';
|
|
63
63
|
import { isAdminFirestoreOp, handleAdminFirestoreOp } from './admin-firestore.js';
|
|
64
|
-
import { isRtdbOp, handleRtdbOp } from './rtdb.js';
|
|
64
|
+
import { isRtdbOp, handleRtdbOp, drainPortRtdbDisconnects, forgetPortRtdbConnection } from './rtdb.js';
|
|
65
65
|
import { isStorageOp, handleStorageOp } from './storage.js';
|
|
66
66
|
import { isConnectionOp, handleConnectionOp } from './connection.js';
|
|
67
67
|
import { isStudioOp, handleStudioOp } from './studio.js';
|
|
@@ -256,7 +256,7 @@ async function dispatchMessage(
|
|
|
256
256
|
}
|
|
257
257
|
} else if (msg.t === 'disconnect') {
|
|
258
258
|
try {
|
|
259
|
-
|
|
259
|
+
await cleanupPortWithDisconnect(ctx, port);
|
|
260
260
|
ok(port, msg.id, undefined);
|
|
261
261
|
} catch (error) {
|
|
262
262
|
fail(port, msg.id, error);
|
|
@@ -266,6 +266,25 @@ async function dispatchMessage(
|
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
+
/** Best-effort close path: drain queued RTDB work before session teardown. */
|
|
270
|
+
export async function cleanupPortWithDisconnect(ctx: HostCtx, port: PortLike): Promise<void> {
|
|
271
|
+
let drainFailure: unknown;
|
|
272
|
+
try {
|
|
273
|
+
await drainPortRtdbDisconnects(ctx, port);
|
|
274
|
+
} catch (error) {
|
|
275
|
+
drainFailure = error;
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
cleanupPort(ctx, port);
|
|
279
|
+
} catch (error) {
|
|
280
|
+
if (drainFailure !== undefined) {
|
|
281
|
+
throw new AggregateError([drainFailure, error], 'Multiple SharedWorker port resources failed to tear down');
|
|
282
|
+
}
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
if (drainFailure !== undefined) throw drainFailure;
|
|
286
|
+
}
|
|
287
|
+
|
|
269
288
|
// ─── Port cleanup ─────────────────────────────────────────────────────────
|
|
270
289
|
|
|
271
290
|
/**
|
|
@@ -303,6 +322,7 @@ export function cleanupPort(ctx: HostCtx, port: PortLike): void {
|
|
|
303
322
|
// Presence: best-effort remove this port's logical client when it was the
|
|
304
323
|
// last association (lease expiry remains the correctness path).
|
|
305
324
|
attempt(() => { cleanupPortPresence(ctx, port); });
|
|
325
|
+
attempt(() => { forgetPortRtdbConnection(ctx, port); });
|
|
306
326
|
|
|
307
327
|
const portSubs = ctx.subs.get(port);
|
|
308
328
|
if (portSubs) {
|
|
@@ -14,23 +14,71 @@ import {
|
|
|
14
14
|
ref as rtdbRef,
|
|
15
15
|
get as rtdbGet,
|
|
16
16
|
set as rtdbSet,
|
|
17
|
+
setPriority as rtdbSetPriority,
|
|
18
|
+
setWithPriority as rtdbSetWithPriority,
|
|
17
19
|
update as rtdbUpdate,
|
|
18
20
|
remove as rtdbRemove,
|
|
21
|
+
onDisconnect as rtdbOnDisconnect,
|
|
19
22
|
serverTimestamp as rtdbServerTimestamp,
|
|
23
|
+
runTransaction as rtdbRunTransaction,
|
|
24
|
+
QUERY_SYMBOL,
|
|
20
25
|
sandbox as rtdbSandbox,
|
|
21
26
|
type DataSnapshot,
|
|
27
|
+
type DatabaseReference,
|
|
28
|
+
type Query,
|
|
22
29
|
} from 'pyric/database';
|
|
30
|
+
import {
|
|
31
|
+
DisconnectOperationQueue,
|
|
32
|
+
type DisconnectOperation,
|
|
33
|
+
} from 'pyric/database/internal';
|
|
23
34
|
|
|
24
|
-
import type { OpMessage } from '../protocol.js';
|
|
35
|
+
import type { OpMessage, RtdbQuerySpec } from '../protocol.js';
|
|
25
36
|
import { type HostCtx, type PortLike, ok, fail, bestEffortFlush } from '../host-context.js';
|
|
26
37
|
import { lensRtdb } from './core.js';
|
|
38
|
+
import { sameRtdbValue } from '../rtdb-value-equality.js';
|
|
27
39
|
|
|
28
40
|
export function rtdbSnapToWire(snap: DataSnapshot): unknown {
|
|
41
|
+
const entries: Array<{
|
|
42
|
+
key: string;
|
|
43
|
+
value: unknown;
|
|
44
|
+
priority: string | number | null;
|
|
45
|
+
exportValue: unknown;
|
|
46
|
+
}> = [];
|
|
47
|
+
snap.forEach((child) => {
|
|
48
|
+
if (child.key !== null) {
|
|
49
|
+
entries.push({
|
|
50
|
+
key: child.key,
|
|
51
|
+
value: child.val(),
|
|
52
|
+
priority: child.priority,
|
|
53
|
+
exportValue: child.exportVal(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
29
57
|
return {
|
|
30
58
|
key: snap.key,
|
|
31
59
|
exists: snap.exists(),
|
|
32
60
|
value: snap.val(),
|
|
33
61
|
size: snap.size,
|
|
62
|
+
priority: snap.priority,
|
|
63
|
+
exportValue: snap.exportVal(),
|
|
64
|
+
entries,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function rtdbTarget(
|
|
69
|
+
db: Parameters<typeof rtdbRef>[0],
|
|
70
|
+
path: string,
|
|
71
|
+
spec?: RtdbQuerySpec,
|
|
72
|
+
): DatabaseReference | Query {
|
|
73
|
+
const targetRef = rtdbRef(db, path);
|
|
74
|
+
if (!spec) return targetRef;
|
|
75
|
+
return {
|
|
76
|
+
ref: targetRef,
|
|
77
|
+
_spec: spec,
|
|
78
|
+
[QUERY_SYMBOL]: true,
|
|
79
|
+
isEqual: (other) => other === null ? false : other.ref === targetRef && other._spec === spec,
|
|
80
|
+
toJSON: () => targetRef.toString(),
|
|
81
|
+
toString: () => targetRef.toString(),
|
|
34
82
|
};
|
|
35
83
|
}
|
|
36
84
|
|
|
@@ -50,12 +98,102 @@ function resolveRtdbSentinels(value: unknown): unknown {
|
|
|
50
98
|
const RTDB_METHODS = new Set<string>([
|
|
51
99
|
'rtdb.get',
|
|
52
100
|
'rtdb.set',
|
|
101
|
+
'rtdb.setPriority',
|
|
102
|
+
'rtdb.setWithPriority',
|
|
53
103
|
'rtdb.update',
|
|
54
104
|
'rtdb.remove',
|
|
55
105
|
'rtdb.push',
|
|
56
106
|
'rtdb.adminSnapshot',
|
|
107
|
+
'rtdb.onDisconnectSet',
|
|
108
|
+
'rtdb.onDisconnectUpdate',
|
|
109
|
+
'rtdb.onDisconnectRemove',
|
|
110
|
+
'rtdb.onDisconnectCancel',
|
|
111
|
+
'rtdb.goOffline',
|
|
112
|
+
'rtdb.goOnline',
|
|
113
|
+
'rtdb.transactionCommit',
|
|
57
114
|
]);
|
|
58
115
|
|
|
116
|
+
interface PortDisconnectMetadata {
|
|
117
|
+
actAs?: OpMessage['actAs'];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
type PortDisconnectOperation = DisconnectOperation<PortDisconnectMetadata>;
|
|
121
|
+
|
|
122
|
+
const disconnectQueues = new WeakMap<HostCtx, Map<PortLike, DisconnectOperationQueue<PortDisconnectMetadata>>>();
|
|
123
|
+
const offlinePorts = new WeakMap<HostCtx, Set<PortLike>>();
|
|
124
|
+
|
|
125
|
+
function offlinePortSet(ctx: HostCtx): Set<PortLike> {
|
|
126
|
+
let ports = offlinePorts.get(ctx);
|
|
127
|
+
if (!ports) offlinePorts.set(ctx, ports = new Set());
|
|
128
|
+
return ports;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function portQueue(ctx: HostCtx, port: PortLike): DisconnectOperationQueue<PortDisconnectMetadata> {
|
|
132
|
+
let ports = disconnectQueues.get(ctx);
|
|
133
|
+
if (!ports) disconnectQueues.set(ctx, ports = new Map());
|
|
134
|
+
let queue = ports.get(port);
|
|
135
|
+
if (!queue) ports.set(port, queue = new DisconnectOperationQueue());
|
|
136
|
+
return queue;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function validateDisconnectOperation(ctx: HostCtx, port: PortLike, operation: PortDisconnectOperation): Promise<void> {
|
|
140
|
+
const db = lensRtdb(ctx, operation.actAs, port);
|
|
141
|
+
const handle = rtdbOnDisconnect(rtdbRef(db, operation.path));
|
|
142
|
+
if (operation.kind === 'update') await handle.update(operation.values);
|
|
143
|
+
else if (operation.kind === 'remove') await handle.remove();
|
|
144
|
+
else if (operation.priority !== undefined) await handle.setWithPriority(operation.value, operation.priority);
|
|
145
|
+
else await handle.set(operation.value as never);
|
|
146
|
+
await handle.cancel();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function queueDisconnectOperation(ctx: HostCtx, port: PortLike, operation: PortDisconnectOperation): Promise<void> {
|
|
150
|
+
await validateDisconnectOperation(ctx, port, operation);
|
|
151
|
+
const queue = portQueue(ctx, port);
|
|
152
|
+
queue.set(operation);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export async function drainPortRtdbDisconnects(ctx: HostCtx, port: PortLike): Promise<void> {
|
|
156
|
+
const ports = disconnectQueues.get(ctx);
|
|
157
|
+
const queue = ports?.get(port);
|
|
158
|
+
if (!queue) return;
|
|
159
|
+
ports!.delete(port);
|
|
160
|
+
const failures: unknown[] = [];
|
|
161
|
+
for (const operation of queue.takeAll()) {
|
|
162
|
+
try {
|
|
163
|
+
const db = lensRtdb(ctx, operation.actAs, port);
|
|
164
|
+
const target = rtdbRef(db, operation.path);
|
|
165
|
+
if (operation.kind === 'update') await rtdbUpdate(target, resolveRtdbSentinels(operation.values) as Record<string, unknown>);
|
|
166
|
+
else if (operation.kind === 'remove') await rtdbRemove(target);
|
|
167
|
+
else if (
|
|
168
|
+
operation.mergeAfterChildRegistration && operation.value !== null &&
|
|
169
|
+
typeof operation.value === 'object' && !Array.isArray(operation.value)
|
|
170
|
+
) await rtdbUpdate(target, resolveRtdbSentinels(operation.value) as Record<string, unknown>);
|
|
171
|
+
else if (operation.priority !== undefined) {
|
|
172
|
+
await rtdbSetWithPriority(
|
|
173
|
+
target,
|
|
174
|
+
resolveRtdbSentinels(operation.value) as never,
|
|
175
|
+
operation.priority,
|
|
176
|
+
);
|
|
177
|
+
} else await rtdbSet(target, resolveRtdbSentinels(operation.value) as never);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
failures.push(error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
await bestEffortFlush(ctx);
|
|
183
|
+
if (failures.length === 1) throw failures[0];
|
|
184
|
+
if (failures.length > 1) throw new AggregateError(failures, 'Multiple SharedWorker onDisconnect operations failed');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function clearAllRtdbDisconnects(ctx: HostCtx): void {
|
|
188
|
+
disconnectQueues.get(ctx)?.clear();
|
|
189
|
+
offlinePorts.get(ctx)?.clear();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function forgetPortRtdbConnection(ctx: HostCtx, port: PortLike): void {
|
|
193
|
+
disconnectQueues.get(ctx)?.delete(port);
|
|
194
|
+
offlinePorts.get(ctx)?.delete(port);
|
|
195
|
+
}
|
|
196
|
+
|
|
59
197
|
export function isRtdbOp(method: OpMessage['method']): boolean {
|
|
60
198
|
return RTDB_METHODS.has(method);
|
|
61
199
|
}
|
|
@@ -69,7 +207,7 @@ export async function handleRtdbOp(
|
|
|
69
207
|
case 'rtdb.get': {
|
|
70
208
|
try {
|
|
71
209
|
const db = lensRtdb(ctx, msg.actAs, port);
|
|
72
|
-
ok(port, msg.id, rtdbSnapToWire(await rtdbGet(
|
|
210
|
+
ok(port, msg.id, rtdbSnapToWire(await rtdbGet(rtdbTarget(db, msg.path, msg.query))));
|
|
73
211
|
} catch (e) { fail(port, msg.id, e); }
|
|
74
212
|
break;
|
|
75
213
|
}
|
|
@@ -85,6 +223,30 @@ export async function handleRtdbOp(
|
|
|
85
223
|
break;
|
|
86
224
|
}
|
|
87
225
|
|
|
226
|
+
case 'rtdb.setPriority': {
|
|
227
|
+
try {
|
|
228
|
+
const db = lensRtdb(ctx, msg.actAs, port);
|
|
229
|
+
await rtdbSetPriority(rtdbRef(db, msg.path), msg.priority);
|
|
230
|
+
await bestEffortFlush(ctx);
|
|
231
|
+
ok(port, msg.id, null);
|
|
232
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
case 'rtdb.setWithPriority': {
|
|
237
|
+
try {
|
|
238
|
+
const db = lensRtdb(ctx, msg.actAs, port);
|
|
239
|
+
await rtdbSetWithPriority(
|
|
240
|
+
rtdbRef(db, msg.path),
|
|
241
|
+
resolveRtdbSentinels(msg.value) as never,
|
|
242
|
+
msg.priority,
|
|
243
|
+
);
|
|
244
|
+
await bestEffortFlush(ctx);
|
|
245
|
+
ok(port, msg.id, null);
|
|
246
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
|
|
88
250
|
case 'rtdb.update': {
|
|
89
251
|
try {
|
|
90
252
|
const db = lensRtdb(ctx, msg.actAs, port);
|
|
@@ -129,6 +291,85 @@ export async function handleRtdbOp(
|
|
|
129
291
|
break;
|
|
130
292
|
}
|
|
131
293
|
|
|
294
|
+
case 'rtdb.onDisconnectSet': {
|
|
295
|
+
try {
|
|
296
|
+
await queueDisconnectOperation(ctx, port, {
|
|
297
|
+
kind: 'set', path: msg.path, value: resolveRtdbSentinels(msg.value), priority: msg.priority, actAs: msg.actAs,
|
|
298
|
+
});
|
|
299
|
+
ok(port, msg.id, null);
|
|
300
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
case 'rtdb.onDisconnectUpdate': {
|
|
305
|
+
try {
|
|
306
|
+
await queueDisconnectOperation(ctx, port, {
|
|
307
|
+
kind: 'update', path: msg.path, values: resolveRtdbSentinels(msg.values) as Record<string, unknown>, actAs: msg.actAs,
|
|
308
|
+
});
|
|
309
|
+
ok(port, msg.id, null);
|
|
310
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
case 'rtdb.onDisconnectRemove': {
|
|
315
|
+
try {
|
|
316
|
+
await queueDisconnectOperation(ctx, port, { kind: 'remove', path: msg.path, actAs: msg.actAs });
|
|
317
|
+
ok(port, msg.id, null);
|
|
318
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
case 'rtdb.onDisconnectCancel': {
|
|
323
|
+
const queue = portQueue(ctx, port);
|
|
324
|
+
queue.cancel(msg.path);
|
|
325
|
+
ok(port, msg.id, null);
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
case 'rtdb.goOffline': {
|
|
330
|
+
try {
|
|
331
|
+
const offline = offlinePortSet(ctx);
|
|
332
|
+
if (!offline.has(port)) {
|
|
333
|
+
offline.add(port);
|
|
334
|
+
await drainPortRtdbDisconnects(ctx, port);
|
|
335
|
+
}
|
|
336
|
+
ok(port, msg.id, null);
|
|
337
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
case 'rtdb.goOnline': {
|
|
342
|
+
offlinePortSet(ctx).delete(port);
|
|
343
|
+
ok(port, msg.id, null);
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
case 'rtdb.transactionCommit': {
|
|
348
|
+
try {
|
|
349
|
+
const db = lensRtdb(ctx, msg.actAs, port);
|
|
350
|
+
const target = rtdbRef(db, msg.path);
|
|
351
|
+
let retry = false;
|
|
352
|
+
const result = await rtdbRunTransaction(
|
|
353
|
+
target,
|
|
354
|
+
(current) => {
|
|
355
|
+
if (!sameRtdbValue(current, msg.expected)) {
|
|
356
|
+
retry = true;
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
359
|
+
return resolveRtdbSentinels(msg.value) as never;
|
|
360
|
+
},
|
|
361
|
+
{ applyLocally: msg.applyLocally },
|
|
362
|
+
);
|
|
363
|
+
await bestEffortFlush(ctx);
|
|
364
|
+
ok(port, msg.id, {
|
|
365
|
+
retry,
|
|
366
|
+
committed: result.committed,
|
|
367
|
+
snapshot: rtdbSnapToWire(result.snapshot),
|
|
368
|
+
});
|
|
369
|
+
} catch (e) { fail(port, msg.id, e); }
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
|
|
132
373
|
default: {
|
|
133
374
|
fail(port, msg.id, new Error(`Unknown method: ${String((msg as { method: unknown }).method)}`));
|
|
134
375
|
}
|
|
@@ -11,6 +11,7 @@ import { setRules } from 'pyric/sandbox/firestore';
|
|
|
11
11
|
|
|
12
12
|
import type { OpMessage } from '../protocol.js';
|
|
13
13
|
import { type HostCtx, type PortLike, ok, fail } from '../host-context.js';
|
|
14
|
+
import { clearAllRtdbDisconnects } from './rtdb.js';
|
|
14
15
|
|
|
15
16
|
/** The Studio control op methods routed to {@link handleStudioOp}. */
|
|
16
17
|
const STUDIO_METHODS = new Set<string>([
|
|
@@ -45,6 +46,7 @@ export async function handleStudioOp(
|
|
|
45
46
|
// payload's `errors` so Studio can surface a half-clear instead of
|
|
46
47
|
// reporting a clean reset.
|
|
47
48
|
try {
|
|
49
|
+
clearAllRtdbDisconnects(ctx);
|
|
48
50
|
const { errors } = await ctx.sandbox.resetAll();
|
|
49
51
|
// `resetAll` swapped the env, wiping env-owned FIRESTORE rules (RTDB /
|
|
50
52
|
// storage rules live on their service objects and survive). Re-deploy
|
|
@@ -18,9 +18,9 @@ import {
|
|
|
18
18
|
type Query,
|
|
19
19
|
} from 'pyric/firestore';
|
|
20
20
|
import {
|
|
21
|
-
ref as rtdbRef,
|
|
22
21
|
onValue as rtdbOnValue,
|
|
23
22
|
type DatabaseReference,
|
|
23
|
+
type Query as RtdbQuery,
|
|
24
24
|
} from 'pyric/database';
|
|
25
25
|
|
|
26
26
|
import type { FirestoreSubMessage, RtdbValueSubMessage, UnsubMessage } from '../protocol.js';
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
resolveTarget,
|
|
35
35
|
serializeDocSnap,
|
|
36
36
|
} from './core.js';
|
|
37
|
-
import { rtdbSnapToWire } from './rtdb.js';
|
|
37
|
+
import { rtdbSnapToWire, rtdbTarget } from './rtdb.js';
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Session-bound sub registry (#754): the original sub message for every
|
|
@@ -155,9 +155,13 @@ export function handleRtdbSub(ctx: HostCtx, port: PortLike, msg: RtdbValueSubMes
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
try {
|
|
158
|
-
const ref =
|
|
158
|
+
const ref = rtdbTarget(
|
|
159
|
+
lensRtdb(ctx, msg.actAs, port),
|
|
160
|
+
msg.target.path,
|
|
161
|
+
msg.target.query,
|
|
162
|
+
);
|
|
159
163
|
const unsub = rtdbOnValue(
|
|
160
|
-
ref as DatabaseReference,
|
|
164
|
+
ref as DatabaseReference | RtdbQuery,
|
|
161
165
|
(snap) => post(port, { t: 'snap', subId: msg.subId, value: rtdbSnapToWire(snap) }),
|
|
162
166
|
);
|
|
163
167
|
portSubs.set(msg.subId, unsub);
|
package/src/serve/worker/host.ts
CHANGED
|
@@ -44,4 +44,4 @@ export {
|
|
|
44
44
|
listBranchNames,
|
|
45
45
|
} from './host/connection.js';
|
|
46
46
|
// The message dispatcher seam (entry.ts + tests) and per-port teardown.
|
|
47
|
-
export { handleMessage, cleanupPort } from './host/dispatch.js';
|
|
47
|
+
export { handleMessage, cleanupPort, cleanupPortWithDisconnect } from './host/dispatch.js';
|
|
@@ -19,6 +19,32 @@
|
|
|
19
19
|
* '@pyric/cli/serve/worker'` and reach the live SharedWorker backend.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
+
export {
|
|
23
|
+
PYRIC_WORKER_NAME,
|
|
24
|
+
PYRIC_WORKER_URL,
|
|
25
|
+
readPyricRuntimeManifest,
|
|
26
|
+
type PyricRuntimeManifest,
|
|
27
|
+
} from '../runtime/manifest.js';
|
|
28
|
+
export {
|
|
29
|
+
PYRIC_WORKER_GENERATION_KEY,
|
|
30
|
+
preflightWorkerEpochStorage,
|
|
31
|
+
rememberWorkerEpoch,
|
|
32
|
+
workerNameForEpoch,
|
|
33
|
+
} from '../runtime/worker-generation.js';
|
|
34
|
+
export {
|
|
35
|
+
createWorkerReplacement,
|
|
36
|
+
type WorkerReplacement,
|
|
37
|
+
} from '../runtime/worker-replacement.js';
|
|
38
|
+
export {
|
|
39
|
+
onWorkerRuntimeReload,
|
|
40
|
+
retireWorkerRuntime,
|
|
41
|
+
} from './client/runtime-control.js';
|
|
42
|
+
export {
|
|
43
|
+
disconnectClient,
|
|
44
|
+
type DisconnectClientOptions,
|
|
45
|
+
} from './client/disconnect.js';
|
|
46
|
+
export { ownClientUntilPagehide } from './client/pagehide.js';
|
|
47
|
+
|
|
22
48
|
export {
|
|
23
49
|
// Bridge-peer relay seams (leaf-safe: ids are re-minted in-page, frames go
|
|
24
50
|
// over the worker port). The served page wires these into `connectBridge`'s
|
|
@@ -163,29 +189,51 @@ export {
|
|
|
163
189
|
getSnapshot,
|
|
164
190
|
// Sandbox-owned full reset (issue #359): Firestore + every registered service
|
|
165
191
|
resetAll,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
192
|
+
} from './client.js';
|
|
193
|
+
|
|
194
|
+
// RTDB bridge families are exported directly from their owning modules. This
|
|
195
|
+
// public package index is the sole aggregation point for the worker surface.
|
|
196
|
+
export { rtdbGetDatabase, rtdbRef, rtdbChild } from './client/rtdb-references.js';
|
|
197
|
+
export { rtdbGet } from './client/rtdb-reads.js';
|
|
198
|
+
export {
|
|
172
199
|
rtdbSet,
|
|
200
|
+
rtdbSetPriority,
|
|
201
|
+
rtdbSetWithPriority,
|
|
173
202
|
rtdbUpdate,
|
|
174
203
|
rtdbRemove,
|
|
175
204
|
rtdbPush,
|
|
205
|
+
} from './client/rtdb-writes.js';
|
|
206
|
+
export {
|
|
176
207
|
rtdbOnValue,
|
|
208
|
+
rtdbOnChildAdded,
|
|
209
|
+
rtdbOnChildChanged,
|
|
210
|
+
rtdbOnChildMoved,
|
|
211
|
+
rtdbOnChildRemoved,
|
|
177
212
|
rtdbOff,
|
|
213
|
+
} from './client/rtdb-listeners.js';
|
|
214
|
+
export { rtdbRunTransaction } from './client/rtdb-transactions.js';
|
|
215
|
+
export {
|
|
216
|
+
rtdbOnDisconnect,
|
|
217
|
+
rtdbGoOffline,
|
|
218
|
+
rtdbGoOnline,
|
|
219
|
+
RtdbOnDisconnect,
|
|
220
|
+
} from './client/rtdb-connection-lifecycle.js';
|
|
221
|
+
export {
|
|
178
222
|
rtdbServerTimestamp,
|
|
179
223
|
rtdbConnectDatabaseEmulator,
|
|
224
|
+
} from './client/rtdb-controls.js';
|
|
225
|
+
export {
|
|
180
226
|
adminReadRtdbState,
|
|
181
227
|
adminSetRtdbValue,
|
|
182
228
|
adminUpdateRtdbValue,
|
|
183
229
|
adminDeleteRtdbValue,
|
|
184
230
|
adminSubscribeRtdbValue,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
231
|
+
} from './client/rtdb-admin.js';
|
|
232
|
+
export type {
|
|
233
|
+
ClientRtdb,
|
|
234
|
+
RtdbRefHandle,
|
|
235
|
+
RtdbDataSnapshot,
|
|
236
|
+
} from './client/handles.js';
|
|
189
237
|
|
|
190
238
|
export type {
|
|
191
239
|
AuthPersistenceMode,
|
|
@@ -53,6 +53,7 @@ import { rehydrateDocValue } from 'pyric/firestore/internal/value-codec';
|
|
|
53
53
|
// The auth-lens contract and the cross-service event envelope are shared with
|
|
54
54
|
// the sandbox's event provenance — Studio's Action Center folds these verbatim.
|
|
55
55
|
import type { AuthLens, SandboxEvent, DenialContext } from 'pyric/sandbox';
|
|
56
|
+
import type { Query as RtdbQuery } from 'pyric/database';
|
|
56
57
|
// TYPE-ONLY (same rationale): the broker's own wire shapes for the
|
|
57
58
|
// `messaging.*` ops — all plain JSON, structured-clone-safe by construction.
|
|
58
59
|
import type {
|
|
@@ -401,12 +402,29 @@ export type OpMessage = (
|
|
|
401
402
|
| { t: 'op'; id: string; method: 'admin.setDocument'; path: string; data: unknown }
|
|
402
403
|
| { t: 'op'; id: string; method: 'admin.deleteDocument'; path: string }
|
|
403
404
|
| { t: 'op'; id: string; method: 'admin.readState'; path?: string; maxDepth?: number }
|
|
404
|
-
| { t: 'op'; id: string; method: 'rtdb.get'; path: string }
|
|
405
|
+
| { t: 'op'; id: string; method: 'rtdb.get'; path: string; query?: RtdbQuerySpec }
|
|
405
406
|
| { t: 'op'; id: string; method: 'rtdb.set'; path: string; value: unknown }
|
|
407
|
+
| { t: 'op'; id: string; method: 'rtdb.setPriority'; path: string; priority: string | number | null }
|
|
408
|
+
| { t: 'op'; id: string; method: 'rtdb.setWithPriority'; path: string; value: unknown; priority: string | number | null }
|
|
406
409
|
| { t: 'op'; id: string; method: 'rtdb.update'; path: string; values: Record<string, unknown> }
|
|
407
410
|
| { t: 'op'; id: string; method: 'rtdb.remove'; path: string }
|
|
408
411
|
| { t: 'op'; id: string; method: 'rtdb.push'; path: string; key: string; value?: unknown }
|
|
409
412
|
| { t: 'op'; id: string; method: 'rtdb.adminSnapshot' }
|
|
413
|
+
| { t: 'op'; id: string; method: 'rtdb.onDisconnectSet'; path: string; value: unknown; priority?: string | number | null }
|
|
414
|
+
| { t: 'op'; id: string; method: 'rtdb.onDisconnectUpdate'; path: string; values: Record<string, unknown> }
|
|
415
|
+
| { t: 'op'; id: string; method: 'rtdb.onDisconnectRemove'; path: string }
|
|
416
|
+
| { t: 'op'; id: string; method: 'rtdb.onDisconnectCancel'; path: string }
|
|
417
|
+
| { t: 'op'; id: string; method: 'rtdb.goOffline' }
|
|
418
|
+
| { t: 'op'; id: string; method: 'rtdb.goOnline' }
|
|
419
|
+
| {
|
|
420
|
+
t: 'op';
|
|
421
|
+
id: string;
|
|
422
|
+
method: 'rtdb.transactionCommit';
|
|
423
|
+
path: string;
|
|
424
|
+
expected: unknown;
|
|
425
|
+
value: unknown;
|
|
426
|
+
applyLocally?: boolean;
|
|
427
|
+
}
|
|
410
428
|
// Collection enumeration (Pyric Studio data browse): the modular SDK has no
|
|
411
429
|
// client `listCollections`, so the host enumerates the sandbox keyspace via
|
|
412
430
|
// `getInternalEnv(sandbox)`. Reply: `{ ids: string[] }`.
|
|
@@ -681,7 +699,7 @@ export interface EventSubMessage {
|
|
|
681
699
|
export interface RtdbValueSubMessage {
|
|
682
700
|
t: 'sub';
|
|
683
701
|
subId: string;
|
|
684
|
-
target: { service: 'rtdb'; path: string };
|
|
702
|
+
target: { service: 'rtdb'; path: string; query?: RtdbQuerySpec };
|
|
685
703
|
/** Mirrors Firestore subscriptions: absent/app-session uses this port's session. */
|
|
686
704
|
actAs?: AuthLens;
|
|
687
705
|
/** Mechanical op provenance — see the field's doc on {@link OpMessage}. */
|
|
@@ -690,6 +708,9 @@ export interface RtdbValueSubMessage {
|
|
|
690
708
|
relaySource?: 'remote';
|
|
691
709
|
}
|
|
692
710
|
|
|
711
|
+
/** Structured-clone-safe query plan carried by `pyric/database` Query values. */
|
|
712
|
+
export type RtdbQuerySpec = RtdbQuery['_spec'];
|
|
713
|
+
|
|
693
714
|
/**
|
|
694
715
|
* Stream a `generateContent` call as a SUBSCRIPTION (cdd-deltas #98.3:
|
|
695
716
|
* "chunks over the existing subscription/event mechanism"). Unlike the
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Browser-safe structural equality for values crossing the RTDB worker wire. */
|
|
2
|
+
export function sameRtdbValue(left: unknown, right: unknown): boolean {
|
|
3
|
+
if (Object.is(left, right)) return true;
|
|
4
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
5
|
+
return Array.isArray(left) && Array.isArray(right)
|
|
6
|
+
&& left.length === right.length
|
|
7
|
+
&& left.every((value, index) => sameRtdbValue(value, right[index]));
|
|
8
|
+
}
|
|
9
|
+
if (!left || !right || typeof left !== 'object' || typeof right !== 'object') return false;
|
|
10
|
+
const leftRecord = left as Record<string, unknown>;
|
|
11
|
+
const rightRecord = right as Record<string, unknown>;
|
|
12
|
+
const leftKeys = Object.keys(leftRecord).sort();
|
|
13
|
+
const rightKeys = Object.keys(rightRecord).sort();
|
|
14
|
+
return leftKeys.length === rightKeys.length && leftKeys.every(
|
|
15
|
+
(key, index) => key === rightKeys[index] && sameRtdbValue(leftRecord[key], rightRecord[key]),
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -33,7 +33,7 @@ import { getDatabase, sandbox as rtdbSandbox } from 'pyric/database';
|
|
|
33
33
|
import { getAuth, sandbox as authOps, type SeedUser } from 'pyric/auth';
|
|
34
34
|
import { getStorageSandbox } from 'pyric/storage';
|
|
35
35
|
import type { PersistenceBackend } from 'pyric/sandbox';
|
|
36
|
-
import {
|
|
36
|
+
import { createSandboxRoot } from 'pyric/sandbox/internal';
|
|
37
37
|
import {
|
|
38
38
|
primeEventHistory,
|
|
39
39
|
} from 'pyric/sandbox/internal';
|
|
@@ -485,7 +485,7 @@ export async function buildWorkerCtx(bootEnv: WorkerBootEnv): Promise<HostCtx> {
|
|
|
485
485
|
// plain-call wrapper doesn't need (nothing in this module uses it).
|
|
486
486
|
fetch: ((...args: Parameters<typeof fetch>) => ambientFetch(...args)) as typeof fetch,
|
|
487
487
|
};
|
|
488
|
-
const sandbox =
|
|
488
|
+
const sandbox = createSandboxRoot();
|
|
489
489
|
|
|
490
490
|
// Deploy permissive starter rules via admin-firestore.
|
|
491
491
|
// Callers override at runtime via the setRules op.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Session-aware Service Worker relay over the authoritative SharedWorker host. */
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
cleanupPortWithDisconnect,
|
|
4
4
|
handleMessage,
|
|
5
5
|
type HostCtx,
|
|
6
6
|
type PortLike,
|
|
@@ -53,7 +53,7 @@ export function createServiceWorkerRelay(options: {
|
|
|
53
53
|
if (!previous) return;
|
|
54
54
|
try {
|
|
55
55
|
const ctx = await options.getCtx();
|
|
56
|
-
|
|
56
|
+
await cleanupPortWithDisconnect(ctx, previous.port);
|
|
57
57
|
} catch (error) {
|
|
58
58
|
options.onError?.(error, envelope);
|
|
59
59
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.prose .conformance-flow{display:flex;flex-wrap:wrap;align-items:stretch;gap:var(--space-2)}.prose .flow-step{flex:1 1 0;min-width:92px;display:flex;flex-direction:column;justify-content:center;gap:var(--space-1);padding:var(--space-3);text-align:center;background:var(--panel);border:1px solid var(--line);border-radius:8px;font-size:.9rem;font-weight:550;line-height:1.3;color:var(--ink)}.prose .flow-sub{font-size:var(--fs-caption);font-weight:400;color:var(--muted)}.prose .flow-arrow{display:flex;align-items:center;color:var(--faint);font-size:1.1rem}.prose .compat-stat{display:flex;flex-direction:column;gap:var(--space-3);padding-top:var(--space-4);border-top:1px solid var(--line)}.prose .compat-stat-surface{font-size:.85rem;color:var(--muted);font-variant-numeric:tabular-nums}.prose .compat-stat-surface strong,.prose .compat-stat-item strong{color:var(--ink)}.prose .compat-stat-figure{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-3);line-height:1}.prose .compat-stat-pct{font-size:2.75rem;font-weight:750;line-height:1;letter-spacing:-.02em;color:var(--ink);font-variant-numeric:tabular-nums}.prose .compat-stat-label{font-size:1rem;color:var(--muted)}.prose .compat-stat-denom{font-size:.85rem;color:var(--faint);font-variant-numeric:tabular-nums}.prose .compat-stat-bar{display:flex;gap:2px;width:100%;height:10px;border-radius:5px;overflow:hidden}.prose .compat-stat-seg{flex-basis:0;min-width:0;background:var(--muted)}.prose .compat-stat-seg[data-status=ok]{background:var(--diff-add)}.prose .compat-stat-seg[data-status=unsupported]{background:var(--line-2)}.prose .compat-stat-seg[data-status=unverified]{background:transparent;box-shadow:inset 0 0 0 1px var(--faint)}.prose .compat-stat-seg[data-status=diverged]{background:repeating-linear-gradient(135deg,var(--accent) 0 4px,color-mix(in srgb,var(--accent) 45%,transparent) 4px 7px)}.prose .compat-stat-seg[data-status=bug]{background:repeating-linear-gradient(45deg,var(--diff-remove) 0 3px,color-mix(in srgb,var(--diff-remove) 40%,transparent) 3px 6px)}.prose .compat-stat-key{padding:0;display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);list-style:none}.prose .compat-stat-item{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--fs-caption);color:var(--muted);font-variant-numeric:tabular-nums}.prose .compat-stat-note{font-size:var(--fs-caption);color:var(--muted)}.prose .compat-meters{display:flex;flex-direction:column;gap:var(--space-2)}.prose .compat-meter{display:grid;grid-template-columns:minmax(9rem,auto) 1fr auto;align-items:center;gap:var(--space-3);font-size:var(--fs-caption);color:var(--muted);font-variant-numeric:tabular-nums}.prose .compat-meter-label{color:var(--muted)}.prose .compat-meter-value{color:var(--ink);font-weight:600;text-align:right}.prose .compat-meter-track{display:block;width:100%;height:8px;border-radius:4px;background:var(--line-2);overflow:hidden}.prose .compat-meter-fill{display:block;height:100%;border-radius:4px;background:var(--diff-add)}.prose .compat-meter-track--mini{height:5px;margin-top:var(--space-1)}.prose .compat-score-table{width:100%;border-collapse:collapse;font-size:.875rem}.prose .compat-score-table thead th{text-align:left;font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3, #667);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line)}.prose .compat-score-table td,.prose .compat-score-table th[scope=row]{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line);vertical-align:middle;text-align:left}.prose .compat-score-table th[scope=row]{font-weight:600;white-space:nowrap}.prose .compat-score-cell{white-space:nowrap}.prose .compat-score-cell .compat-score-pct{font-variant-numeric:tabular-nums;font-weight:600;margin-right:var(--space-2)}.prose .compat-score-cell .compat-meter-track--mini{display:inline-block;width:8rem;vertical-align:middle}.prose .compat-score-detail{color:var(--ink-3, #667);font-size:.8125rem;white-space:nowrap}.prose .compat-score-row--overall th[scope=row],.prose .compat-score-row--overall td{border-top:2px solid var(--line);border-bottom:0}} .prose .compat-score-tbd{color:var(--ink-3, #667);font-size:.8125rem;font-style:italic}.prose .compat-score-stack{display:grid;gap:var(--space-1)}.prose .compat-score-bar{display:flex;align-items:center;gap:var(--space-2)}.prose .compat-score-bar .compat-meter-track{flex:1 1 auto}.prose .compat-score-basis{font-size:.8125rem;color:var(--ink-3, #667)}:root{--rhythm-para: .875rem;--rhythm-group: 1.5rem;--rhythm-subsection: 2.25rem;--rhythm-section: 3.25rem;--rhythm-list: calc(var(--rhythm-para) * .75)}.prose>*,.prose blockquote>*,.prose li>*,.prose .compat-stat>*{margin-block:0}.prose>*+*{margin-block-start:var(--rhythm-group)}.prose>*+h2{margin-block-start:var(--rhythm-section)}.prose>*+h3,.prose>*+h4{margin-block-start:var(--rhythm-subsection)}.prose>h1+*,.prose>h2+*,.prose>h3+*,.prose>h4+*{margin-block-start:var(--rhythm-para)}.prose>p+p{margin-block-start:var(--rhythm-para)}.prose>p+ul,.prose>p+ol,.prose>p+blockquote{margin-block-start:var(--rhythm-para)}.prose li+li{margin-block-start:var(--rhythm-list)}.prose li>ul,.prose li>ol{margin-block-start:var(--rhythm-list)}.prose li>*+*,.prose blockquote>*+*{margin-block-start:var(--rhythm-para)}.api-reference-header{margin:0 0 2.5rem;padding:0 0 2rem;border-bottom:1px solid var(--line)}.api-reference-kicker{margin:0 0 .65rem;color:var(--muted);font-size:var(--fs-micro);font-weight:600;letter-spacing:var(--tracking-micro);text-transform:uppercase}.api-reference-header h1{margin:0;color:var(--ink);font-size:clamp(1.7rem,4vw,2.45rem);font-weight:600;letter-spacing:-.035em}.api-reference-header h1 code{padding:0;color:inherit;background:transparent;font:inherit}.api-reference-meta,.api-reference-source{margin:.7rem 0 0;color:var(--muted);font-size:var(--fs-body)}.api-reference-source{margin-top:.3rem}.api-reference-evidence{display:inline-block;margin-top:1rem;color:var(--ink);font-size:var(--fs-label);font-weight:600;text-underline-offset:.18em}.api-reference-body>h2{margin-top:3.75rem;padding-bottom:.65rem;border-bottom:1px solid var(--line)}.api-reference-body>h3{margin-top:2.75rem}.api-reference-body>h3 code{font-size:inherit}.api-reference-body h4{margin-top:1.8rem}.api-reference-body h5,.api-reference-body h6{margin-top:1.35rem}.api-reference-body pre{overflow-x:auto}.api-reference-body table{display:block;max-width:100%;overflow-x:auto;white-space:nowrap}.api-symbols{max-height:calc(100vh - 5rem);overflow:auto;scrollbar-width:thin}.api-symbol-filter{width:100%;margin:.2rem 0 1rem;padding:.5rem .6rem;border:1px solid var(--line);border-radius:.35rem;color:var(--ink);background:var(--panel);font:inherit;font-size:var(--fs-caption)}.api-symbol-filter:focus{border-color:var(--muted);outline:none}.api-symbol-group+.api-symbol-group{margin-top:1rem}.api-symbol-kind{display:block;margin-bottom:.35rem;color:var(--muted);font-size:var(--fs-micro);font-weight:600;letter-spacing:var(--tracking-micro);text-transform:uppercase}.api-symbol-group ul{margin:0;padding:0;list-style:none}.api-symbol-group li+li{margin-top:.22rem}.api-symbol-group li a{display:block;overflow:hidden;color:var(--muted);font-family:var(--font-mono);font-size:var(--fs-caption);text-overflow:ellipsis;white-space:nowrap}.api-symbol-group li a:hover,.api-symbol-kind:hover{color:var(--ink)}.api-symbol-empty{color:var(--muted);font-size:var(--fs-caption)}
|