orez-lite 0.10.2 → 0.10.3

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/README.md CHANGED
@@ -5,8 +5,42 @@
5
5
  - `orez-lite` provides the host-neutral mutation executor.
6
6
  - `orez-lite/client` connects a stock Zero client to the HTTP sync protocol.
7
7
  - `orez-lite/browser` runs the engine with SQLite WASM in a browser worker.
8
+ - `orez-lite/native` runs the prebuilt native engine from an application-owned
9
+ Zero schema, SQLite initializer, and HTTP policy callbacks.
8
10
  - `orez-lite/cloudflare` provides the Cloudflare runtime and data-worker factory.
9
11
  - `orez-lite/cloudflare/build` provides Node-side worker build and deployment tools.
10
12
 
11
13
  The package derives its database projection from the application’s Zero schema.
12
14
  Applications do not maintain separate table or column maps.
15
+
16
+ ## Native host
17
+
18
+ The native host is configured entirely by the application:
19
+
20
+ ```ts
21
+ import { createNativeHost } from 'orez-lite/native'
22
+
23
+ const host = createNativeHost({
24
+ schema,
25
+ initSql,
26
+ dataDir: '.orez/native',
27
+ port: 7849,
28
+ adminTokenEnv: 'OREZ_ADMIN_TOKEN',
29
+ callbacks: {
30
+ authenticate: 'https://localhost:3000/api/zero/auth',
31
+ authorizeWake: 'https://localhost:3000/api/zero/wake-authorize',
32
+ transformQueries: 'https://localhost:3000/api/zero/pull',
33
+ certificateAuthority: '.certs/local-root.pem',
34
+ },
35
+ allowedOrigins: ['https://localhost:3000'],
36
+ })
37
+
38
+ const process = host.start({
39
+ env: { ...globalThis.process.env, OREZ_ADMIN_TOKEN: adminToken },
40
+ })
41
+ ```
42
+
43
+ Orez owns the sync protocol, namespace databases, query cache, and wake
44
+ delivery. The callbacks keep authentication, authorization, and query policy in
45
+ the application. Storage retention is disabled unless the application
46
+ explicitly supplies `workerRetention`.
@@ -478,7 +478,7 @@ function __wbg_get_imports() {
478
478
  const ret = Object.entries(arg0);
479
479
  return ret;
480
480
  },
