@kvman/kernel 0.1.0
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/LICENSE +21 -0
- package/README.md +11 -0
- package/dist/clock.d.ts +8 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +13 -0
- package/dist/clock.js.map +1 -0
- package/dist/ctx/extension-ctx.d.ts +22 -0
- package/dist/ctx/extension-ctx.d.ts.map +1 -0
- package/dist/ctx/extension-ctx.js +78 -0
- package/dist/ctx/extension-ctx.js.map +1 -0
- package/dist/ctx/files-calls.d.ts +5 -0
- package/dist/ctx/files-calls.d.ts.map +1 -0
- package/dist/ctx/files-calls.js +26 -0
- package/dist/ctx/files-calls.js.map +1 -0
- package/dist/ctx/job-calls.d.ts +12 -0
- package/dist/ctx/job-calls.d.ts.map +1 -0
- package/dist/ctx/job-calls.js +73 -0
- package/dist/ctx/job-calls.js.map +1 -0
- package/dist/ctx/processes-calls.d.ts +11 -0
- package/dist/ctx/processes-calls.d.ts.map +1 -0
- package/dist/ctx/processes-calls.js +50 -0
- package/dist/ctx/processes-calls.js.map +1 -0
- package/dist/ctx/settings-calls.d.ts +5 -0
- package/dist/ctx/settings-calls.d.ts.map +1 -0
- package/dist/ctx/settings-calls.js +30 -0
- package/dist/ctx/settings-calls.js.map +1 -0
- package/dist/extensions/load-order.d.ts +13 -0
- package/dist/extensions/load-order.d.ts.map +1 -0
- package/dist/extensions/load-order.js +111 -0
- package/dist/extensions/load-order.js.map +1 -0
- package/dist/extensions/manifests.d.ts +16 -0
- package/dist/extensions/manifests.d.ts.map +1 -0
- package/dist/extensions/manifests.js +50 -0
- package/dist/extensions/manifests.js.map +1 -0
- package/dist/extensions/npm-install.d.ts +9 -0
- package/dist/extensions/npm-install.d.ts.map +1 -0
- package/dist/extensions/npm-install.js +39 -0
- package/dist/extensions/npm-install.js.map +1 -0
- package/dist/extensions/trust.d.ts +11 -0
- package/dist/extensions/trust.d.ts.map +1 -0
- package/dist/extensions/trust.js +27 -0
- package/dist/extensions/trust.js.map +1 -0
- package/dist/files/file-access.d.ts +6 -0
- package/dist/files/file-access.d.ts.map +1 -0
- package/dist/files/file-access.js +21 -0
- package/dist/files/file-access.js.map +1 -0
- package/dist/files/files.d.ts +31 -0
- package/dist/files/files.d.ts.map +1 -0
- package/dist/files/files.js +73 -0
- package/dist/files/files.js.map +1 -0
- package/dist/http/call-routes.d.ts +4 -0
- package/dist/http/call-routes.d.ts.map +1 -0
- package/dist/http/call-routes.js +72 -0
- package/dist/http/call-routes.js.map +1 -0
- package/dist/http/envelope.d.ts +8 -0
- package/dist/http/envelope.d.ts.map +1 -0
- package/dist/http/envelope.js +17 -0
- package/dist/http/envelope.js.map +1 -0
- package/dist/http/file-routes.d.ts +5 -0
- package/dist/http/file-routes.d.ts.map +1 -0
- package/dist/http/file-routes.js +47 -0
- package/dist/http/file-routes.js.map +1 -0
- package/dist/http/http-app.d.ts +11 -0
- package/dist/http/http-app.d.ts.map +1 -0
- package/dist/http/http-app.js +31 -0
- package/dist/http/http-app.js.map +1 -0
- package/dist/http/http-server.d.ts +9 -0
- package/dist/http/http-server.d.ts.map +1 -0
- package/dist/http/http-server.js +38 -0
- package/dist/http/http-server.js.map +1 -0
- package/dist/http/job-events.d.ts +18 -0
- package/dist/http/job-events.d.ts.map +1 -0
- package/dist/http/job-events.js +48 -0
- package/dist/http/job-events.js.map +1 -0
- package/dist/http/job-routes.d.ts +4 -0
- package/dist/http/job-routes.d.ts.map +1 -0
- package/dist/http/job-routes.js +20 -0
- package/dist/http/job-routes.js.map +1 -0
- package/dist/http/own-origin.d.ts +2 -0
- package/dist/http/own-origin.d.ts.map +1 -0
- package/dist/http/own-origin.js +9 -0
- package/dist/http/own-origin.js.map +1 -0
- package/dist/http/request-body.d.ts +19 -0
- package/dist/http/request-body.d.ts.map +1 -0
- package/dist/http/request-body.js +72 -0
- package/dist/http/request-body.js.map +1 -0
- package/dist/http/static-files.d.ts +3 -0
- package/dist/http/static-files.d.ts.map +1 -0
- package/dist/http/static-files.js +35 -0
- package/dist/http/static-files.js.map +1 -0
- package/dist/http/web-routes.d.ts +4 -0
- package/dist/http/web-routes.d.ts.map +1 -0
- package/dist/http/web-routes.js +23 -0
- package/dist/http/web-routes.js.map +1 -0
- package/dist/ids.d.ts +6 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +42 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/current-job.d.ts +19 -0
- package/dist/jobs/current-job.d.ts.map +1 -0
- package/dist/jobs/current-job.js +20 -0
- package/dist/jobs/current-job.js.map +1 -0
- package/dist/jobs/dispatcher.d.ts +40 -0
- package/dist/jobs/dispatcher.d.ts.map +1 -0
- package/dist/jobs/dispatcher.js +201 -0
- package/dist/jobs/dispatcher.js.map +1 -0
- package/dist/jobs/handlers.d.ts +19 -0
- package/dist/jobs/handlers.d.ts.map +1 -0
- package/dist/jobs/handlers.js +54 -0
- package/dist/jobs/handlers.js.map +1 -0
- package/dist/jobs/job-rows.d.ts +63 -0
- package/dist/jobs/job-rows.d.ts.map +1 -0
- package/dist/jobs/job-rows.js +111 -0
- package/dist/jobs/job-rows.js.map +1 -0
- package/dist/jobs/progress-hub.d.ts +12 -0
- package/dist/jobs/progress-hub.d.ts.map +1 -0
- package/dist/jobs/progress-hub.js +40 -0
- package/dist/jobs/progress-hub.js.map +1 -0
- package/dist/jobs/registry.d.ts +38 -0
- package/dist/jobs/registry.d.ts.map +1 -0
- package/dist/jobs/registry.js +89 -0
- package/dist/jobs/registry.js.map +1 -0
- package/dist/jobs/retry-policy.d.ts +4 -0
- package/dist/jobs/retry-policy.d.ts.map +1 -0
- package/dist/jobs/retry-policy.js +10 -0
- package/dist/jobs/retry-policy.js.map +1 -0
- package/dist/jobs/run-job.d.ts +26 -0
- package/dist/jobs/run-job.d.ts.map +1 -0
- package/dist/jobs/run-job.js +120 -0
- package/dist/jobs/run-job.js.map +1 -0
- package/dist/kernel-api/extensions-api.d.ts +4 -0
- package/dist/kernel-api/extensions-api.d.ts.map +1 -0
- package/dist/kernel-api/extensions-api.js +32 -0
- package/dist/kernel-api/extensions-api.js.map +1 -0
- package/dist/kernel-api/folder-api.d.ts +4 -0
- package/dist/kernel-api/folder-api.d.ts.map +1 -0
- package/dist/kernel-api/folder-api.js +54 -0
- package/dist/kernel-api/folder-api.js.map +1 -0
- package/dist/kernel-api/folder-name.d.ts +3 -0
- package/dist/kernel-api/folder-name.d.ts.map +1 -0
- package/dist/kernel-api/folder-name.js +26 -0
- package/dist/kernel-api/folder-name.js.map +1 -0
- package/dist/kernel-api/health-api.d.ts +4 -0
- package/dist/kernel-api/health-api.d.ts.map +1 -0
- package/dist/kernel-api/health-api.js +8 -0
- package/dist/kernel-api/health-api.js.map +1 -0
- package/dist/kernel-api/jobs-files-api.d.ts +4 -0
- package/dist/kernel-api/jobs-files-api.d.ts.map +1 -0
- package/dist/kernel-api/jobs-files-api.js +18 -0
- package/dist/kernel-api/jobs-files-api.js.map +1 -0
- package/dist/kernel-api/json-schemas.d.ts +3 -0
- package/dist/kernel-api/json-schemas.d.ts.map +1 -0
- package/dist/kernel-api/json-schemas.js +16 -0
- package/dist/kernel-api/json-schemas.js.map +1 -0
- package/dist/kernel-api/kernel-api-services.d.ts +17 -0
- package/dist/kernel-api/kernel-api-services.d.ts.map +1 -0
- package/dist/kernel-api/kernel-api-services.js +2 -0
- package/dist/kernel-api/kernel-api-services.js.map +1 -0
- package/dist/kernel-api/kernel-registrations.d.ts +19 -0
- package/dist/kernel-api/kernel-registrations.d.ts.map +1 -0
- package/dist/kernel-api/kernel-registrations.js +14 -0
- package/dist/kernel-api/kernel-registrations.js.map +1 -0
- package/dist/kernel-api/preset-api.d.ts +4 -0
- package/dist/kernel-api/preset-api.d.ts.map +1 -0
- package/dist/kernel-api/preset-api.js +10 -0
- package/dist/kernel-api/preset-api.js.map +1 -0
- package/dist/kernel-api/register-kernel-api.d.ts +4 -0
- package/dist/kernel-api/register-kernel-api.d.ts.map +1 -0
- package/dist/kernel-api/register-kernel-api.js +24 -0
- package/dist/kernel-api/register-kernel-api.js.map +1 -0
- package/dist/kernel-api/restart-api.d.ts +4 -0
- package/dist/kernel-api/restart-api.d.ts.map +1 -0
- package/dist/kernel-api/restart-api.js +10 -0
- package/dist/kernel-api/restart-api.js.map +1 -0
- package/dist/kernel-api/secrets-api.d.ts +4 -0
- package/dist/kernel-api/secrets-api.d.ts.map +1 -0
- package/dist/kernel-api/secrets-api.js +23 -0
- package/dist/kernel-api/secrets-api.js.map +1 -0
- package/dist/kernel-api/settings-api.d.ts +4 -0
- package/dist/kernel-api/settings-api.d.ts.map +1 -0
- package/dist/kernel-api/settings-api.js +33 -0
- package/dist/kernel-api/settings-api.js.map +1 -0
- package/dist/kernel-api/workspace-api.d.ts +4 -0
- package/dist/kernel-api/workspace-api.d.ts.map +1 -0
- package/dist/kernel-api/workspace-api.js +13 -0
- package/dist/kernel-api/workspace-api.js.map +1 -0
- package/dist/kernel-lifecycle.d.ts +8 -0
- package/dist/kernel-lifecycle.d.ts.map +1 -0
- package/dist/kernel-lifecycle.js +56 -0
- package/dist/kernel-lifecycle.js.map +1 -0
- package/dist/kernel-requests.d.ts +25 -0
- package/dist/kernel-requests.d.ts.map +1 -0
- package/dist/kernel-requests.js +63 -0
- package/dist/kernel-requests.js.map +1 -0
- package/dist/kernel-version.d.ts +2 -0
- package/dist/kernel-version.d.ts.map +1 -0
- package/dist/kernel-version.js +8 -0
- package/dist/kernel-version.js.map +1 -0
- package/dist/kernel-web.d.ts +36 -0
- package/dist/kernel-web.d.ts.map +1 -0
- package/dist/kernel-web.js +26 -0
- package/dist/kernel-web.js.map +1 -0
- package/dist/kernel.d.ts +44 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +157 -0
- package/dist/kernel.js.map +1 -0
- package/dist/limits.d.ts +6 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +8 -0
- package/dist/limits.js.map +1 -0
- package/dist/localization/catalogs.d.ts +15 -0
- package/dist/localization/catalogs.d.ts.map +1 -0
- package/dist/localization/catalogs.js +66 -0
- package/dist/localization/catalogs.js.map +1 -0
- package/dist/logging/log-file.d.ts +7 -0
- package/dist/logging/log-file.d.ts.map +1 -0
- package/dist/logging/log-file.js +12 -0
- package/dist/logging/log-file.js.map +1 -0
- package/dist/logging/logger.d.ts +12 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +14 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/terminal-lines.d.ts +4 -0
- package/dist/logging/terminal-lines.d.ts.map +1 -0
- package/dist/logging/terminal-lines.js +16 -0
- package/dist/logging/terminal-lines.js.map +1 -0
- package/dist/preset-edit/install-source.d.ts +8 -0
- package/dist/preset-edit/install-source.d.ts.map +1 -0
- package/dist/preset-edit/install-source.js +36 -0
- package/dist/preset-edit/install-source.js.map +1 -0
- package/dist/preset-edit/preset-backup.d.ts +10 -0
- package/dist/preset-edit/preset-backup.d.ts.map +1 -0
- package/dist/preset-edit/preset-backup.js +45 -0
- package/dist/preset-edit/preset-backup.js.map +1 -0
- package/dist/preset-edit/preset-files.d.ts +6 -0
- package/dist/preset-edit/preset-files.d.ts.map +1 -0
- package/dist/preset-edit/preset-files.js +56 -0
- package/dist/preset-edit/preset-files.js.map +1 -0
- package/dist/preset-edit/preset-source.d.ts +7 -0
- package/dist/preset-edit/preset-source.d.ts.map +1 -0
- package/dist/preset-edit/preset-source.js +2 -0
- package/dist/preset-edit/preset-source.js.map +1 -0
- package/dist/preset-edit/preset-store.d.ts +22 -0
- package/dist/preset-edit/preset-store.d.ts.map +1 -0
- package/dist/preset-edit/preset-store.js +70 -0
- package/dist/preset-edit/preset-store.js.map +1 -0
- package/dist/problems.d.ts +3 -0
- package/dist/problems.d.ts.map +1 -0
- package/dist/problems.js +6 -0
- package/dist/problems.js.map +1 -0
- package/dist/processes/process-kill.d.ts +16 -0
- package/dist/processes/process-kill.d.ts.map +1 -0
- package/dist/processes/process-kill.js +45 -0
- package/dist/processes/process-kill.js.map +1 -0
- package/dist/processes/process-log.d.ts +10 -0
- package/dist/processes/process-log.d.ts.map +1 -0
- package/dist/processes/process-log.js +41 -0
- package/dist/processes/process-log.js.map +1 -0
- package/dist/processes/process-rows.d.ts +11 -0
- package/dist/processes/process-rows.d.ts.map +1 -0
- package/dist/processes/process-rows.js +21 -0
- package/dist/processes/process-rows.js.map +1 -0
- package/dist/processes/process-service.d.ts +30 -0
- package/dist/processes/process-service.d.ts.map +1 -0
- package/dist/processes/process-service.js +110 -0
- package/dist/processes/process-service.js.map +1 -0
- package/dist/reload/reload-extensions.d.ts +5 -0
- package/dist/reload/reload-extensions.d.ts.map +1 -0
- package/dist/reload/reload-extensions.js +25 -0
- package/dist/reload/reload-extensions.js.map +1 -0
- package/dist/reload/watcher.d.ts +7 -0
- package/dist/reload/watcher.d.ts.map +1 -0
- package/dist/reload/watcher.js +40 -0
- package/dist/reload/watcher.js.map +1 -0
- package/dist/run/extension-run.d.ts +36 -0
- package/dist/run/extension-run.d.ts.map +1 -0
- package/dist/run/extension-run.js +81 -0
- package/dist/run/extension-run.js.map +1 -0
- package/dist/schedules/schedule-rows.d.ts +27 -0
- package/dist/schedules/schedule-rows.d.ts.map +1 -0
- package/dist/schedules/schedule-rows.js +70 -0
- package/dist/schedules/schedule-rows.js.map +1 -0
- package/dist/sdk-version.d.ts +2 -0
- package/dist/sdk-version.d.ts.map +1 -0
- package/dist/sdk-version.js +10 -0
- package/dist/sdk-version.js.map +1 -0
- package/dist/secrets/secrets-file.d.ts +11 -0
- package/dist/secrets/secrets-file.d.ts.map +1 -0
- package/dist/secrets/secrets-file.js +50 -0
- package/dist/secrets/secrets-file.js.map +1 -0
- package/dist/settings/kernel-settings.d.ts +4 -0
- package/dist/settings/kernel-settings.d.ts.map +1 -0
- package/dist/settings/kernel-settings.js +20 -0
- package/dist/settings/kernel-settings.js.map +1 -0
- package/dist/settings/preset-check.d.ts +4 -0
- package/dist/settings/preset-check.d.ts.map +1 -0
- package/dist/settings/preset-check.js +19 -0
- package/dist/settings/preset-check.js.map +1 -0
- package/dist/settings/settings.d.ts +31 -0
- package/dist/settings/settings.d.ts.map +1 -0
- package/dist/settings/settings.js +68 -0
- package/dist/settings/settings.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +31 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/schema.d.ts +2 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +108 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/store/collections.d.ts +6 -0
- package/dist/store/collections.d.ts.map +1 -0
- package/dist/store/collections.js +63 -0
- package/dist/store/collections.js.map +1 -0
- package/dist/store/filters.d.ts +10 -0
- package/dist/store/filters.d.ts.map +1 -0
- package/dist/store/filters.js +40 -0
- package/dist/store/filters.js.map +1 -0
- package/dist/store/json-values.d.ts +6 -0
- package/dist/store/json-values.d.ts.map +1 -0
- package/dist/store/json-values.js +20 -0
- package/dist/store/json-values.js.map +1 -0
- package/dist/store/kv.d.ts +9 -0
- package/dist/store/kv.d.ts.map +1 -0
- package/dist/store/kv.js +23 -0
- package/dist/store/kv.js.map +1 -0
- package/dist/store/store.d.ts +11 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +62 -0
- package/dist/store/store.js.map +1 -0
- package/dist/wasm-code-gc.d.ts +2 -0
- package/dist/wasm-code-gc.d.ts.map +1 -0
- package/dist/wasm-code-gc.js +9 -0
- package/dist/wasm-code-gc.js.map +1 -0
- package/dist/workers/pool.d.ts +31 -0
- package/dist/workers/pool.d.ts.map +1 -0
- package/dist/workers/pool.js +208 -0
- package/dist/workers/pool.js.map +1 -0
- package/dist/workers/protocol.d.ts +431 -0
- package/dist/workers/protocol.d.ts.map +1 -0
- package/dist/workers/protocol.js +93 -0
- package/dist/workers/protocol.js.map +1 -0
- package/dist/workers/root-runner.d.ts +15 -0
- package/dist/workers/root-runner.d.ts.map +1 -0
- package/dist/workers/root-runner.js +63 -0
- package/dist/workers/root-runner.js.map +1 -0
- package/dist/workers/sdk-resolution.d.ts +2 -0
- package/dist/workers/sdk-resolution.d.ts.map +1 -0
- package/dist/workers/sdk-resolution.js +14 -0
- package/dist/workers/sdk-resolution.js.map +1 -0
- package/dist/workers/worker-main.d.ts +2 -0
- package/dist/workers/worker-main.d.ts.map +1 -0
- package/dist/workers/worker-main.js +123 -0
- package/dist/workers/worker-main.js.map +1 -0
- package/dist/workspaces/workspaces.d.ts +17 -0
- package/dist/workspaces/workspaces.d.ts.map +1 -0
- package/dist/workspaces/workspaces.js +85 -0
- package/dist/workspaces/workspaces.js.map +1 -0
- package/locales/ar.json +70 -0
- package/locales/en.json +70 -0
- package/package.json +45 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// The kernel's tables (plan 02 §2.5). Extensions never see SQL. A scope is a workspace id, or '' for the home-wide
|
|
2
|
+
// (global) scope. JSON columns hold text; times are ISO 8601 strings.
|
|
3
|
+
export const kernelSchema = `
|
|
4
|
+
CREATE TABLE IF NOT EXISTS store_kv (
|
|
5
|
+
extension TEXT NOT NULL,
|
|
6
|
+
scope TEXT NOT NULL,
|
|
7
|
+
key TEXT NOT NULL,
|
|
8
|
+
value TEXT NOT NULL,
|
|
9
|
+
PRIMARY KEY (extension, scope, key)
|
|
10
|
+
) WITHOUT ROWID;
|
|
11
|
+
|
|
12
|
+
CREATE TABLE IF NOT EXISTS store_documents (
|
|
13
|
+
extension TEXT NOT NULL,
|
|
14
|
+
scope TEXT NOT NULL,
|
|
15
|
+
collection TEXT NOT NULL,
|
|
16
|
+
id TEXT NOT NULL,
|
|
17
|
+
data TEXT NOT NULL,
|
|
18
|
+
PRIMARY KEY (extension, scope, collection, id)
|
|
19
|
+
) WITHOUT ROWID;
|
|
20
|
+
|
|
21
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
22
|
+
key TEXT NOT NULL,
|
|
23
|
+
scope TEXT NOT NULL,
|
|
24
|
+
value TEXT NOT NULL,
|
|
25
|
+
PRIMARY KEY (key, scope)
|
|
26
|
+
) WITHOUT ROWID;
|
|
27
|
+
|
|
28
|
+
CREATE TABLE IF NOT EXISTS files (
|
|
29
|
+
id TEXT PRIMARY KEY,
|
|
30
|
+
name TEXT NOT NULL,
|
|
31
|
+
type TEXT NOT NULL,
|
|
32
|
+
size INTEGER NOT NULL,
|
|
33
|
+
owner TEXT NOT NULL,
|
|
34
|
+
workspace_id TEXT NOT NULL,
|
|
35
|
+
created_at TEXT NOT NULL
|
|
36
|
+
) WITHOUT ROWID;
|
|
37
|
+
|
|
38
|
+
CREATE INDEX IF NOT EXISTS files_by_workspace ON files (workspace_id, id);
|
|
39
|
+
|
|
40
|
+
CREATE TABLE IF NOT EXISTS jobs (
|
|
41
|
+
id TEXT PRIMARY KEY,
|
|
42
|
+
name TEXT NOT NULL,
|
|
43
|
+
input TEXT NOT NULL,
|
|
44
|
+
workspace_id TEXT NOT NULL,
|
|
45
|
+
caller TEXT NOT NULL,
|
|
46
|
+
status TEXT NOT NULL,
|
|
47
|
+
attempts INTEGER NOT NULL,
|
|
48
|
+
retries INTEGER NOT NULL,
|
|
49
|
+
output TEXT,
|
|
50
|
+
problem TEXT,
|
|
51
|
+
created_at TEXT NOT NULL,
|
|
52
|
+
started_at TEXT,
|
|
53
|
+
ended_at TEXT,
|
|
54
|
+
run_at TEXT NOT NULL,
|
|
55
|
+
from_handler INTEGER NOT NULL,
|
|
56
|
+
handler_extension TEXT
|
|
57
|
+
) WITHOUT ROWID;
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS jobs_by_status ON jobs (status, run_at, id);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS jobs_by_workspace ON jobs (workspace_id, id);
|
|
61
|
+
|
|
62
|
+
CREATE TABLE IF NOT EXISTS schedules (
|
|
63
|
+
id TEXT PRIMARY KEY,
|
|
64
|
+
owner TEXT NOT NULL,
|
|
65
|
+
key TEXT,
|
|
66
|
+
name TEXT NOT NULL,
|
|
67
|
+
input TEXT NOT NULL,
|
|
68
|
+
at TEXT,
|
|
69
|
+
cron TEXT,
|
|
70
|
+
next_run TEXT NOT NULL,
|
|
71
|
+
workspace_id TEXT NOT NULL,
|
|
72
|
+
retries INTEGER NOT NULL,
|
|
73
|
+
from_handler INTEGER NOT NULL
|
|
74
|
+
) WITHOUT ROWID;
|
|
75
|
+
|
|
76
|
+
CREATE UNIQUE INDEX IF NOT EXISTS schedules_by_key ON schedules (owner, workspace_id, key) WHERE key IS NOT NULL;
|
|
77
|
+
CREATE INDEX IF NOT EXISTS schedules_by_next_run ON schedules (next_run);
|
|
78
|
+
|
|
79
|
+
CREATE TABLE IF NOT EXISTS workspaces (
|
|
80
|
+
id TEXT PRIMARY KEY,
|
|
81
|
+
name TEXT NOT NULL,
|
|
82
|
+
path TEXT NOT NULL UNIQUE,
|
|
83
|
+
open INTEGER NOT NULL
|
|
84
|
+
) WITHOUT ROWID;
|
|
85
|
+
|
|
86
|
+
CREATE TABLE IF NOT EXISTS processes (
|
|
87
|
+
extension TEXT NOT NULL,
|
|
88
|
+
workspace_id TEXT NOT NULL,
|
|
89
|
+
name TEXT NOT NULL,
|
|
90
|
+
pid INTEGER NOT NULL,
|
|
91
|
+
started_at TEXT NOT NULL,
|
|
92
|
+
PRIMARY KEY (extension, workspace_id, name)
|
|
93
|
+
) WITHOUT ROWID;
|
|
94
|
+
|
|
95
|
+
CREATE TABLE IF NOT EXISTS kernel_state (
|
|
96
|
+
key TEXT PRIMARY KEY,
|
|
97
|
+
value TEXT NOT NULL
|
|
98
|
+
) WITHOUT ROWID;
|
|
99
|
+
|
|
100
|
+
CREATE TABLE IF NOT EXISTS accepted_extensions (
|
|
101
|
+
name TEXT NOT NULL,
|
|
102
|
+
version TEXT NOT NULL,
|
|
103
|
+
source TEXT NOT NULL,
|
|
104
|
+
accepted_at TEXT NOT NULL,
|
|
105
|
+
PRIMARY KEY (name, version, source)
|
|
106
|
+
) WITHOUT ROWID;
|
|
107
|
+
`;
|
|
108
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,sEAAsE;AAEtE,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwG3B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { JsonObject, TransactionCollection, z } from '@kvman/sdk';
|
|
2
|
+
import type { IdGenerator } from '../ids.ts';
|
|
3
|
+
import type { Connection } from '../storage/database.ts';
|
|
4
|
+
import type { ScopeKey, WriteGuard } from './kv.ts';
|
|
5
|
+
export declare function collectionOf<Document extends JsonObject>(connection: Connection, key: ScopeKey, name: string, schema: z.ZodType<Document>, ids: IdGenerator, beforeWrite: WriteGuard): TransactionCollection<Document>;
|
|
6
|
+
//# sourceMappingURL=collections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAU,qBAAqB,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAMpD,wBAAgB,YAAY,CAAC,QAAQ,SAAS,UAAU,EACtD,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC3B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,UAAU,GACtB,qBAAqB,CAAC,QAAQ,CAAC,CA0DjC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { kernelProblem } from "../problems.js";
|
|
2
|
+
import { filterSql, findOptions } from "./filters.js";
|
|
3
|
+
import { storedText, validationFailed } from "./json-values.js";
|
|
4
|
+
export function collectionOf(connection, key, name, schema, ids, beforeWrite) {
|
|
5
|
+
const where = 'extension = ? AND scope = ? AND collection = ?';
|
|
6
|
+
const owner = [key.extension, key.scope, name];
|
|
7
|
+
const checked = (value, what) => {
|
|
8
|
+
const parsed = schema.safeParse(value);
|
|
9
|
+
if (!parsed.success)
|
|
10
|
+
throw validationFailed(what, parsed.error);
|
|
11
|
+
return parsed.data;
|
|
12
|
+
};
|
|
13
|
+
const read = (row) => {
|
|
14
|
+
const value = JSON.parse(row.data);
|
|
15
|
+
return { ...checked(value, `The stored document ${name}/${row.id}`), id: row.id };
|
|
16
|
+
};
|
|
17
|
+
const rowOf = (id) => connection.prepare(`SELECT id, data FROM store_documents WHERE ${where} AND id = ?`).get(...owner, id);
|
|
18
|
+
const missing = (id) => kernelProblem('NOT_FOUND', `There is no document ${name}/${id}.`, { collection: name, id });
|
|
19
|
+
return {
|
|
20
|
+
insert(document) {
|
|
21
|
+
beforeWrite();
|
|
22
|
+
const data = checked(document, `The document for ${name}`);
|
|
23
|
+
const id = ids();
|
|
24
|
+
const text = storedText(data, `The document for ${name}`);
|
|
25
|
+
connection.prepare('INSERT INTO store_documents (extension, scope, collection, id, data) VALUES (?, ?, ?, ?, ?)').run(...owner, id, text);
|
|
26
|
+
return { ...data, id };
|
|
27
|
+
},
|
|
28
|
+
get(id) {
|
|
29
|
+
const row = rowOf(id);
|
|
30
|
+
return row === undefined ? undefined : read(row);
|
|
31
|
+
},
|
|
32
|
+
find(filter, options) {
|
|
33
|
+
const { limit, order } = findOptions(options);
|
|
34
|
+
const condition = filterSql(filter);
|
|
35
|
+
const direction = order === 'asc' ? 'ASC' : 'DESC';
|
|
36
|
+
const sql = `SELECT id, data FROM store_documents WHERE ${where} AND ${condition.sql} ORDER BY id ${direction} LIMIT ?`;
|
|
37
|
+
return connection.prepare(sql).all(...owner, ...condition.values, limit).map(read);
|
|
38
|
+
},
|
|
39
|
+
count(filter) {
|
|
40
|
+
const condition = filterSql(filter);
|
|
41
|
+
const sql = `SELECT count(*) AS total FROM store_documents WHERE ${where} AND ${condition.sql}`;
|
|
42
|
+
return connection.prepare(sql).get(...owner, ...condition.values)?.total ?? 0;
|
|
43
|
+
},
|
|
44
|
+
update(id, patch) {
|
|
45
|
+
beforeWrite();
|
|
46
|
+
const row = rowOf(id);
|
|
47
|
+
if (row === undefined)
|
|
48
|
+
throw missing(id);
|
|
49
|
+
const current = JSON.parse(row.data);
|
|
50
|
+
const merged = checked({ ...(typeof current === 'object' ? current : {}), ...patch }, `The document ${name}/${id}`);
|
|
51
|
+
const text = storedText(merged, `The document ${name}/${id}`);
|
|
52
|
+
connection.prepare(`UPDATE store_documents SET data = ? WHERE ${where} AND id = ?`).run(text, ...owner, id);
|
|
53
|
+
return { ...merged, id };
|
|
54
|
+
},
|
|
55
|
+
delete(id) {
|
|
56
|
+
beforeWrite();
|
|
57
|
+
const result = connection.prepare(`DELETE FROM store_documents WHERE ${where} AND id = ?`).run(...owner, id);
|
|
58
|
+
if (result.changes === 0)
|
|
59
|
+
throw missing(id);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=collections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type SqlFilter = {
|
|
2
|
+
sql: string;
|
|
3
|
+
values: (string | number)[];
|
|
4
|
+
};
|
|
5
|
+
export declare function filterSql(filter: unknown): SqlFilter;
|
|
6
|
+
export declare function findOptions(options: unknown): {
|
|
7
|
+
limit: number;
|
|
8
|
+
order: 'asc' | 'desc';
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/store/filters.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAcrE,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAMpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAMtF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
import { findLimitMaximum } from "../limits.js";
|
|
3
|
+
import { kernelProblem } from "../problems.js";
|
|
4
|
+
import { validationFailed } from "./json-values.js";
|
|
5
|
+
// `find` and `count` filters: equality on top-level fields, combined with AND (plan 02 §2.5).
|
|
6
|
+
const filterSchema = z.record(z.string().min(1), z.union([z.string(), z.number(), z.boolean(), z.null()]));
|
|
7
|
+
const findOptionsSchema = z.strictObject({
|
|
8
|
+
limit: z.number().int().positive().max(findLimitMaximum),
|
|
9
|
+
order: z.enum(['asc', 'desc']).optional(),
|
|
10
|
+
});
|
|
11
|
+
function fieldPath(field) {
|
|
12
|
+
return `$."${field.replaceAll('"', '\\"')}"`;
|
|
13
|
+
}
|
|
14
|
+
function condition(field, value) {
|
|
15
|
+
const path = fieldPath(field);
|
|
16
|
+
if (value === null)
|
|
17
|
+
return { sql: "json_type(data, ?) = 'null'", values: [path] };
|
|
18
|
+
if (typeof value === 'boolean')
|
|
19
|
+
return { sql: `json_type(data, ?) = '${value ? 'true' : 'false'}'`, values: [path] };
|
|
20
|
+
if (typeof value === 'number')
|
|
21
|
+
return { sql: "json_type(data, ?) IN ('integer', 'real') AND json_extract(data, ?) = ?", values: [path, path, value] };
|
|
22
|
+
return { sql: "json_type(data, ?) = 'text' AND json_extract(data, ?) = ?", values: [path, path, value] };
|
|
23
|
+
}
|
|
24
|
+
export function filterSql(filter) {
|
|
25
|
+
const parsed = filterSchema.safeParse(filter);
|
|
26
|
+
if (!parsed.success)
|
|
27
|
+
throw validationFailed('The filter', parsed.error);
|
|
28
|
+
const conditions = Object.entries(parsed.data).map(([field, value]) => condition(field, value));
|
|
29
|
+
if (conditions.length === 0)
|
|
30
|
+
return { sql: '1', values: [] };
|
|
31
|
+
return { sql: conditions.map((part) => `(${part.sql})`).join(' AND '), values: conditions.flatMap((part) => part.values) };
|
|
32
|
+
}
|
|
33
|
+
export function findOptions(options) {
|
|
34
|
+
const parsed = findOptionsSchema.safeParse(options);
|
|
35
|
+
if (!parsed.success) {
|
|
36
|
+
throw kernelProblem('VALIDATION_FAILED', `find needs a whole-number limit of at most ${findLimitMaximum}.`, { limit: findLimitMaximum });
|
|
37
|
+
}
|
|
38
|
+
return { limit: parsed.data.limit, order: parsed.data.order ?? 'asc' };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/store/filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Json, type ProblemError } from '@kvman/sdk';
|
|
2
|
+
import type { z } from '@kvman/sdk';
|
|
3
|
+
export declare function storedText(value: unknown, what: string): string;
|
|
4
|
+
export declare function validationFailed(what: string, error: z.ZodError): ProblemError;
|
|
5
|
+
export declare function parsedJson(text: string): Json;
|
|
6
|
+
//# sourceMappingURL=json-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-values.d.ts","sourceRoot":"","sources":["../../src/store/json-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAMpC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,YAAY,CAG9E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG7C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsonSchema } from '@kvman/sdk';
|
|
2
|
+
import { documentLimitBytes } from "../limits.js";
|
|
3
|
+
import { kernelProblem } from "../problems.js";
|
|
4
|
+
// JSON as the store keeps it: text of at most 16 MiB (plan 02 §2.13).
|
|
5
|
+
export function storedText(value, what) {
|
|
6
|
+
const text = JSON.stringify(value);
|
|
7
|
+
if (Buffer.byteLength(text) > documentLimitBytes) {
|
|
8
|
+
throw kernelProblem('TOO_LARGE', `${what} is over the limit of ${documentLimitBytes} bytes of JSON.`, { limit: documentLimitBytes });
|
|
9
|
+
}
|
|
10
|
+
return text;
|
|
11
|
+
}
|
|
12
|
+
export function validationFailed(what, error) {
|
|
13
|
+
const issues = error.issues.map((issue) => ({ path: issue.path.map(String).join('.'), message: issue.message }));
|
|
14
|
+
return kernelProblem('VALIDATION_FAILED', `${what} is invalid.`, { issues });
|
|
15
|
+
}
|
|
16
|
+
export function parsedJson(text) {
|
|
17
|
+
const value = JSON.parse(text);
|
|
18
|
+
return jsonSchema.parse(value);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=json-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-values.js","sourceRoot":"","sources":["../../src/store/json-values.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgC,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,sEAAsE;AAEtE,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,IAAY;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,kBAAkB,EAAE,CAAC;QACjD,MAAM,aAAa,CAAC,WAAW,EAAE,GAAG,IAAI,yBAAyB,kBAAkB,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvI,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAiB;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjH,OAAO,aAAa,CAAC,mBAAmB,EAAE,GAAG,IAAI,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TransactionKv } from '@kvman/sdk';
|
|
2
|
+
import type { Connection } from '../storage/database.ts';
|
|
3
|
+
export type ScopeKey = {
|
|
4
|
+
extension: string;
|
|
5
|
+
scope: string;
|
|
6
|
+
};
|
|
7
|
+
export type WriteGuard = () => void;
|
|
8
|
+
export declare function kvOf(connection: Connection, key: ScopeKey, beforeWrite: WriteGuard): TransactionKv;
|
|
9
|
+
//# sourceMappingURL=kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/store/kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD,MAAM,MAAM,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAG5D,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAEpC,wBAAgB,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,GAAG,aAAa,CAoBlG"}
|
package/dist/store/kv.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { parsedJson, storedText } from "./json-values.js";
|
|
2
|
+
export function kvOf(connection, key, beforeWrite) {
|
|
3
|
+
return {
|
|
4
|
+
get(name) {
|
|
5
|
+
const row = connection
|
|
6
|
+
.prepare('SELECT value FROM store_kv WHERE extension = ? AND scope = ? AND key = ?')
|
|
7
|
+
.get(key.extension, key.scope, name);
|
|
8
|
+
return row === undefined ? undefined : parsedJson(row.value);
|
|
9
|
+
},
|
|
10
|
+
set(name, value) {
|
|
11
|
+
beforeWrite();
|
|
12
|
+
const text = storedText(value, `The kv value "${name}"`);
|
|
13
|
+
connection
|
|
14
|
+
.prepare('INSERT INTO store_kv (extension, scope, key, value) VALUES (?, ?, ?, ?) ON CONFLICT DO UPDATE SET value = excluded.value')
|
|
15
|
+
.run(key.extension, key.scope, name, text);
|
|
16
|
+
},
|
|
17
|
+
delete(name) {
|
|
18
|
+
beforeWrite();
|
|
19
|
+
connection.prepare('DELETE FROM store_kv WHERE extension = ? AND scope = ? AND key = ?').run(key.extension, key.scope, name);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=kv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../../src/store/kv.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ1D,MAAM,UAAU,IAAI,CAAC,UAAsB,EAAE,GAAa,EAAE,WAAuB;IACjF,OAAO;QACL,GAAG,CAAC,IAAI;YACN,MAAM,GAAG,GAAG,UAAU;iBACnB,OAAO,CAA8C,0EAA0E,CAAC;iBAChI,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACvC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG,CAAC,IAAI,EAAE,KAAK;YACb,WAAW,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,iBAAiB,IAAI,GAAG,CAAC,CAAC;YACzD,UAAU;iBACP,OAAO,CAAC,0HAA0H,CAAC;iBACnI,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,CAAC,IAAI;YACT,WAAW,EAAE,CAAC;YACd,UAAU,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/H,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Store } from '@kvman/sdk';
|
|
2
|
+
import type { IdGenerator } from '../ids.ts';
|
|
3
|
+
import type { Connection } from '../storage/database.ts';
|
|
4
|
+
import { type WriteGuard } from './kv.ts';
|
|
5
|
+
export type StoreOwner = {
|
|
6
|
+
extension: string;
|
|
7
|
+
workspaceId: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const globalScope = "";
|
|
10
|
+
export declare function createStore(connection: Connection, owner: StoreOwner, ids: IdGenerator, beforeWrite?: WriteGuard): Store;
|
|
11
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,KAAK,EAAsF,MAAM,YAAY,CAAC;AACxJ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAK/D,MAAM,MAAM,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAIpE,eAAO,MAAM,WAAW,KAAK,CAAC;AAuD9B,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,GAAE,UAAqB,GAAG,KAAK,CAQlI"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { kernelProblem } from "../problems.js";
|
|
2
|
+
import { collectionOf } from "./collections.js";
|
|
3
|
+
import { kvOf } from "./kv.js";
|
|
4
|
+
const anyWrite = () => undefined;
|
|
5
|
+
export const globalScope = '';
|
|
6
|
+
function asyncKv(kv) {
|
|
7
|
+
return {
|
|
8
|
+
get: async (key) => kv.get(key),
|
|
9
|
+
set: async (key, value) => kv.set(key, value),
|
|
10
|
+
delete: async (key) => kv.delete(key),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function asyncCollection(collection) {
|
|
14
|
+
return {
|
|
15
|
+
insert: async (document) => collection.insert(document),
|
|
16
|
+
get: async (id) => collection.get(id),
|
|
17
|
+
find: async (filter, options) => collection.find(filter, options),
|
|
18
|
+
count: async (filter) => collection.count(filter),
|
|
19
|
+
update: async (id, patch) => collection.update(id, patch),
|
|
20
|
+
delete: async (id) => collection.delete(id),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function syncScope(connection, key, ids, beforeWrite) {
|
|
24
|
+
return {
|
|
25
|
+
kv: kvOf(connection, key, beforeWrite),
|
|
26
|
+
collection: (name, schema) => collectionOf(connection, key, name, schema, ids, beforeWrite),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function asyncScope(scope) {
|
|
30
|
+
return {
|
|
31
|
+
kv: asyncKv(scope.kv),
|
|
32
|
+
collection: (name, schema) => asyncCollection(scope.collection(name, schema)),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function isThenable(value) {
|
|
36
|
+
return typeof value === 'object' && value !== null && 'then' in value && typeof value.then === 'function';
|
|
37
|
+
}
|
|
38
|
+
function runTransaction(connection, owner, ids, beforeWrite, fn) {
|
|
39
|
+
const tx = {
|
|
40
|
+
...syncScope(connection, { extension: owner.extension, scope: owner.workspaceId }, ids, beforeWrite),
|
|
41
|
+
global: syncScope(connection, { extension: owner.extension, scope: globalScope }, ids, beforeWrite),
|
|
42
|
+
};
|
|
43
|
+
// IMMEDIATE takes the write lock at the start, waiting out the busy timeout: a deferred transaction that read first
|
|
44
|
+
// fails at once with "database is locked" when it writes after another connection committed (WAL's stale snapshot).
|
|
45
|
+
return connection.transaction(() => {
|
|
46
|
+
const result = fn(tx);
|
|
47
|
+
if (isThenable(result)) {
|
|
48
|
+
throw kernelProblem('VALIDATION_FAILED', 'A transaction callback must be synchronous; it returned a Promise, so nothing was stored.');
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}).immediate();
|
|
52
|
+
}
|
|
53
|
+
export function createStore(connection, owner, ids, beforeWrite = anyWrite) {
|
|
54
|
+
const workspace = syncScope(connection, { extension: owner.extension, scope: owner.workspaceId }, ids, beforeWrite);
|
|
55
|
+
const global = syncScope(connection, { extension: owner.extension, scope: globalScope }, ids, beforeWrite);
|
|
56
|
+
return {
|
|
57
|
+
...asyncScope(workspace),
|
|
58
|
+
global: asyncScope(global),
|
|
59
|
+
transaction: async (fn) => runTransaction(connection, owner, ids, beforeWrite, fn),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-code-gc.d.ts","sourceRoot":"","sources":["../src/wasm-code-gc.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { setFlagsFromString } from 'node:v8';
|
|
2
|
+
// V8's wasm code GC can free the machine code of a wasm module shared across isolates while another isolate still runs
|
|
3
|
+
// it, which crashes the process (SIGSEGV in NativeModule::FreeCode). Every worker runs Node's TypeScript stripper, a
|
|
4
|
+
// wasm module, so workers starting and stopping trigger it. The kernel turns that GC off once, before any worker
|
|
5
|
+
// starts (ADR 0009, 20); the stripper's compiled code then stays in memory. Remove this once a fixed Node ships.
|
|
6
|
+
export function keepWasmCode() {
|
|
7
|
+
setFlagsFromString('--no-wasm-code-gc');
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=wasm-code-gc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-code-gc.js","sourceRoot":"","sources":["../src/wasm-code-gc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C,uHAAuH;AACvH,qHAAqH;AACrH,iHAAiH;AACjH,iHAAiH;AACjH,MAAM,UAAU,YAAY;IAC1B,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Json } from '@kvman/sdk';
|
|
2
|
+
import type { KernelLogger } from '../logging/logger.ts';
|
|
3
|
+
import { type AbortReason, type RegistrySummary, type RootJob, type SyncEnd, type WorkerRequest, type WorkerSetup } from './protocol.ts';
|
|
4
|
+
export type PoolEvents = {
|
|
5
|
+
request: (request: WorkerRequest) => Promise<unknown>;
|
|
6
|
+
progress: (rootId: string, chunk: {
|
|
7
|
+
source: string;
|
|
8
|
+
data: Json;
|
|
9
|
+
}) => void;
|
|
10
|
+
syncEnded: (end: SyncEnd) => void;
|
|
11
|
+
slotFreed: () => void;
|
|
12
|
+
};
|
|
13
|
+
export type PoolOptions = {
|
|
14
|
+
size: number;
|
|
15
|
+
concurrency: number;
|
|
16
|
+
setup: Omit<WorkerSetup, 'checkPresetSettings' | 'mainArgv'>;
|
|
17
|
+
logger: KernelLogger;
|
|
18
|
+
events: PoolEvents;
|
|
19
|
+
};
|
|
20
|
+
export type WorkerPool = {
|
|
21
|
+
summary: RegistrySummary;
|
|
22
|
+
run(job: RootJob): Promise<unknown>;
|
|
23
|
+
abort(jobId: string, reason: AbortReason): boolean;
|
|
24
|
+
abortAll(reason: AbortReason): void;
|
|
25
|
+
freeSlots(): number;
|
|
26
|
+
idle(): Promise<void>;
|
|
27
|
+
retire(): Promise<void>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
};
|
|
30
|
+
export declare function startPool(options: PoolOptions): Promise<WorkerPool>;
|
|
31
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/workers/pool.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,IAAI,EAAgB,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAe,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAOpK,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,qBAAqB,GAAG,UAAU,CAAC,CAAC;IAC7D,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,SAAS,IAAI,MAAM,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAwBF,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkLzE"}
|