orez-sync-executor 0.5.32

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.
@@ -0,0 +1,25 @@
1
+ import type { ApplicationDatabase, ApplicationTransaction, JsonValue, TransactionQueryFormat } from './types.js';
2
+ import type { Schema } from '@rocicorp/zero';
3
+ export type PostgreSQLQueryResult<Row extends Record<string, unknown>> = {
4
+ readonly rows: readonly Row[];
5
+ readonly rowCount?: number | null;
6
+ };
7
+ export type PostgreSQLClient = {
8
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<PostgreSQLQueryResult<Row>>;
9
+ release(): void;
10
+ };
11
+ export type PostgreSQLPool = {
12
+ connect(): Promise<PostgreSQLClient>;
13
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<PostgreSQLQueryResult<Row>>;
14
+ };
15
+ export type PostgreSQLApplicationDatabaseOptions = {
16
+ readonly internalSchema?: string;
17
+ readonly schema?: Schema;
18
+ readonly queryAst?: <Result>(tx: PostgreSQLClient, ast: JsonValue, format: TransactionQueryFormat, queryName?: string) => Promise<Result>;
19
+ };
20
+ export declare function createPostgreSQLApplicationDatabase(pool: PostgreSQLPool, options?: PostgreSQLApplicationDatabaseOptions): ApplicationDatabase;
21
+ export declare function createSQLiteApplicationDatabase(options: {
22
+ transaction<Value>(work: (tx: ApplicationTransaction) => Value | Promise<Value>): Promise<Value>;
23
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<readonly Row[]>;
24
+ }): ApplicationDatabase;
25
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EAEtB,SAAS,EAET,sBAAsB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAGxE,MAAM,MAAM,qBAAqB,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACvE,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACpC,KAAK,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,oCAAoC,GAAG;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EACzB,EAAE,EAAE,gBAAgB,EACpB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,sBAAsB,EAC9B,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC,MAAM,CAAC,CAAA;CACrB,CAAA;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,oCAAyC,GACjD,mBAAmB,CAsKrB;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,WAAW,CAAC,KAAK,EACf,IAAI,EAAE,CAAC,EAAE,EAAE,sBAAsB,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAC3D,OAAO,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC,CAAA;CAC3B,GAAG,mBAAmB,CAEtB"}
@@ -0,0 +1,116 @@
1
+ import { executePostgresQuery } from '@rocicorp/zero/server';
2
+ export function createPostgreSQLApplicationDatabase(pool, options = {}) {
3
+ let serverSchema;
4
+ async function introspectServerSchema(client) {
5
+ if (!options.schema) {
6
+ throw new TypeError('PostgreSQL application database requires schema or queryAst for ZQL reads');
7
+ }
8
+ const tables = Object.values(options.schema.tables).map((table) => {
9
+ const serverName = table.serverName ?? table.name;
10
+ const period = serverName.indexOf('.');
11
+ return period < 0
12
+ ? { schema: 'public', table: serverName }
13
+ : {
14
+ schema: serverName.slice(0, period),
15
+ table: serverName.slice(period + 1),
16
+ };
17
+ });
18
+ if (tables.length === 0)
19
+ return {};
20
+ const params = tables.flatMap((table) => [table.schema, table.table]);
21
+ const where = tables
22
+ .map((_, index) => `(c.table_schema = $${index * 2 + 1} AND c.table_name = $${index * 2 + 2})`)
23
+ .join(' OR ');
24
+ const rows = (await client.query(`SELECT
25
+ c.table_schema::text AS schema,
26
+ c.table_name::text AS table,
27
+ c.column_name::text AS column,
28
+ c.data_type::text AS "dataType",
29
+ t.typtype::text AS typtype,
30
+ t.typname::text AS typename,
31
+ CASE WHEN t.typelem <> 0 THEN et.typtype::text ELSE NULL END AS "elemTyptype",
32
+ CASE WHEN t.typelem <> 0 THEN et.typname::text ELSE NULL END AS "elemTypname"
33
+ FROM information_schema.columns c
34
+ JOIN pg_catalog.pg_type t ON c.udt_name = t.typname
35
+ LEFT JOIN pg_catalog.pg_type et ON t.typelem = et.oid
36
+ JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid
37
+ WHERE ${where}`, params)).rows;
38
+ const result = {};
39
+ for (const row of rows) {
40
+ const tableName = row.schema === 'public' ? row.table : `${row.schema}.${row.table}`;
41
+ const table = (result[tableName] ??= {});
42
+ const isArray = row.elemTyptype !== null;
43
+ const isEnum = (row.elemTyptype ?? row.typtype) === 'e';
44
+ table[row.column] = {
45
+ type: isArray
46
+ ? (row.elemTypname ?? row.dataType.toLowerCase())
47
+ : isEnum
48
+ ? row.typename
49
+ : row.dataType.toLowerCase(),
50
+ isArray,
51
+ isEnum,
52
+ };
53
+ }
54
+ return result;
55
+ }
56
+ const transactionFor = (client) => ({
57
+ async exec(sql, params = [], _metadata) {
58
+ const result = await client.query(sql, params);
59
+ return { changes: result.rowCount ?? 0 };
60
+ },
61
+ async query(sql, params = []) {
62
+ return (await client.query(sql, params)).rows;
63
+ },
64
+ queryAst(ast, format, queryName) {
65
+ if (!options.queryAst) {
66
+ if (!options.schema) {
67
+ throw new TypeError('PostgreSQL application database requires schema or queryAst for ZQL reads');
68
+ }
69
+ serverSchema ??= introspectServerSchema(client);
70
+ const dbTransaction = {
71
+ wrappedTransaction: client,
72
+ async query(sql, params) {
73
+ return (await client.query(sql, params)).rows;
74
+ },
75
+ runQuery(queryAst, queryFormat, schema, resolvedServerSchema) {
76
+ return executePostgresQuery(this, queryAst, queryFormat, schema, resolvedServerSchema);
77
+ },
78
+ };
79
+ return serverSchema.then((resolved) => executePostgresQuery(dbTransaction, ast, format, options.schema, resolved));
80
+ }
81
+ return options.queryAst(client, ast, format, queryName);
82
+ },
83
+ });
84
+ return {
85
+ dialect: 'postgresql',
86
+ internalSchema: options.internalSchema,
87
+ async transaction(work) {
88
+ const client = await pool.connect();
89
+ try {
90
+ await client.query('BEGIN');
91
+ const result = await work(transactionFor(client));
92
+ await client.query('COMMIT');
93
+ return result;
94
+ }
95
+ catch (error) {
96
+ try {
97
+ await client.query('ROLLBACK');
98
+ }
99
+ catch {
100
+ // preserve the application or commit error that caused the rollback.
101
+ }
102
+ throw error;
103
+ }
104
+ finally {
105
+ client.release();
106
+ }
107
+ },
108
+ async query(sql, params = []) {
109
+ return (await pool.query(sql, params)).rows;
110
+ },
111
+ };
112
+ }
113
+ export function createSQLiteApplicationDatabase(options) {
114
+ return { dialect: 'sqlite', ...options };
115
+ }
116
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { MutationApplicationError } from './errors.js';
2
+ export { createSyncExecutor, handleSyncExecutorPushRequest, registerMutators, } from './executor.js';
3
+ export type { ApplicationDatabase, ApplicationTransaction, CreateSyncExecutorOptions, DeferredEffect, DeferredEffectOptions, EffectScheduler, ExecResult, JsonPrimitive, JsonValue, MutationContext, MutatorRegistry, NormalizedClaims, PushResult, QueryResolver, RegisteredMutator, ServerTransaction, SqlStatementMetadata, SyncExecutor, TransactionQueryFormat, VisibilityConfig, VisibilityExpression, VisibilityFilter, VisibilityOperand, VisibilityValue, ZeroSchemaConfig, } from './types.js';
4
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAEtB,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
package/dist/core.js ADDED
@@ -0,0 +1,3 @@
1
+ export { MutationApplicationError } from './errors.js';
2
+ export { createSyncExecutor, handleSyncExecutorPushRequest, registerMutators, } from './executor.js';
3
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,eAAe,CAAA"}
package/dist/crud.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { ApplicationTransaction, JsonValue, SqlStatementMetadata, ZeroSchemaConfig } from './types.js';
2
+ type CrudKind = SqlStatementMetadata['kind'];
3
+ export declare function executeCrud(tx: ApplicationTransaction, schema: ZeroSchemaConfig, dialect: 'sqlite' | 'postgresql', tableName: string, kind: CrudKind, input: unknown): Promise<void>;
4
+ export declare function isJsonValue(value: unknown): value is JsonValue;
5
+ export {};
6
+ //# sourceMappingURL=crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB,KAAK,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAqC5C,wBAAsB,WAAW,CAC/B,EAAE,EAAE,sBAAsB,EAC1B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,QAAQ,GAAG,YAAY,EAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CA8Ff;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAY9D"}
package/dist/crud.js ADDED
@@ -0,0 +1,114 @@
1
+ function quoteIdentifier(value) {
2
+ if (!value)
3
+ throw new TypeError('SQL identifier must not be empty');
4
+ return `"${value.replaceAll('"', '""')}"`;
5
+ }
6
+ function quoteTable(value, dialect) {
7
+ return dialect === 'postgresql'
8
+ ? value.split('.').map(quoteIdentifier).join('.')
9
+ : quoteIdentifier(value);
10
+ }
11
+ function placeholder(dialect, index) {
12
+ return dialect === 'sqlite' ? '?' : `$${index}`;
13
+ }
14
+ function encodeValue(dialect, type, value) {
15
+ if (value === null)
16
+ return null;
17
+ if (dialect === 'sqlite') {
18
+ if (type === 'boolean' && typeof value === 'boolean')
19
+ return value ? 1 : 0;
20
+ if (type === 'json')
21
+ return JSON.stringify(value);
22
+ }
23
+ return value;
24
+ }
25
+ function valueRecord(value) {
26
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
27
+ throw new TypeError('CRUD value must be an object');
28
+ }
29
+ return value;
30
+ }
31
+ export async function executeCrud(tx, schema, dialect, tableName, kind, input) {
32
+ const table = schema.tables[tableName];
33
+ if (!table)
34
+ throw new TypeError(`unknown table: ${tableName}`);
35
+ const value = valueRecord(input);
36
+ const entries = Object.entries(value).filter(([, field]) => field !== undefined);
37
+ for (const [column] of entries) {
38
+ if (!table.columns[column]) {
39
+ throw new TypeError(`unknown column: ${tableName}.${column}`);
40
+ }
41
+ }
42
+ for (const primaryKey of table.primaryKey) {
43
+ if (!Object.hasOwn(value, primaryKey) || value[primaryKey] === undefined) {
44
+ throw new TypeError(`missing primary key: ${tableName}.${primaryKey}`);
45
+ }
46
+ }
47
+ const physicalTable = table.serverName ?? table.name ?? tableName;
48
+ const quotedTable = quoteTable(physicalTable, dialect);
49
+ const physicalColumn = (column) => table.columns[column]?.serverName ?? column;
50
+ const metadata = {
51
+ table: physicalTable,
52
+ publicTable: tableName,
53
+ kind,
54
+ };
55
+ const primaryKeys = table.primaryKey.map((column) => physicalColumn(column));
56
+ const whereParams = table.primaryKey.map((column) => encodeValue(dialect, table.columns[column].type, value[column]));
57
+ if (kind === 'delete') {
58
+ const where = primaryKeys
59
+ .map((column, index) => `${quoteIdentifier(column)} = ${placeholder(dialect, index + 1)}`)
60
+ .join(' AND ');
61
+ await tx.exec(`DELETE FROM ${quotedTable} WHERE ${where}`, whereParams, metadata);
62
+ return;
63
+ }
64
+ if (kind === 'update') {
65
+ const mutable = entries.filter(([column]) => !table.primaryKey.includes(column));
66
+ if (mutable.length === 0)
67
+ return;
68
+ const params = mutable.map(([column, field]) => encodeValue(dialect, table.columns[column].type, field));
69
+ const set = mutable
70
+ .map(([column], index) => `${quoteIdentifier(physicalColumn(column))} = ${placeholder(dialect, index + 1)}`)
71
+ .join(', ');
72
+ const where = primaryKeys
73
+ .map((column, index) => `${quoteIdentifier(column)} = ${placeholder(dialect, mutable.length + index + 1)}`)
74
+ .join(' AND ');
75
+ await tx.exec(`UPDATE ${quotedTable} SET ${set} WHERE ${where}`, [...params, ...whereParams], metadata);
76
+ return;
77
+ }
78
+ const columns = entries.map(([column]) => column);
79
+ const params = entries.map(([column, field]) => encodeValue(dialect, table.columns[column].type, field));
80
+ const insert = `INSERT INTO ${quotedTable} (${columns
81
+ .map((column) => quoteIdentifier(physicalColumn(column)))
82
+ .join(', ')}) VALUES (${params
83
+ .map((_, index) => placeholder(dialect, index + 1))
84
+ .join(', ')})`;
85
+ const conflict = primaryKeys.map(quoteIdentifier).join(', ');
86
+ if (kind === 'insert') {
87
+ await tx.exec(`${insert} ON CONFLICT (${conflict}) DO NOTHING`, params, metadata);
88
+ return;
89
+ }
90
+ const mutable = columns.filter((column) => !table.primaryKey.includes(column));
91
+ const action = mutable.length === 0
92
+ ? 'DO NOTHING'
93
+ : `DO UPDATE SET ${mutable
94
+ .map((column) => {
95
+ const physical = quoteIdentifier(physicalColumn(column));
96
+ return `${physical} = excluded.${physical}`;
97
+ })
98
+ .join(', ')}`;
99
+ await tx.exec(`${insert} ON CONFLICT (${conflict}) ${action}`, params, metadata);
100
+ }
101
+ export function isJsonValue(value) {
102
+ if (value === null ||
103
+ typeof value === 'string' ||
104
+ typeof value === 'boolean' ||
105
+ (typeof value === 'number' && Number.isFinite(value))) {
106
+ return true;
107
+ }
108
+ if (Array.isArray(value))
109
+ return value.every(isJsonValue);
110
+ if (typeof value !== 'object')
111
+ return false;
112
+ return Object.values(value).every(isJsonValue);
113
+ }
114
+ //# sourceMappingURL=crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.js","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { DeferredEffect, DeferredEffectOptions, EffectScheduler } from './types.js';
2
+ export type EffectAttempt = {
3
+ readonly defer: (effect: DeferredEffect, options?: DeferredEffectOptions) => void;
4
+ close(): void;
5
+ entries(): readonly {
6
+ readonly effect: DeferredEffect;
7
+ readonly barrier: boolean;
8
+ }[];
9
+ };
10
+ export declare function createEffectAttempt(): EffectAttempt;
11
+ export declare function runCommittedEffects(entries: readonly {
12
+ readonly effect: DeferredEffect;
13
+ readonly barrier: boolean;
14
+ }[], scheduler: EffectScheduler): Promise<void>;
15
+ //# sourceMappingURL=effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAExF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACjF,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,IAAI,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CACrF,CAAA;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAenD;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,EAClF,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,32 @@
1
+ export function createEffectAttempt() {
2
+ const effects = [];
3
+ let open = true;
4
+ return {
5
+ defer(effect, options) {
6
+ if (!open)
7
+ throw new Error('cannot defer an effect after the transaction attempt');
8
+ effects.push({ effect, barrier: options?.barrier === true });
9
+ },
10
+ close() {
11
+ open = false;
12
+ },
13
+ entries() {
14
+ return effects;
15
+ },
16
+ };
17
+ }
18
+ export async function runCommittedEffects(entries, scheduler) {
19
+ const barriers = entries.filter((entry) => entry.barrier);
20
+ await Promise.all(barriers.map(({ effect }) => Promise.resolve().then(effect)));
21
+ const background = entries.filter((entry) => !entry.barrier);
22
+ if (background.length === 0)
23
+ return;
24
+ const promise = Promise.allSettled(background.map(({ effect }) => Promise.resolve().then(effect))).then((results) => {
25
+ for (const result of results) {
26
+ if (result.status === 'rejected')
27
+ scheduler.report(result.reason);
28
+ }
29
+ });
30
+ await scheduler.runBackground(promise);
31
+ }
32
+ //# sourceMappingURL=effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.js","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAmD,EAAE,CAAA;IAClE,IAAI,IAAI,GAAG,IAAI,CAAA;IACf,OAAO;QACL,KAAK,CAAC,MAAM,EAAE,OAAO;YACnB,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;YAClF,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC,CAAA;QAC9D,CAAC;QACD,KAAK;YACH,IAAI,GAAG,KAAK,CAAA;QACd,CAAC;QACD,OAAO;YACL,OAAO,OAAO,CAAA;QAChB,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAkF,EAClF,SAA0B;IAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAE/E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAChC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAC/D,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;gBAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACnE,CAAC;IACH,CAAC,CAAC,CAAA;IACF,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { JsonValue } from './types.js';
2
+ export declare class MutationApplicationError extends Error {
3
+ readonly details: JsonValue;
4
+ constructor(details: JsonValue, message?: string);
5
+ }
6
+ export declare class SyncExecutorRequestError extends Error {
7
+ readonly status: 400 | 403;
8
+ constructor(status: 400 | 403, message: string);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;gBAEf,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM;CAKjD;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;gBAAjB,MAAM,EAAE,GAAG,GAAG,GAAG,EAC1B,OAAO,EAAE,MAAM;CAKlB"}
package/dist/errors.js ADDED
@@ -0,0 +1,17 @@
1
+ export class MutationApplicationError extends Error {
2
+ details;
3
+ constructor(details, message) {
4
+ super(message ?? (typeof details === 'string' ? details : 'mutation rejected'));
5
+ this.name = 'MutationApplicationError';
6
+ this.details = details;
7
+ }
8
+ }
9
+ export class SyncExecutorRequestError extends Error {
10
+ status;
11
+ constructor(status, message) {
12
+ super(message);
13
+ this.status = status;
14
+ this.name = 'SyncExecutorRequestError';
15
+ }
16
+ }
17
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,OAAO,CAAW;IAE3B,YAAY,OAAkB,EAAE,OAAgB;QAC9C,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAC/E,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAEtC;IADX,YACW,MAAiB,EAC1B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHL,WAAM,GAAN,MAAM,CAAW;QAI1B,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { CreateSyncExecutorOptions, MutatorRegistry, NormalizedClaims, SyncExecutor } from './types.js';
2
+ import type { Schema } from '@rocicorp/zero';
3
+ export declare function registerMutators<S extends Schema, const Registry extends Record<string, MutatorRegistry<S>[string]>>(registry: Registry): Readonly<Registry>;
4
+ export declare function createSyncExecutor<S extends Schema>(options: CreateSyncExecutorOptions<S>): SyncExecutor<S>;
5
+ export declare function handleSyncExecutorPushRequest<S extends Schema>(options: {
6
+ readonly executor: SyncExecutor<S>;
7
+ readonly request: Request;
8
+ readonly claims: NormalizedClaims;
9
+ }): Promise<Response>;
10
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,yBAAyB,EAEzB,eAAe,EACf,gBAAgB,EAGhB,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAoO5C,wBAAgB,gBAAgB,CAC9B,CAAC,SAAS,MAAM,EAChB,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EACjE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAExC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACpC,YAAY,CAAC,CAAC,CAAC,CAkMjB;AAED,wBAAsB,6BAA6B,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE;IAC7E,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;CAClC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmBpB"}
@@ -0,0 +1,309 @@
1
+ import { isJsonValue } from './crud.js';
2
+ import { createEffectAttempt, runCommittedEffects, } from './effects.js';
3
+ import { SyncExecutorRequestError } from './errors.js';
4
+ import { createServerTransaction } from './transaction.js';
5
+ const CLEANUP_RESULTS_MUTATION_NAME = '_zero_cleanupResults';
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ }
9
+ function isMutationID(value) {
10
+ return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
11
+ }
12
+ function isMutationApplicationError(error) {
13
+ return (isRecord(error) &&
14
+ error.name === 'MutationApplicationError' &&
15
+ typeof error.message === 'string' &&
16
+ isJsonValue(error.details));
17
+ }
18
+ function validatePushBody(value) {
19
+ if (!isRecord(value) ||
20
+ typeof value.clientGroupID !== 'string' ||
21
+ value.clientGroupID.length === 0 ||
22
+ !Array.isArray(value.mutations) ||
23
+ typeof value.pushVersion !== 'number' ||
24
+ !Number.isFinite(value.pushVersion)) {
25
+ throw new SyncExecutorRequestError(400, 'invalid push body');
26
+ }
27
+ const mutations = [];
28
+ for (const [index, mutation] of value.mutations.entries()) {
29
+ if (!isRecord(mutation) ||
30
+ mutation.type !== 'custom' ||
31
+ (!isMutationID(mutation.id) &&
32
+ !(mutation.name === CLEANUP_RESULTS_MUTATION_NAME && mutation.id === 0)) ||
33
+ typeof mutation.clientID !== 'string' ||
34
+ mutation.clientID.length === 0 ||
35
+ typeof mutation.name !== 'string' ||
36
+ mutation.name.length === 0 ||
37
+ !Array.isArray(mutation.args) ||
38
+ !mutation.args.every(isJsonValue)) {
39
+ throw new SyncExecutorRequestError(400, `invalid mutation at index ${index}`);
40
+ }
41
+ mutations.push(mutation);
42
+ }
43
+ return {
44
+ clientGroupID: value.clientGroupID,
45
+ mutations,
46
+ pushVersion: value.pushVersion,
47
+ };
48
+ }
49
+ function validateClaims(claims) {
50
+ if (!claims || typeof claims.userID !== 'string' || claims.userID.length === 0) {
51
+ throw new SyncExecutorRequestError(403, 'authenticated claims require a userID');
52
+ }
53
+ }
54
+ function quoteIdentifier(value) {
55
+ if (!value)
56
+ throw new TypeError('SQL identifier must not be empty');
57
+ return `"${value.replaceAll('"', '""')}"`;
58
+ }
59
+ function internalTable(database, table) {
60
+ const quoted = quoteIdentifier(table);
61
+ return database.internalSchema
62
+ ? `${quoteIdentifier(database.internalSchema)}.${quoted}`
63
+ : quoted;
64
+ }
65
+ function placeholders(database, count) {
66
+ return Array.from({ length: count }, (_, index) => database.dialect === 'sqlite' ? '?' : `$${index + 1}`);
67
+ }
68
+ function counter(value, name) {
69
+ const parsed = typeof value === 'bigint' ? Number(value) : Number(value);
70
+ if (!Number.isSafeInteger(parsed) || parsed < 0) {
71
+ throw new Error(`unsafe ${name}: ${String(value)}`);
72
+ }
73
+ return parsed;
74
+ }
75
+ async function initializeLedger(database) {
76
+ await database.transaction(async (tx) => {
77
+ if (database.dialect === 'postgresql' && database.internalSchema) {
78
+ await tx.exec(`CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(database.internalSchema)}`);
79
+ }
80
+ const clients = internalTable(database, '_zsync_clients');
81
+ const changes = internalTable(database, '_zsync_changes');
82
+ const integer = database.dialect === 'sqlite' ? 'INTEGER' : 'BIGINT';
83
+ await tx.exec(`CREATE TABLE IF NOT EXISTS ${clients} (
84
+ "clientGroupID" TEXT NOT NULL,
85
+ "clientID" TEXT NOT NULL,
86
+ "lastMutationID" ${integer} NOT NULL,
87
+ "userID" TEXT,
88
+ PRIMARY KEY ("clientGroupID", "clientID")
89
+ )`);
90
+ if (database.dialect === 'sqlite') {
91
+ await tx.exec(`CREATE TABLE IF NOT EXISTS ${changes} (
92
+ "watermark" INTEGER PRIMARY KEY AUTOINCREMENT,
93
+ "tableName" TEXT NOT NULL,
94
+ "op" TEXT NOT NULL CHECK ("op" IN ('row', 'lmid', 'marker')),
95
+ "pk" TEXT
96
+ )`);
97
+ }
98
+ else {
99
+ await tx.exec(`CREATE TABLE IF NOT EXISTS ${changes} (
100
+ "watermark" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
101
+ "tableName" TEXT NOT NULL,
102
+ "op" TEXT NOT NULL CHECK ("op" IN ('row', 'lmid', 'marker')),
103
+ "pk" TEXT
104
+ )`);
105
+ }
106
+ });
107
+ }
108
+ async function preflight(database, tx, clientGroupID, clientID, mutationID, userID) {
109
+ const clients = internalTable(database, '_zsync_clients');
110
+ if (database.dialect === 'postgresql') {
111
+ const [groupLock] = placeholders(database, 1);
112
+ await tx.query(`SELECT pg_advisory_xact_lock(hashtextextended(${groupLock}, 0))`, [
113
+ clientGroupID,
114
+ ]);
115
+ }
116
+ const params = placeholders(database, 5);
117
+ await tx.exec(`INSERT INTO ${clients} ("clientGroupID", "clientID", "lastMutationID", "userID")
118
+ SELECT ${params[0]}, ${params[1]}, 0, ${params[2]}
119
+ WHERE NOT EXISTS (
120
+ SELECT 1 FROM ${clients}
121
+ WHERE "clientGroupID" = ${params[3]} AND "userID" IS NOT NULL AND "userID" <> ${params[4]}
122
+ )
123
+ ON CONFLICT ("clientGroupID", "clientID")
124
+ DO UPDATE SET "userID" = excluded."userID" WHERE "userID" IS NULL`, [clientGroupID, clientID, userID, clientGroupID, userID]);
125
+ const [groupParam] = placeholders(database, 1);
126
+ const owners = await tx.query(`SELECT DISTINCT "userID" AS "userID" FROM ${clients}
127
+ WHERE "clientGroupID" = ${groupParam} AND "userID" IS NOT NULL`, [clientGroupID]);
128
+ if (owners.some((row) => row.userID !== userID)) {
129
+ throw new SyncExecutorRequestError(403, 'client group belongs to a different user');
130
+ }
131
+ const [group, client] = placeholders(database, 2);
132
+ const lock = database.dialect === 'postgresql' ? ' FOR UPDATE' : '';
133
+ const rows = await tx.query(`SELECT "lastMutationID" AS "lastMutationID" FROM ${clients}
134
+ WHERE "clientGroupID" = ${group} AND "clientID" = ${client}${lock}`, [clientGroupID, clientID]);
135
+ if (!rows[0])
136
+ throw new Error('failed to claim sync client');
137
+ const lmid = counter(rows[0].lastMutationID, 'lastMutationID');
138
+ if (mutationID <= lmid)
139
+ return { kind: 'replay', expected: lmid + 1 };
140
+ if (mutationID > lmid + 1) {
141
+ throw new SyncExecutorRequestError(400, `mutation id ${mutationID} skips lmid ${lmid} (out of order)`);
142
+ }
143
+ return { kind: 'applied' };
144
+ }
145
+ async function advanceLMID(database, tx, clientGroupID, clientID, mutationID) {
146
+ const clients = internalTable(database, '_zsync_clients');
147
+ const changes = internalTable(database, '_zsync_changes');
148
+ const [mutation, group, client] = placeholders(database, 3);
149
+ await tx.exec(`UPDATE ${clients} SET "lastMutationID" = ${mutation}
150
+ WHERE "clientGroupID" = ${group} AND "clientID" = ${client}`, [mutationID, clientGroupID, clientID]);
151
+ const [tableName, op, pk] = placeholders(database, 3);
152
+ await tx.exec(`INSERT INTO ${changes} ("tableName", "op", "pk") VALUES (${tableName}, ${op}, ${pk})`, [
153
+ '_zsync_clients',
154
+ 'lmid',
155
+ JSON.stringify({ clientGroupID, clientID, lmid: mutationID }),
156
+ ]);
157
+ }
158
+ export function registerMutators(registry) {
159
+ return Object.freeze({ ...registry });
160
+ }
161
+ export function createSyncExecutor(options) {
162
+ const { database, effects, mutators, schema } = options;
163
+ let ledgerInitialization;
164
+ const ensureLedger = () => (ledgerInitialization ??= initializeLedger(database));
165
+ async function runMutation(mutator, args, claims, identity) {
166
+ let committedEffects = [];
167
+ await database.transaction(async (applicationTx) => {
168
+ const attempt = createEffectAttempt();
169
+ const tx = createServerTransaction(schema, applicationTx, database.dialect, identity?.clientID, identity?.mutationID);
170
+ const ctx = identity
171
+ ? {
172
+ source: 'zero-push',
173
+ claims,
174
+ ...identity,
175
+ defer: attempt.defer,
176
+ }
177
+ : {
178
+ source: 'direct',
179
+ claims,
180
+ defer: attempt.defer,
181
+ };
182
+ try {
183
+ await mutator({ tx, args, ctx });
184
+ attempt.close();
185
+ committedEffects = attempt.entries();
186
+ }
187
+ catch (error) {
188
+ attempt.close();
189
+ throw error;
190
+ }
191
+ });
192
+ return committedEffects;
193
+ }
194
+ return {
195
+ schema,
196
+ async push(body, claims) {
197
+ validateClaims(claims);
198
+ const push = validatePushBody(body);
199
+ if (push.pushVersion !== 1) {
200
+ return {
201
+ pushResponse: {
202
+ error: 'unsupportedPushVersion',
203
+ mutationIDs: push.mutations.map(({ clientID, id }) => ({ clientID, id })),
204
+ },
205
+ };
206
+ }
207
+ await ensureLedger();
208
+ const results = [];
209
+ for (const mutation of push.mutations) {
210
+ if (mutation.name === CLEANUP_RESULTS_MUTATION_NAME)
211
+ continue;
212
+ const id = { clientID: mutation.clientID, id: mutation.id };
213
+ let committedEffects = [];
214
+ try {
215
+ const decision = await database.transaction(async (applicationTx) => {
216
+ const current = await preflight(database, applicationTx, push.clientGroupID, mutation.clientID, mutation.id, claims.userID);
217
+ if (current.kind === 'replay')
218
+ return current;
219
+ const registered = mutators[mutation.name];
220
+ if (!registered)
221
+ throw new Error(`unknown mutator: ${mutation.name}`);
222
+ const attempt = createEffectAttempt();
223
+ const tx = createServerTransaction(schema, applicationTx, database.dialect, mutation.clientID, mutation.id);
224
+ try {
225
+ await registered({
226
+ tx,
227
+ args: mutation.args[0] ?? null,
228
+ ctx: {
229
+ source: 'zero-push',
230
+ claims,
231
+ clientGroupID: push.clientGroupID,
232
+ clientID: mutation.clientID,
233
+ mutationID: mutation.id,
234
+ defer: attempt.defer,
235
+ },
236
+ });
237
+ await advanceLMID(database, applicationTx, push.clientGroupID, mutation.clientID, mutation.id);
238
+ attempt.close();
239
+ committedEffects = attempt.entries();
240
+ return current;
241
+ }
242
+ catch (error) {
243
+ attempt.close();
244
+ throw error;
245
+ }
246
+ });
247
+ if (decision.kind === 'replay') {
248
+ results.push({
249
+ id,
250
+ result: {
251
+ error: 'alreadyProcessed',
252
+ details: `Ignoring mutation from ${mutation.clientID} with ID ${mutation.id} as it was already processed. Expected: ${decision.expected}`,
253
+ },
254
+ });
255
+ continue;
256
+ }
257
+ results.push({ id, result: {} });
258
+ await runCommittedEffects(committedEffects, effects);
259
+ }
260
+ catch (error) {
261
+ if (!isMutationApplicationError(error))
262
+ throw error;
263
+ await database.transaction(async (applicationTx) => {
264
+ const decision = await preflight(database, applicationTx, push.clientGroupID, mutation.clientID, mutation.id, claims.userID);
265
+ if (decision.kind === 'applied') {
266
+ await advanceLMID(database, applicationTx, push.clientGroupID, mutation.clientID, mutation.id);
267
+ }
268
+ });
269
+ results.push({
270
+ id,
271
+ result: { error: 'app', message: error.message, details: error.details },
272
+ });
273
+ }
274
+ }
275
+ return { pushResponse: { mutations: results } };
276
+ },
277
+ async execute(name, args, claims) {
278
+ validateClaims(claims);
279
+ const registered = mutators[name];
280
+ if (!registered)
281
+ throw new Error(`unknown mutator: ${name}`);
282
+ const committed = await runMutation(registered, args, claims, undefined);
283
+ await runCommittedEffects(committed, effects);
284
+ },
285
+ async transaction(claims, work) {
286
+ validateClaims(claims);
287
+ return database.transaction((applicationTx) => work(createServerTransaction(schema, applicationTx, database.dialect)));
288
+ },
289
+ async query(claims, work) {
290
+ validateClaims(claims);
291
+ return database.transaction((applicationTx) => work(createServerTransaction(schema, applicationTx, database.dialect)));
292
+ },
293
+ };
294
+ }
295
+ export async function handleSyncExecutorPushRequest(options) {
296
+ try {
297
+ const result = await options.executor.push(await options.request.json(), options.claims);
298
+ return Response.json(result);
299
+ }
300
+ catch (error) {
301
+ const status = error instanceof SyncExecutorRequestError
302
+ ? error.status
303
+ : error instanceof SyntaxError
304
+ ? 400
305
+ : 500;
306
+ return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status });
307
+ }
308
+ }
309
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAEpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAe1D,MAAM,6BAA6B,GAAG,sBAAsB,CAAA;AAoB5D,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AAC9E,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAc;IAEd,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,IAAI,KAAK,0BAA0B;QACzC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAC3B,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC/B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,wBAAwB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,SAAS,GAAmB,EAAE,CAAA;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,IACE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnB,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAC1B,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,6BAA6B,IAAI,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1E,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;YACrC,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAC9B,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;YACjC,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC7B,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EACjC,CAAC;YACD,MAAM,IAAI,wBAAwB,CAAC,GAAG,EAAE,6BAA6B,KAAK,EAAE,CAAC,CAAA;QAC/E,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,QAAwB,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS;QACT,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAwB;IAC9C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,wBAAwB,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAA;IAClF,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAA;IACnE,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,QAA6B,EAAE,KAAa;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACrC,OAAO,QAAQ,CAAC,cAAc;QAC5B,CAAC,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,MAAM,EAAE;QACzD,CAAC,CAAC,MAAM,CAAA;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,QAA6B,EAAE,KAAa;IAChE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAChD,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CACtD,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY;IAC3C,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACxE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAA6B;IAC3D,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACtC,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,IAAI,CACX,+BAA+B,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAC1E,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;QACpE,MAAM,EAAE,CAAC,IAAI,CAAC,8BAA8B,OAAO;;;yBAG9B,OAAO;;;MAG1B,CAAC,CAAA;QACH,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,EAAE,CAAC,IAAI,CAAC,8BAA8B,OAAO;;;;;QAKjD,CAAC,CAAA;QACL,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,IAAI,CAAC,8BAA8B,OAAO;;;;;QAKjD,CAAC,CAAA;QACL,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,QAA6B,EAC7B,EAA0B,EAC1B,aAAqB,EACrB,QAAgB,EAChB,UAAkB,EAClB,MAAc;IAEd,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IACzD,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,iDAAiD,SAAS,OAAO,EAAE;YAChF,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACxC,MAAM,EAAE,CAAC,IAAI,CACX,eAAe,OAAO;cACZ,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC;;uBAE/B,OAAO;iCACG,MAAM,CAAC,CAAC,CAAC,6CAA6C,MAAM,CAAC,CAAC,CAAC;;;uEAGzB,EACnE,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CACzD,CAAA;IAED,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B,6CAA6C,OAAO;+BACzB,UAAU,2BAA2B,EAChE,CAAC,aAAa,CAAC,CAChB,CAAA;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,wBAAwB,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAA;IACrF,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;IACnE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB,oDAAoD,OAAO;+BAChC,KAAK,qBAAqB,MAAM,GAAG,IAAI,EAAE,EACpE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAC1B,CAAA;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;IAC9D,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,EAAE,CAAA;IACrE,IAAI,UAAU,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,wBAAwB,CAChC,GAAG,EACH,eAAe,UAAU,eAAe,IAAI,iBAAiB,CAC9D,CAAA;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5B,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAA6B,EAC7B,EAA0B,EAC1B,aAAqB,EACrB,QAAgB,EAChB,UAAkB;IAElB,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IACzD,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC3D,MAAM,EAAE,CAAC,IAAI,CACX,UAAU,OAAO,2BAA2B,QAAQ;+BACzB,KAAK,qBAAqB,MAAM,EAAE,EAC7D,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CACtC,CAAA;IACD,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,EAAE,CAAC,IAAI,CACX,eAAe,OAAO,sCAAsC,SAAS,KAAK,EAAE,KAAK,EAAE,GAAG,EACtF;QACE,gBAAgB;QAChB,MAAM;QACN,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;KAC9D,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAG9B,QAAkB;IAClB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAqC;IAErC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACvD,IAAI,oBAA+C,CAAA;IACnD,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,oBAAoB,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEhF,KAAK,UAAU,WAAW,CACxB,OAAmC,EACnC,IAAe,EACf,MAAwB,EACxB,QAAqF;QAErF,IAAI,gBAAgB,GAAyC,EAAE,CAAA;QAC/D,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;YACjD,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAA;YACrC,MAAM,EAAE,GAAG,uBAAuB,CAChC,MAAM,EACN,aAAa,EACb,QAAQ,CAAC,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,CACrB,CAAA;YACD,MAAM,GAAG,GAAG,QAAQ;gBAClB,CAAC,CAAC;oBACE,MAAM,EAAE,WAAoB;oBAC5B,MAAM;oBACN,GAAG,QAAQ;oBACX,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB;gBACH,CAAC,CAAC;oBACE,MAAM,EAAE,QAAiB;oBACzB,MAAM;oBACN,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAA;YACL,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;gBAChC,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,CAAA;gBACf,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED,OAAO;QACL,MAAM;QAEN,KAAK,CAAC,IAAI,CAAC,IAAa,EAAE,MAAwB;YAChD,cAAc,CAAC,MAAM,CAAC,CAAA;YACtB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,YAAY,EAAE;wBACZ,KAAK,EAAE,wBAAwB;wBAC/B,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;qBAC1E;iBACF,CAAA;YACH,CAAC;YACD,MAAM,YAAY,EAAE,CAAA;YAEpB,MAAM,OAAO,GAMR,EAAE,CAAA;YAEP,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,IAAI,QAAQ,CAAC,IAAI,KAAK,6BAA6B;oBAAE,SAAQ;gBAC7D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAA;gBAC3D,IAAI,gBAAgB,GAAyC,EAAE,CAAA;gBAC/D,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;wBAClE,MAAM,OAAO,GAAG,MAAM,SAAS,CAC7B,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,aAAa,EAClB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,EAAE,EACX,MAAM,CAAC,MAAM,CACd,CAAA;wBACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;4BAAE,OAAO,OAAO,CAAA;wBAE7C,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;wBAC1C,IAAI,CAAC,UAAU;4BAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;wBACrE,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAA;wBACrC,MAAM,EAAE,GAAG,uBAAuB,CAChC,MAAM,EACN,aAAa,EACb,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,EAAE,CACZ,CAAA;wBACD,IAAI,CAAC;4BACH,MAAM,UAAU,CAAC;gCACf,EAAE;gCACF,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;gCAC9B,GAAG,EAAE;oCACH,MAAM,EAAE,WAAW;oCACnB,MAAM;oCACN,aAAa,EAAE,IAAI,CAAC,aAAa;oCACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oCAC3B,UAAU,EAAE,QAAQ,CAAC,EAAE;oCACvB,KAAK,EAAE,OAAO,CAAC,KAAK;iCACrB;6BACF,CAAC,CAAA;4BACF,MAAM,WAAW,CACf,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,aAAa,EAClB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,EAAE,CACZ,CAAA;4BACD,OAAO,CAAC,KAAK,EAAE,CAAA;4BACf,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;4BACpC,OAAO,OAAO,CAAA;wBAChB,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,KAAK,EAAE,CAAA;4BACf,MAAM,KAAK,CAAA;wBACb,CAAC;oBACH,CAAC,CAAC,CAAA;oBAEF,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC;4BACX,EAAE;4BACF,MAAM,EAAE;gCACN,KAAK,EAAE,kBAAkB;gCACzB,OAAO,EAAE,0BAA0B,QAAQ,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAAE,2CAA2C,QAAQ,CAAC,QAAQ,EAAE;6BAC1I;yBACF,CAAC,CAAA;wBACF,SAAQ;oBACV,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;oBAChC,MAAM,mBAAmB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;gBACtD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAA;oBACnD,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;wBACjD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,aAAa,EAClB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,EAAE,EACX,MAAM,CAAC,MAAM,CACd,CAAA;wBACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BAChC,MAAM,WAAW,CACf,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,aAAa,EAClB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,EAAE,CACZ,CAAA;wBACH,CAAC;oBACH,CAAC,CAAC,CAAA;oBACF,OAAO,CAAC,IAAI,CAAC;wBACX,EAAE;wBACF,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;qBACzE,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAA;QACjD,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;YAC9B,cAAc,CAAC,MAAM,CAAC,CAAA;YACtB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YACjC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;YAC5D,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;YACxE,MAAM,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC/C,CAAC;QAED,KAAK,CAAC,WAAW,CACf,MAAwB,EACxB,IAA0D;YAE1D,cAAc,CAAC,MAAM,CAAC,CAAA;YACtB,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,EAAE,CAC5C,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CACvE,CAAA;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CACT,MAAwB,EACxB,IAA4D;YAE5D,cAAc,CAAC,MAAM,CAAC,CAAA;YACtB,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,EAAE,CAC5C,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CACvE,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAmB,OAIrE;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CACxC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAC5B,OAAO,CAAC,MAAM,CACf,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,KAAK,YAAY,wBAAwB;YACvC,CAAC,CAAC,KAAK,CAAC,MAAM;YACd,CAAC,CAAC,KAAK,YAAY,WAAW;gBAC5B,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,GAAG,CAAA;QACX,OAAO,QAAQ,CAAC,IAAI,CAClB,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACjE,EAAE,MAAM,EAAE,CACX,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createPostgreSQLApplicationDatabase, createSQLiteApplicationDatabase, } from './adapters.js';
2
+ export * from './core.js';
3
+ export type { PostgreSQLApplicationDatabaseOptions, PostgreSQLClient, PostgreSQLPool, PostgreSQLQueryResult, } from './adapters.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,eAAe,CAAA;AACtB,cAAc,WAAW,CAAA;AAEzB,YAAY,EACV,oCAAoC,EACpC,gBAAgB,EAChB,cAAc,EACd,qBAAqB,GACtB,MAAM,eAAe,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createPostgreSQLApplicationDatabase, createSQLiteApplicationDatabase, } from './adapters.js';
2
+ export * from './core.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,eAAe,CAAA;AACtB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { ApplicationTransaction, ServerTransaction } from './types.js';
2
+ import type { Schema } from '@rocicorp/zero';
3
+ export declare function createServerTransaction<S extends Schema>(schema: S, applicationTx: ApplicationTransaction, dialect: 'sqlite' | 'postgresql', clientID?: string, mutationID?: number): ServerTransaction<S>;
4
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,sBAAsB,EAEtB,iBAAiB,EAElB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAwB,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElE,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EACtD,MAAM,EAAE,CAAC,EACT,aAAa,EAAE,sBAAsB,EACrC,OAAO,EAAE,QAAQ,GAAG,YAAY,EAChC,QAAQ,SAAK,EACb,UAAU,SAAI,GACb,iBAAiB,CAAC,CAAC,CAAC,CA8CtB"}
@@ -0,0 +1,37 @@
1
+ import { createBuilder } from '@rocicorp/zero';
2
+ import { asQueryInternals } from '@rocicorp/zero/bindings';
3
+ import { executeCrud } from './crud.js';
4
+ export function createServerTransaction(schema, applicationTx, dialect, clientID = '', mutationID = 0) {
5
+ const mutate = {};
6
+ for (const tableName of Object.keys(schema.tables)) {
7
+ mutate[tableName] = {
8
+ insert: (value) => executeCrud(applicationTx, schema, dialect, tableName, 'insert', value),
9
+ upsert: (value) => executeCrud(applicationTx, schema, dialect, tableName, 'upsert', value),
10
+ update: (value) => executeCrud(applicationTx, schema, dialect, tableName, 'update', value),
11
+ delete: (value) => executeCrud(applicationTx, schema, dialect, tableName, 'delete', value),
12
+ };
13
+ }
14
+ const dbTransaction = {
15
+ wrappedTransaction: applicationTx,
16
+ async query(sql, args) {
17
+ return applicationTx.query(sql, args);
18
+ },
19
+ async runQuery(ast, format) {
20
+ return applicationTx.queryAst(ast, format);
21
+ },
22
+ };
23
+ return {
24
+ location: 'server',
25
+ reason: 'authoritative',
26
+ clientID,
27
+ mutationID,
28
+ mutate,
29
+ query: createBuilder(schema),
30
+ dbTransaction,
31
+ async run(query) {
32
+ const internals = asQueryInternals(query);
33
+ return applicationTx.queryAst(internals.ast, internals.format);
34
+ },
35
+ };
36
+ }
37
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAUvC,MAAM,UAAU,uBAAuB,CACrC,MAAS,EACT,aAAqC,EACrC,OAAgC,EAChC,QAAQ,GAAG,EAAE,EACb,UAAU,GAAG,CAAC;IAEd,MAAM,MAAM,GAAsE,EAAE,CAAA;IACpF,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,GAAG;YAClB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;YACzE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;YACzE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;YACzE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;SAC1E,CAAA;IACH,CAAC;IAED,MAAM,aAAa,GAAG;QACpB,kBAAkB,EAAE,aAAa;QACjC,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAe;YACtC,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACvC,CAAC;QACD,KAAK,CAAC,QAAQ,CACZ,GAAc,EACd,MAA8B;YAE9B,OAAO,aAAa,CAAC,QAAQ,CAAS,GAAG,EAAE,MAAM,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,eAAe;QACvB,QAAQ;QACR,UAAU;QACV,MAAM;QACN,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC;QAC5B,aAAa;QACb,KAAK,CAAC,GAAG,CACP,KAA+B;YAE/B,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;YACzC,OAAO,aAAa,CAAC,QAAQ,CAC3B,SAAS,CAAC,GAAgB,EAC1B,SAAS,CAAC,MAAM,CACjB,CAAA;QACH,CAAC;KACiC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,152 @@
1
+ import type { HumanReadable, Query, Schema, ServerTransaction as ZeroServerTransaction } from '@rocicorp/zero';
2
+ export type JsonPrimitive = string | number | boolean | null;
3
+ export type JsonValue = JsonPrimitive | readonly JsonValue[] | {
4
+ readonly [key: string]: JsonValue;
5
+ };
6
+ export type NormalizedClaims = {
7
+ readonly userID: string;
8
+ readonly [claim: string]: JsonValue;
9
+ };
10
+ export type ZeroSchemaConfig = {
11
+ readonly schemaID?: string;
12
+ readonly tables: Readonly<Record<string, {
13
+ readonly name?: string;
14
+ readonly serverName?: string;
15
+ readonly columns: Readonly<Record<string, {
16
+ readonly type: string;
17
+ readonly serverName?: string;
18
+ readonly optional?: boolean;
19
+ readonly encrypted?: true;
20
+ }>>;
21
+ readonly primaryKey: readonly string[];
22
+ }>>;
23
+ };
24
+ export type TransactionQueryFormat = {
25
+ readonly relationships: Readonly<Record<string, TransactionQueryFormat>>;
26
+ readonly singular: boolean;
27
+ };
28
+ export type SqlStatementMetadata = {
29
+ readonly table: string;
30
+ readonly publicTable: string;
31
+ readonly kind: 'delete' | 'insert' | 'update' | 'upsert';
32
+ };
33
+ export type ExecResult = {
34
+ readonly changes: number;
35
+ };
36
+ export interface ApplicationTransaction {
37
+ exec(sql: string, params?: readonly unknown[], metadata?: SqlStatementMetadata): Promise<ExecResult>;
38
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<readonly Row[]>;
39
+ queryAst<Result = unknown>(ast: JsonValue, format: TransactionQueryFormat, queryName?: string): Promise<Result>;
40
+ }
41
+ export interface ApplicationDatabase {
42
+ readonly dialect: 'sqlite' | 'postgresql';
43
+ readonly internalSchema?: string;
44
+ transaction<Value>(work: (tx: ApplicationTransaction) => Value | Promise<Value>): Promise<Value>;
45
+ query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<readonly Row[]>;
46
+ }
47
+ export type DeferredEffect = () => void | Promise<void>;
48
+ export type DeferredEffectOptions = {
49
+ readonly barrier?: boolean;
50
+ };
51
+ export type EffectScheduler = {
52
+ runBackground(promise: Promise<void>): void | Promise<void>;
53
+ report(error: unknown): void;
54
+ };
55
+ export type MutationContext = {
56
+ readonly claims: NormalizedClaims;
57
+ defer(effect: DeferredEffect, options?: DeferredEffectOptions): void;
58
+ } & ({
59
+ readonly source: 'zero-push';
60
+ readonly clientGroupID: string;
61
+ readonly clientID: string;
62
+ readonly mutationID: number;
63
+ } | {
64
+ readonly source: 'direct';
65
+ });
66
+ export type ServerTransaction<S extends Schema> = ZeroServerTransaction<S, ApplicationTransaction>;
67
+ export type RegisteredMutator<S extends Schema = Schema, Args extends JsonValue = JsonValue> = (input: {
68
+ readonly tx: ServerTransaction<S>;
69
+ readonly args: Args;
70
+ readonly ctx: MutationContext;
71
+ }) => void | Promise<void>;
72
+ export type MutatorRegistry<S extends Schema = Schema> = Readonly<Record<string, RegisteredMutator<S>>>;
73
+ export type CreateSyncExecutorOptions<S extends Schema> = {
74
+ readonly database: ApplicationDatabase;
75
+ readonly schema: S;
76
+ readonly mutators: MutatorRegistry<S>;
77
+ readonly effects: EffectScheduler;
78
+ };
79
+ export type PushResult = {
80
+ readonly pushResponse: {
81
+ readonly mutations: readonly {
82
+ readonly id: {
83
+ readonly clientID: string;
84
+ readonly id: number;
85
+ };
86
+ readonly result: Record<string, never> | {
87
+ readonly error: 'alreadyProcessed';
88
+ readonly details: string;
89
+ } | {
90
+ readonly error: 'app';
91
+ readonly message: string;
92
+ readonly details: JsonValue;
93
+ };
94
+ }[];
95
+ } | {
96
+ readonly error: 'unsupportedPushVersion';
97
+ readonly mutationIDs: readonly {
98
+ readonly clientID: string;
99
+ readonly id: number;
100
+ }[];
101
+ };
102
+ };
103
+ export interface SyncExecutor<S extends Schema> {
104
+ readonly schema: S;
105
+ push(body: unknown, claims: NormalizedClaims): Promise<PushResult>;
106
+ execute(name: keyof MutatorRegistry<S> & string, args: JsonValue, claims: NormalizedClaims): Promise<void>;
107
+ transaction<Value>(claims: NormalizedClaims, work: (tx: ServerTransaction<S>) => Value | Promise<Value>): Promise<Value>;
108
+ query<Result>(claims: NormalizedClaims, work: (tx: ServerTransaction<S>) => Result | Promise<Result>): Promise<Result>;
109
+ }
110
+ export type VisibilityValue = JsonPrimitive;
111
+ export type VisibilityOperand = {
112
+ readonly type: 'column';
113
+ readonly table: string;
114
+ readonly column: string;
115
+ readonly qualifier?: string;
116
+ } | {
117
+ readonly type: 'value';
118
+ readonly value: VisibilityValue;
119
+ };
120
+ export type VisibilityExpression = {
121
+ readonly type: 'comparison';
122
+ readonly operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'IS' | 'IS NOT';
123
+ readonly left: VisibilityOperand;
124
+ readonly right: VisibilityOperand;
125
+ } | {
126
+ readonly type: 'and' | 'or';
127
+ readonly conditions: readonly VisibilityExpression[];
128
+ } | {
129
+ readonly type: 'exists';
130
+ readonly table: string;
131
+ readonly qualifier?: string;
132
+ readonly where: VisibilityExpression;
133
+ };
134
+ export type VisibilityFilter = {
135
+ readonly kind: 'expression';
136
+ readonly expression: VisibilityExpression;
137
+ readonly sql?: never;
138
+ readonly params?: never;
139
+ } | {
140
+ readonly kind: 'raw';
141
+ readonly sql: string;
142
+ readonly params?: readonly VisibilityValue[];
143
+ readonly expression?: never;
144
+ };
145
+ export type VisibilityConfig = {
146
+ readonly rowLocal: boolean | ((claims: NormalizedClaims) => boolean);
147
+ filter(table: string, claims: NormalizedClaims): VisibilityFilter | undefined;
148
+ };
149
+ export type QueryResolver = (name: string, args: readonly JsonValue[], claims: NormalizedClaims) => JsonValue | Promise<JsonValue>;
150
+ export type TransactionQuery = Query<string, Schema, unknown>;
151
+ export type TransactionQueryResult = HumanReadable<unknown>;
152
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "orez-sync-executor",
3
+ "version": "0.5.32",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./core": {
12
+ "types": "./dist/core.d.ts",
13
+ "import": "./dist/core.js"
14
+ }
15
+ },
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.build.json",
18
+ "test": "vitest run src",
19
+ "typecheck": "tsc --noEmit"
20
+ },
21
+ "peerDependencies": {
22
+ "@rocicorp/zero": ">=1.7.0"
23
+ },
24
+ "devDependencies": {
25
+ "@rocicorp/zero": "1.7.0",
26
+ "@types/bun": "1.3.14",
27
+ "typescript": "5.9.3",
28
+ "vitest": "3.2.4"
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/natew/orez.git",
36
+ "directory": "packages/sync-executor"
37
+ }
38
+ }