481
- __wbg_exec_59eb0bc29e4f02ff: function() { return handleError(function (arg0, arg1, arg2, arg3) {
481
+ __wbg_exec_0b4e8f9e7a8c0e02: function() { return handleError(function (arg0, arg1, arg2, arg3) {
482
482
  arg0.exec(getStringFromWasm0(arg1, arg2), arg3);
483
483
  }, arguments); },
484
484
  __wbg_get_507a50627bffa49b: function(arg0, arg1) {
@@ -588,7 +588,7 @@ function __wbg_get_imports() {
588
588
  __wbg_prototypesetcall_4770620bbe4688a0: function(arg0, arg1, arg2) {
589
589
  Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);
590
590
  },
591
- __wbg_query_03b6ce598fa1096c: function() { return handleError(function (arg0, arg1, arg2, arg3) {
591
+ __wbg_query_61b60d4aa0a8eccc: function() { return handleError(function (arg0, arg1, arg2, arg3) {
592
592
  const ret = arg0.query(getStringFromWasm0(arg1, arg2), arg3);
593
593
  return ret;
594
594
  }, arguments); },
@@ -0,0 +1,29 @@
1
+ import { type ChildProcess, type SpawnOptions } from 'node:child_process';
2
+ export interface NativeHostCallbacks {
3
+ authenticate: string | URL;
4
+ authorizeWake: string | URL;
5
+ transformQueries: string | URL;
6
+ certificateAuthority?: string;
7
+ }
8
+ export interface NativeHostWorkerRetention {
9
+ idleMs: number;
10
+ sweepIntervalMs: number;
11
+ }
12
+ export interface NativeHostOptions {
13
+ schema: unknown;
14
+ initSql: readonly string[];
15
+ dataDir: string;
16
+ port: number;
17
+ adminTokenEnv: string;
18
+ callbacks: NativeHostCallbacks;
19
+ host?: string;
20
+ allowedOrigins?: readonly string[];
21
+ workerRetention?: NativeHostWorkerRetention;
22
+ changeLogRows?: number;
23
+ maxChangeRows?: number;
24
+ }
25
+ export interface NativeHost {
26
+ start(options?: SpawnOptions): ChildProcess;
27
+ }
28
+ export declare function createNativeHost(options: NativeHostOptions): NativeHost;
29
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMhF,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAA;IAC1B,aAAa,EAAE,MAAM,GAAG,GAAG,CAAA;IAC3B,gBAAgB,EAAE,MAAM,GAAG,GAAG,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,mBAAmB,CAAA;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,eAAe,CAAC,EAAE,yBAAyB,CAAA;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,CAAA;CAC5C;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CA2BvE"}
package/dist/native.js ADDED
@@ -0,0 +1,105 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ const load = createRequire(import.meta.url);
7
+ export function createNativeHost(options) {
8
+ validateOptions(options);
9
+ return {
10
+ start(spawnOptions = {}) {
11
+ const configDir = mkdtempSync(join(tmpdir(), 'orez-native-'));
12
+ const schemaPath = join(configDir, 'schema.json');
13
+ const initSqlPath = join(configDir, 'init-sql.json');
14
+ try {
15
+ writeJson(schemaPath, options.schema);
16
+ writeJson(initSqlPath, options.initSql);
17
+ const launcher = load.resolve('orez-sync-native/launcher');
18
+ const child = spawn(process.execPath, [launcher, ...nativeHostArguments(options, schemaPath, initSqlPath)], { stdio: 'inherit', ...spawnOptions });
19
+ const cleanup = () => rmSync(configDir, { force: true, recursive: true });
20
+ child.once('error', cleanup);
21
+ child.once('close', cleanup);
22
+ return child;
23
+ }
24
+ catch (error) {
25
+ rmSync(configDir, { force: true, recursive: true });
26
+ throw error;
27
+ }
28
+ },
29
+ };
30
+ }
31
+ function nativeHostArguments(options, schemaPath, initSqlPath) {
32
+ const args = [
33
+ 'serve',
34
+ '--schema',
35
+ schemaPath,
36
+ '--init-sql',
37
+ initSqlPath,
38
+ '--data-dir',
39
+ options.dataDir,
40
+ '--port',
41
+ String(options.port),
42
+ '--admin-token-env',
43
+ options.adminTokenEnv,
44
+ '--auth-url',
45
+ String(options.callbacks.authenticate),
46
+ '--wake-authorize-url',
47
+ String(options.callbacks.authorizeWake),
48
+ '--query-transform-url',
49
+ String(options.callbacks.transformQueries),
50
+ ];
51
+ if (options.host)
52
+ args.push('--host', options.host);
53
+ if (options.callbacks.certificateAuthority) {
54
+ args.push('--callback-ca', options.callbacks.certificateAuthority);
55
+ }
56
+ for (const origin of options.allowedOrigins ?? []) {
57
+ args.push('--allow-origin', origin);
58
+ }
59
+ if (options.workerRetention) {
60
+ args.push('--retention', 'workers', '--worker-idle-ms', String(options.workerRetention.idleMs), '--worker-sweep-ms', String(options.workerRetention.sweepIntervalMs));
61
+ }
62
+ if (options.changeLogRows !== undefined) {
63
+ args.push('--retain-changes', String(options.changeLogRows));
64
+ }
65
+ if (options.maxChangeRows !== undefined) {
66
+ args.push('--max-change-rows', String(options.maxChangeRows));
67
+ }
68
+ return args;
69
+ }
70
+ function validateOptions(options) {
71
+ positiveInteger(options.port, 'port');
72
+ if (!options.adminTokenEnv)
73
+ throw new TypeError('adminTokenEnv must not be empty');
74
+ if (!options.dataDir)
75
+ throw new TypeError('dataDir must not be empty');
76
+ if (!Array.isArray(options.initSql))
77
+ throw new TypeError('initSql must be an array');
78
+ for (const statement of options.initSql) {
79
+ if (typeof statement !== 'string' || !statement.trim()) {
80
+ throw new TypeError('initSql statements must be non-empty strings');
81
+ }
82
+ }
83
+ if (options.workerRetention) {
84
+ positiveInteger(options.workerRetention.idleMs, 'workerRetention.idleMs');
85
+ positiveInteger(options.workerRetention.sweepIntervalMs, 'workerRetention.sweepIntervalMs');
86
+ }
87
+ if (options.changeLogRows !== undefined) {
88
+ positiveInteger(options.changeLogRows, 'changeLogRows');
89
+ }
90
+ if (options.maxChangeRows !== undefined) {
91
+ positiveInteger(options.maxChangeRows, 'maxChangeRows');
92
+ }
93
+ }
94
+ function positiveInteger(value, name) {
95
+ if (!Number.isSafeInteger(value) || value < 1) {
96
+ throw new TypeError(`${name} must be a positive integer`);
97
+ }
98
+ }
99
+ function writeJson(path, value) {
100
+ const json = JSON.stringify(value);
101
+ if (json === undefined)
102
+ throw new TypeError('native host configuration must be JSON');
103
+ writeFileSync(path, json, { encoding: 'utf8', mode: 0o600 });
104
+ }
105
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orez-lite",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "SQLite and Rust sync engine for Zero applications",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -36,6 +36,10 @@
36
36
  "types": "./dist/browser/index.d.ts",
37
37
  "import": "./dist/browser/index.js"
38
38
  },
39
+ "./native": {
40
+ "types": "./dist/native.d.ts",
41
+ "import": "./dist/native.js"
42
+ },
39
43
  "./cloudflare": {
40
44
  "types": "./dist/cloudflare.d.ts",
41
45
  "import": "./dist/cloudflare.js"
@@ -81,10 +85,10 @@
81
85
  "@noble/ciphers": "1.3.0",
82
86
  "@noble/curves": "1.9.7",
83
87
  "@noble/hashes": "1.8.0",
84
- "bedrock-sqlite": "0.10.2",
88
+ "bedrock-sqlite": "0.10.3",
85
89
  "esbuild": "^0.25.0",
86
- "orez-sync-cf-host": "0.10.2",
87
- "orez-sync-executor": "0.10.2"
90
+ "orez-sync-cf-host": "0.10.3",
91
+ "orez-sync-executor": "0.10.3"
88
92
  },
89
93
  "peerDependencies": {
90
94
  "@rocicorp/zero": ">=1.7.0",
@@ -95,6 +99,9 @@
95
99
  "optional": true
96
100
  }
97
101
  },
102
+ "optionalDependencies": {
103
+ "orez-sync-native": "0.1.1"
104
+ },
98
105
  "devDependencies": {
99
106
  "@rocicorp/zero": "1.7.0",
100
107
  "@types/node": "^22.0.0",