interaqt 2.0.2 → 2.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"drivers.js","sources":["../src/drivers/SQLite.ts","../src/drivers/PostgreSQL.ts","../node_modules/@interaqt/uuidv7/dist/index.js","../src/drivers/PGLite.ts","../src/drivers/Mysql.ts"],"sourcesContent":["import SQLite from \"better-sqlite3\";\n// CAUTION drivers 是发布包的独立子入口(interaqt/drivers),只能从主入口 \"interaqt\" 导入:\n// 路径别名(@storage 等)在消费者环境不存在,且共享单例(asyncInteractionContext)必须与主包同源。\nimport {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR, asyncInteractionContext, InteractionContext, dbConsoleLogger, TransactionCapability, sqliteEncodeLiteral} from \"interaqt\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n async setup() {\n await this.db.scheme(`CREATE Table IF NOT EXISTS _IDS_ (last INTEGER, name TEXT)`)\n // 原子 UPSERT 依赖 name 上的唯一索引;IF NOT EXISTS 同时兼容旧版建出的无约束 _IDS_ 表。\n await this.db.scheme(`CREATE UNIQUE INDEX IF NOT EXISTS \"_IDS__name_unique\" ON _IDS_ (name)`)\n }\n async getAutoId(recordName: string) {\n // CAUTION 原子 UPSERT:此前的「SELECT 再 INSERT/UPDATE」读-改-写在并发下会分配重复 id;\n // recordName 一律走参数绑定(与 PostgreSQL 驱动的参数化路径一致)。\n const rows = await this.db.query<{ last: number }>(\n `INSERT INTO _IDS_ (name, last) VALUES (?, 1)\nON CONFLICT(name) DO UPDATE SET last = last + 1\nRETURNING last`,\n [recordName],\n `allocate next id for ${recordName}`\n )\n return rows[0].last as unknown as string\n }\n}\n\nexport type SQLiteDBOptions = Parameters<typeof SQLite>[1] & { logger :DatabaseLogger }\n\nexport class SQLiteDB implements Database{\n db!: InstanceType<typeof SQLite>\n idSystem!: IDSystem\n logger: DatabaseLogger\n supportsSelectForUpdate = false\n // SQLite 的 SQLITE_MAX_VARIABLE_NUMBER 自 3.32 起默认 32766;留出安全余量。\n maxQueryParams = 32000\n transactionCapability: TransactionCapability = {\n transactions: true,\n isolationLevels: ['READ COMMITTED', 'SERIALIZABLE'],\n transactionBoundConnection: false,\n concurrentTransactions: 'unsupported',\n nestedStrategy: 'reuse',\n notes: [\n 'SQLite uses MonoStorage fallback transaction metadata for retry paths and does not provide PostgreSQL-level concurrent dispatch isolation.'\n ],\n }\n atomicSequenceCapability = {\n requiresActiveTransaction: true as const,\n transactional: true,\n crossConnection: false,\n crossProcess: false,\n returning: true,\n productionSafe: false,\n }\n schemaDialect = {\n name: 'sqlite' as const,\n maxIdentifierLength: 63,\n supportsCreateIndexIfNotExists: true,\n encodeLiteral: sqliteEncodeLiteral,\n constraints: { unique: true, filteredUnique: true, nonNull: false },\n }\n constructor(public file:string = ':memory:', public options?: SQLiteDBOptions) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n }\n async open() {\n this.db = new SQLite(this.file, this.options)\n await this.idSystem.setup()\n }\n async openForSchemaRead() {\n this.db = new SQLite(this.file, this.options)\n }\n async setupInternalComputationState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ComputationState_\" (\n \"key\" TEXT PRIMARY KEY,\n \"numberValue\" NUMERIC NULL,\n \"booleanValue\" BOOLEAN NULL,\n \"stringValue\" TEXT NULL,\n \"jsonValue\" JSON NULL\n)`, 'setup computation state table')\n }\n async setupScopedSequenceState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ScopedSequence_\" (\n \"sequenceName\" TEXT NOT NULL,\n \"scopeKey\" TEXT NOT NULL,\n \"scope\" JSON NOT NULL,\n \"lastValue\" NUMERIC NOT NULL,\n PRIMARY KEY (\"sequenceName\", \"scopeKey\")\n)`, 'setup scoped sequence table')\n }\n async query<T>(sql:string, where: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return this.db.prepare(sql).all(...params) as T[]\n }\n async update(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING ${idField} AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n // CAUTION better-sqlite3 对 RETURNING 语句必须用 .all() 才能取回行;\n // .run() 只返回 {changes, lastInsertRowid},与 PostgreSQL/PGLite 驱动的返回行契约不一致。\n if (idField) {\n return this.db.prepare(finalSQL).all(...params) as unknown as EntityIdRef[]\n }\n return this.db.prepare(finalSQL).run(...params) as unknown as EntityIdRef[]\n }\n async insert (sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n // CAUTION better-sqlite3 对 RETURNING 语句必须用 .all() 才能取回行;\n // .run() 只返回 {changes, lastInsertRowid},这些元数据会被上层 Object.assign 进创建的记录,\n // 与 PostgreSQL/PGLite 驱动(返回 RETURNING 行)的契约不一致。\n const rows = this.db.prepare(`${sql} RETURNING ${ROW_ID_ATTR}`).all(...params) as unknown as EntityIdRef[]\n return rows[0]\n }\n async delete<T> (sql:string, where: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return this.db.prepare(sql).run(...params) as unknown as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return this.db.prepare(sql).run()\n }\n async close() {\n this.db.close()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n return {\n fieldValue: `NOT NULL AND EXISTS (\n SELECT 1\n FROM json_each(${fieldName})\n WHERE json_each.value = ${p()}\n)`,\n fieldParams: [value[1]]\n }\n }\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INTEGER PRIMARY KEY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object'||type==='json') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'INT(2)'\n } else if(type === 'number'){\n // CAUTION SQLite 是动态类型(type affinity):INT 亲和的列写入 2.5 仍原样存为 REAL,\n // 不会像 PG/MySQL 的 INT 那样报错或截断,所以 number 在 SQLite 上没有精度问题。\n // 保持 INT 声明是为了既有部署的 schema/manifest 兼容(改声明会触发迁移 diff)。\n return \"INT\"\n }else if(type === 'timestamp'){\n return \"INT\"\n }else{\n return type\n }\n }\n}","import {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR, asyncInteractionContext, InteractionContext, dbConsoleLogger, RequireSerializableRetry, TransactionCapability, TransactionOptions, defaultEncodeLiteral} from \"interaqt\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createHash } from \"node:crypto\";\nimport pg, { type ClientConfig, type PoolClient} from 'pg'\n\nconst { Client, Pool } = pg\n\ntype TransactionContext = {\n client: PoolClient\n depth: number\n isolation: TransactionOptions['isolation']\n}\n\nclass IDSystem {\n private initialized = new Set<string>()\n private recordToSequenceName = new Map<string, string>()\n constructor(public db: PostgreSQLDB) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name TEXT)`)\n }\n private sanitizeIdentifierPart(value: string) {\n const sanitized = value.replace(/[^a-zA-Z0-9_]/g, '_').replace(/^_+/, '')\n return (sanitized || 'record').slice(0, 32)\n }\n sequenceName(recordName: string) {\n return this.sequenceNameForKey(recordName, recordName)\n }\n private sequenceNameForKey(key: string, displayName: string) {\n const hash = createHash('sha1').update(key).digest('hex').slice(0, 12)\n return `seq_${hash}_${this.sanitizeIdentifierPart(displayName)}`.slice(0, 63)\n }\n private quoteIdentifier(identifier: string) {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`\n }\n async setupSequences(records: Array<{ recordName: string, tableName: string, idField: string }>) {\n const idsTableExists = (await this.db.query<{ exists: string | null }>(\n `SELECT to_regclass($1) AS exists`,\n ['\"_IDS_\"'],\n 'check legacy id table'\n ))[0]?.exists\n\n const sequenceMax = new Map<string, number>()\n for (const record of records) {\n const sequenceName = this.sequenceNameForKey(`${record.tableName}.${record.idField}`, record.tableName)\n this.recordToSequenceName.set(record.recordName, sequenceName)\n const quotedSequence = this.quoteIdentifier(sequenceName)\n await this.db.scheme(`CREATE SEQUENCE IF NOT EXISTS ${quotedSequence} START WITH 1`, `create sequence ${record.recordName}`)\n\n const tableRows = await this.db.query<{ max: number | string | null }>(\n `SELECT COALESCE(MAX(\"${record.idField}\"), 0) AS max FROM ${this.quoteIdentifier(record.tableName)}`,\n [],\n `read max id for ${record.recordName}`\n )\n let legacyMax = 0\n if (idsTableExists) {\n const legacyRows = await this.db.query<{ last: number | string | null }>(\n `SELECT COALESCE(MAX(\"last\"), 0) AS last FROM \"_IDS_\" WHERE \"name\" = $1`,\n [record.recordName],\n `read legacy id for ${record.recordName}`\n )\n legacyMax = Number(legacyRows[0]?.last ?? 0)\n }\n const maxExistingId = Math.max(Number(tableRows[0]?.max ?? 0), legacyMax)\n sequenceMax.set(quotedSequence, Math.max(sequenceMax.get(quotedSequence) ?? 0, maxExistingId))\n this.initialized.add(record.recordName)\n }\n for (const [quotedSequence, maxExistingId] of sequenceMax) {\n if (maxExistingId >= 1) {\n // CAUTION 只允许\"向前推进\"序列,绝不能回拨。\n // setup(false)(新进程 attach 已运行的库)会走到这里,此时其他进程可能正在写入:\n // 它们未提交的行对 MAX() 不可见,但已经消费了更大的序列值。无条件 setval 会把\n // 序列拨回已提交的最大 id,后续 nextval 就会发出重复 id。\n // last_value/is_called 与 nextval 一样是非事务性的、立即可见,所以用它们做守卫是安全的:\n // 只在序列从未使用(初始化/legacy 迁移)或落后于表内已有 id(外部 id 写入)时才推进。\n await this.db.query(\n `SELECT setval($1::regclass, $2, true) FROM ${quotedSequence} WHERE NOT is_called OR last_value < $2`,\n [quotedSequence, maxExistingId],\n `advance sequence ${quotedSequence}`\n )\n }\n }\n }\n async getAutoId(recordName: string) {\n if (!this.initialized.has(recordName)) {\n throw new Error(`PostgreSQL sequence for ${recordName} is not initialized. Run storage setup before creating records.`)\n }\n const sequenceName = this.recordToSequenceName.get(recordName) ?? this.sequenceName(recordName)\n const rows = await this.db.query<{ id: number | string }>(\n `SELECT nextval($1::regclass) AS id`,\n [this.quoteIdentifier(sequenceName)],\n `next id for ${recordName}`\n )\n return rows[0]!.id as unknown as string\n }\n}\n\nexport type PostgreSQLDBConfig = Omit<ClientConfig, 'database'> & { logger? :DatabaseLogger }\n\nexport class PostgreSQLDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db: InstanceType<typeof Client>\n pool?: InstanceType<typeof Pool>\n private transactionContext = new AsyncLocalStorage<TransactionContext>()\n supportsSelectForUpdate = true\n // PostgreSQL wire protocol 的绑定参数数量是 Int16(65535);留出安全余量。\n maxQueryParams = 65000\n transactionCapability: TransactionCapability = {\n transactions: true,\n isolationLevels: ['READ COMMITTED', 'SERIALIZABLE'],\n transactionBoundConnection: true,\n concurrentTransactions: 'database',\n nestedStrategy: 'reuse',\n }\n atomicSequenceCapability = {\n requiresActiveTransaction: true as const,\n transactional: true,\n crossConnection: true,\n crossProcess: true,\n returning: true,\n productionSafe: true,\n }\n schemaDialect = {\n name: 'postgres' as const,\n maxIdentifierLength: 63,\n supportsCreateIndexIfNotExists: true,\n encodeLiteral: defaultEncodeLiteral,\n constraints: { unique: true, filteredUnique: true, nonNull: true },\n }\n constructor(public database:string, public options: PostgreSQLDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n this.db = new Client({ ...options })\n }\n async open(forceDrop = false) {\n // CAUTION open() 必须可以在 openForSchemaRead()(或再次 open)之后被调用而不泄漏连接池。\n // 例如 Controller.setup(false) 会先经 prepareMigrationSchema 打开只读池做 manifest 校验,\n // 再走 system.setup 调用 open(false)。如果这里无条件 new Pool,旧池会被孤儿化:\n // close() 只会关掉最新的池,残留的空闲连接之后被 DROP DATABASE ... WITH (FORCE)\n // 之类的管理命令杀死时,会在进程里产生无人处理的 'error' 事件。\n if (this.pool && forceDrop) {\n // forceDrop 会摧毁当前数据库,先优雅关闭已有的池,避免它的空闲连接被强杀。\n await this.pool.end()\n this.pool = undefined\n }\n\n const adminClient = new Client({\n ...this.options,\n })\n await adminClient.connect()\n // 要不要有存在 就删掉的?\n // SELECT 'DROP DATABASE your_database_name' WHERE EXISTS (SELECT FROM pg_database WHERE dataname = 'your_database_name');\n const databaseExist = await adminClient.query(`SELECT FROM pg_database WHERE datname = $1`, [this.database])\n if (databaseExist.rows.length === 0) {\n await adminClient.query(`CREATE DATABASE \"${this.database}\"`)\n } else {\n if (forceDrop) {\n await adminClient.query(`DROP DATABASE \"${this.database}\" WITH (FORCE)`)\n await adminClient.query(`CREATE DATABASE \"${this.database}\"`)\n }\n }\n await adminClient.end()\n\n if (!this.pool) {\n this.pool = this.createPool()\n\n this.db = new Client({\n ...this.options,\n database: this.database\n })\n }\n }\n async openForSchemaRead() {\n if (this.pool) return\n // Strict dry-run schema planning must only connect to the target\n // database. Database creation/drop and framework table setup belong to\n // the normal open/setup paths.\n this.pool = this.createPool()\n\n this.db = new Client({\n ...this.options,\n database: this.database\n })\n }\n private createPool() {\n const pool = new Pool({\n ...this.options,\n database: this.database\n })\n // CAUTION 必须给 Pool 挂 'error' 监听器(node-postgres 的标准要求)。\n // 空闲连接被服务端终止(如管理命令、服务重启)时 Pool 会 emit 'error',\n // 没有监听器的话会直接变成进程级 uncaught exception。\n // 这种错误是可恢复的:Pool 会丢弃该连接,下次取用时重建,所以记录日志即可。\n pool.on('error', (error) => {\n this.logger.error({\n type: 'pool',\n name: 'idle client error',\n sql: '',\n error: error instanceof Error ? error.message : String(error),\n })\n })\n return pool\n }\n private getQueryable() {\n const context = this.transactionContext.getStore()\n if (context && context.depth > 0) return context.client\n if (!this.pool) {\n throw new Error(`PostgreSQL pool is not initialized. Call open() before querying.`)\n }\n return this.pool\n }\n async runInTransaction<T>(options: TransactionOptions, fn: () => Promise<T>): Promise<T> {\n const existing = this.transactionContext.getStore()\n if (existing && existing.depth > 0) {\n if (existing.isolation !== 'SERIALIZABLE' && (options.isolation ?? 'READ COMMITTED') === 'SERIALIZABLE') {\n throw new RequireSerializableRetry(`${options.name || 'nested transaction'} requires SERIALIZABLE isolation`)\n }\n existing.depth++\n try {\n return await fn()\n } finally {\n existing.depth--\n }\n }\n if (!this.pool) {\n throw new Error(`PostgreSQL pool is not initialized. Call open() before starting a transaction.`)\n }\n const isolation = options.isolation ?? 'READ COMMITTED'\n const client = await this.pool.connect()\n const context: TransactionContext = { client, depth: 1, isolation }\n let released = false\n try {\n await client.query(`BEGIN ISOLATION LEVEL ${isolation}`)\n const result = await this.transactionContext.run(context, fn)\n await client.query('COMMIT')\n return result\n } catch (error) {\n try {\n await client.query('ROLLBACK')\n } finally {\n client.release()\n released = true\n }\n throw error\n } finally {\n if (!released) {\n client.release()\n }\n }\n }\n async setupInternalComputationState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ComputationState_\" (\n \"key\" TEXT PRIMARY KEY,\n \"numberValue\" NUMERIC NULL,\n \"booleanValue\" BOOLEAN NULL,\n \"stringValue\" TEXT NULL,\n \"jsonValue\" JSONB NULL\n)`, 'setup computation state table')\n }\n async setupScopedSequenceState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ScopedSequence_\" (\n \"sequenceName\" TEXT NOT NULL,\n \"scopeKey\" TEXT NOT NULL,\n \"scope\" JSONB NOT NULL,\n \"lastValue\" NUMERIC NOT NULL,\n PRIMARY KEY (\"sequenceName\", \"scopeKey\")\n)`, 'setup scoped sequence table')\n }\n async query<T>(sql:string, where: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return (await this.getQueryable().query(sql, params)).rows as T[]\n }\n async update<T>(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.getQueryable().query(finalSQL, params)).rows as T[]\n }\n async insert(sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n const finalSQL = `${sql} RETURNING \"${ROW_ID_ATTR}\"`\n return (await this.getQueryable().query(finalSQL, params)).rows[0] as EntityIdRef\n }\n async delete<T> (sql:string, where: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.getQueryable().query(sql, params)).rows as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return await this.getQueryable().query(sql)\n }\n close() {\n return this.pool ? this.pool.end() : this.db.end()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n setupRecordSequences(records: Array<{ recordName: string, tableName: string, idField: string }>) {\n return this.idSystem.setupSequences(records)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${p()} = ANY (SELECT json_array_elements_text(${fieldNameWithQuotes}))`,\n fieldParams: [value[1]]\n }\n }\n // json 类型没有 = / != 操作符(\"operator does not exist: json = unknown\"),\n // 转成 jsonb 做语义相等比较(对键序不敏感)。NULL 行不参与匹配,与标量列的 =/!= 语义一致。\n if (value[0] === '=' || value[0] === '!=') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes}::jsonb ${value[0]} ${p()}::jsonb`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n }\n }\n\n getPlaceholder() {\n let index = 0\n return () => {\n index++\n return `$${index}`\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INT GENERATED ALWAYS AS IDENTITY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'BOOLEAN'\n } else if(type === 'number'){\n // CAUTION JS 的 number 是双精度浮点。映射成 INT 会让合法的小数值\n // (例如内置 Average 计算的结果 sum/count)在写入时直接报错。\n return \"DOUBLE PRECISION\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}","/**\n * uuidv7: A JavaScript implementation of UUID version 7\n *\n * Copyright 2021-2024 LiosK\n *\n * @license Apache-2.0\n * @packageDocumentation\n */\nconst DIGITS = \"0123456789abcdef\";\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(bytes) {\n this.bytes = bytes;\n }\n /**\n * Creates an object from the internal representation, a 16-byte byte array\n * containing the binary UUID representation in the big-endian byte order.\n *\n * This method does NOT shallow-copy the argument, and thus the created object\n * holds the reference to the underlying buffer.\n *\n * @throws TypeError if the length of the argument is not 16.\n */\n static ofInner(bytes) {\n if (bytes.length !== 16) {\n throw new TypeError(\"not 128-bit length\");\n }\n else {\n return new UUID(bytes);\n }\n }\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n * @throws RangeError if any field value is out of the specified range.\n */\n static fromFieldsV7(unixTsMs, randA, randBHi, randBLo) {\n if (!Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 281474976710655 ||\n randA > 0xfff ||\n randBHi > 1073741823 ||\n randBLo > 4294967295) {\n throw new RangeError(\"invalid field value\");\n }\n const bytes = new Uint8Array(16);\n bytes[0] = unixTsMs / 2 ** 40;\n bytes[1] = unixTsMs / 2 ** 32;\n bytes[2] = unixTsMs / 2 ** 24;\n bytes[3] = unixTsMs / 2 ** 16;\n bytes[4] = unixTsMs / 2 ** 8;\n bytes[5] = unixTsMs;\n bytes[6] = 0x70 | (randA >>> 8);\n bytes[7] = randA;\n bytes[8] = 0x80 | (randBHi >>> 24);\n bytes[9] = randBHi >>> 16;\n bytes[10] = randBHi >>> 8;\n bytes[11] = randBHi;\n bytes[12] = randBLo >>> 24;\n bytes[13] = randBLo >>> 16;\n bytes[14] = randBLo >>> 8;\n bytes[15] = randBLo;\n return new UUID(bytes);\n }\n /**\n * Builds a byte array from a string representation.\n *\n * This method accepts the following formats:\n *\n * - 32-digit hexadecimal format without hyphens: `0189dcd553117d408db09496a2eef37b`\n * - 8-4-4-4-12 hyphenated format: `0189dcd5-5311-7d40-8db0-9496a2eef37b`\n * - Hyphenated format with surrounding braces: `{0189dcd5-5311-7d40-8db0-9496a2eef37b}`\n * - RFC 9562 URN format: `urn:uuid:0189dcd5-5311-7d40-8db0-9496a2eef37b`\n *\n * Leading and trailing whitespaces represents an error.\n *\n * @throws SyntaxError if the argument could not parse as a valid UUID string.\n */\n static parse(uuid) {\n var _a, _b, _c, _d;\n let hex = undefined;\n switch (uuid.length) {\n case 32:\n hex = (_a = /^[0-9a-f]{32}$/i.exec(uuid)) === null || _a === void 0 ? void 0 : _a[0];\n break;\n case 36:\n hex =\n (_b = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i\n .exec(uuid)) === null || _b === void 0 ? void 0 : _b.slice(1, 6).join(\"\");\n break;\n case 38:\n hex =\n (_c = /^\\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\\}$/i\n .exec(uuid)) === null || _c === void 0 ? void 0 : _c.slice(1, 6).join(\"\");\n break;\n case 45:\n hex =\n (_d = /^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i\n .exec(uuid)) === null || _d === void 0 ? void 0 : _d.slice(1, 6).join(\"\");\n break;\n default:\n break;\n }\n if (hex) {\n const inner = new Uint8Array(16);\n for (let i = 0; i < 16; i += 4) {\n const n = parseInt(hex.substring(2 * i, 2 * i + 8), 16);\n inner[i + 0] = n >>> 24;\n inner[i + 1] = n >>> 16;\n inner[i + 2] = n >>> 8;\n inner[i + 3] = n;\n }\n return new UUID(inner);\n }\n else {\n throw new SyntaxError(\"could not parse UUID string\");\n }\n }\n /**\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (`0189dcd5-5311-7d40-8db0-9496a2eef37b`).\n */\n toString() {\n let text = \"\";\n for (let i = 0; i < this.bytes.length; i++) {\n text += DIGITS.charAt(this.bytes[i] >>> 4);\n text += DIGITS.charAt(this.bytes[i] & 0xf);\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += \"-\";\n }\n }\n return text;\n }\n /**\n * @returns The 32-digit hexadecimal representation without hyphens\n * (`0189dcd553117d408db09496a2eef37b`).\n */\n toHex() {\n let text = \"\";\n for (let i = 0; i < this.bytes.length; i++) {\n text += DIGITS.charAt(this.bytes[i] >>> 4);\n text += DIGITS.charAt(this.bytes[i] & 0xf);\n }\n return text;\n }\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toJSON() {\n return this.toString();\n }\n /**\n * Reports the variant field value of the UUID or, if appropriate, \"NIL\" or\n * \"MAX\".\n *\n * For convenience, this method reports \"NIL\" or \"MAX\" if `this` represents\n * the Nil or Max UUID, although the Nil and Max UUIDs are technically\n * subsumed under the variants `0b0` and `0b111`, respectively.\n */\n getVariant() {\n const n = this.bytes[8] >>> 4;\n if (n < 0) {\n throw new Error(\"unreachable\");\n }\n else if (n <= 0b0111) {\n return this.bytes.every((e) => e === 0) ? \"NIL\" : \"VAR_0\";\n }\n else if (n <= 0b1011) {\n return \"VAR_10\";\n }\n else if (n <= 0b1101) {\n return \"VAR_110\";\n }\n else if (n <= 0b1111) {\n return this.bytes.every((e) => e === 0xff) ? \"MAX\" : \"VAR_RESERVED\";\n }\n else {\n throw new Error(\"unreachable\");\n }\n }\n /**\n * Returns the version field value of the UUID or `undefined` if the UUID does\n * not have the variant field value of `0b10`.\n */\n getVersion() {\n return this.getVariant() === \"VAR_10\" ? this.bytes[6] >>> 4 : undefined;\n }\n /** Creates an object from `this`. */\n clone() {\n return new UUID(this.bytes.slice(0));\n }\n /** Returns true if `this` is equivalent to `other`. */\n equals(other) {\n return this.compareTo(other) === 0;\n }\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other) {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i];\n if (diff !== 0) {\n return Math.sign(diff);\n }\n }\n return 0;\n }\n}\n/**\n * Encapsulates the monotonic counter state.\n *\n * This class provides APIs to utilize a separate counter state from that of the\n * global generator used by {@link uuidv7} and {@link uuidv7obj}. In addition to\n * the default {@link generate} method, this class has {@link generateOrAbort}\n * that is useful to absolutely guarantee the monotonically increasing order of\n * generated UUIDs. See their respective documentation for details.\n */\nexport class V7Generator {\n /**\n * Creates a generator object with the default random number generator, or\n * with the specified one if passed as an argument. The specified random\n * number generator should be cryptographically strong and securely seeded.\n */\n constructor(randomNumberGenerator) {\n this.timestamp = 0;\n this.counter = 0;\n this.random = randomNumberGenerator !== null && randomNumberGenerator !== void 0 ? randomNumberGenerator : getDefaultRandom();\n }\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns a monotonically increasing UUID by reusing the previous\n * timestamp even if the up-to-date timestamp is smaller than the immediately\n * preceding UUID's. However, when such a clock rollback is considered\n * significant (i.e., by more than ten seconds), this method resets the\n * generator and returns a new UUID based on the given timestamp, breaking the\n * increasing order of UUIDs.\n *\n * See {@link generateOrAbort} for the other mode of generation and\n * {@link generateOrResetCore} for the low-level primitive.\n */\n generate() {\n return this.generateOrResetCore(Date.now(), 10000);\n }\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns a monotonically increasing UUID by reusing the previous\n * timestamp even if the up-to-date timestamp is smaller than the immediately\n * preceding UUID's. However, when such a clock rollback is considered\n * significant (i.e., by more than ten seconds), this method aborts and\n * returns `undefined` immediately.\n *\n * See {@link generate} for the other mode of generation and\n * {@link generateOrAbortCore} for the low-level primitive.\n */\n generateOrAbort() {\n return this.generateOrAbortCore(Date.now(), 10000);\n }\n /**\n * Generates a new UUIDv7 object from the `unixTsMs` passed, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method is equivalent to {@link generate} except that it takes a custom\n * timestamp and clock rollback allowance.\n *\n * @param rollbackAllowance - The amount of `unixTsMs` rollback that is\n * considered significant. A suggested value is `10_000` (milliseconds).\n * @throws RangeError if `unixTsMs` is not a 48-bit positive integer.\n */\n generateOrResetCore(unixTsMs, rollbackAllowance) {\n let value = this.generateOrAbortCore(unixTsMs, rollbackAllowance);\n if (value === undefined) {\n // reset state and resume\n this.timestamp = 0;\n value = this.generateOrAbortCore(unixTsMs, rollbackAllowance);\n }\n return value;\n }\n /**\n * Generates a new UUIDv7 object from the `unixTsMs` passed, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method is equivalent to {@link generateOrAbort} except that it takes a\n * custom timestamp and clock rollback allowance.\n *\n * @param rollbackAllowance - The amount of `unixTsMs` rollback that is\n * considered significant. A suggested value is `10_000` (milliseconds).\n * @throws RangeError if `unixTsMs` is not a 48-bit positive integer.\n */\n generateOrAbortCore(unixTsMs, rollbackAllowance) {\n const MAX_COUNTER = 4398046511103;\n if (!Number.isInteger(unixTsMs) ||\n unixTsMs < 0 ||\n unixTsMs > 281474976710655) {\n throw new RangeError(`\\`unixTsMs\\` must be a 48-bit positive integer, got ${unixTsMs}`);\n }\n else if (rollbackAllowance < 0 || rollbackAllowance > 281474976710655) {\n throw new RangeError(`\\`rollbackAllowance\\` out of reasonable range, got ${rollbackAllowance}`);\n }\n if (unixTsMs > this.timestamp) {\n this.timestamp = unixTsMs;\n this.resetCounter();\n }\n else if (unixTsMs + rollbackAllowance >= this.timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this.counter++;\n if (this.counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this.timestamp++;\n this.resetCounter();\n }\n }\n else {\n // abort if clock went backwards to unbearable extent\n return undefined;\n }\n return UUID.fromFieldsV7(this.timestamp, Math.trunc(this.counter / 2 ** 30), this.counter & (2 ** 30 - 1), this.random.nextUint32());\n }\n /** Initializes the counter at a 42-bit random integer. */\n resetCounter() {\n this.counter =\n this.random.nextUint32() * 0x400 + (this.random.nextUint32() & 0x3ff);\n }\n /**\n * Generates a new UUIDv4 object utilizing the random number generator inside.\n *\n * @internal\n */\n generateV4() {\n const bytes = new Uint8Array(Uint32Array.of(this.random.nextUint32(), this.random.nextUint32(), this.random.nextUint32(), this.random.nextUint32()).buffer);\n bytes[6] = 0x40 | (bytes[6] >>> 4);\n bytes[8] = 0x80 | (bytes[8] >>> 2);\n return UUID.ofInner(bytes);\n }\n}\n/** Returns the default random number generator available in the environment. */\nconst getDefaultRandom = () => {\n // detect Web Crypto API\n if (typeof crypto !== \"undefined\" &&\n typeof crypto.getRandomValues !== \"undefined\") {\n return new BufferedCryptoRandom();\n }\n else {\n // fall back on Math.random() unless the flag is set to true\n if (typeof UUIDV7_DENY_WEAK_RNG !== \"undefined\" && UUIDV7_DENY_WEAK_RNG) {\n throw new Error(\"no cryptographically strong RNG available\");\n }\n return {\n nextUint32: () => Math.trunc(Math.random() * 65536) * 65536 +\n Math.trunc(Math.random() * 65536),\n };\n }\n};\n/**\n * Wraps `crypto.getRandomValues()` to enable buffering; this uses a small\n * buffer by default to avoid both unbearable throughput decline in some\n * environments and the waste of time and space for unused values.\n */\nclass BufferedCryptoRandom {\n constructor() {\n this.buffer = new Uint32Array(8);\n this.cursor = 0xffff;\n }\n nextUint32() {\n if (this.cursor >= this.buffer.length) {\n crypto.getRandomValues(this.buffer);\n this.cursor = 0;\n }\n return this.buffer[this.cursor++];\n }\n}\nlet defaultGenerator;\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = () => uuidv7obj().toString();\n/** Generates a UUIDv7 object. */\nexport const uuidv7obj = () => (defaultGenerator || (defaultGenerator = new V7Generator())).generate();\n/**\n * Generates a UUIDv4 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv4 = () => uuidv4obj().toString();\n/** Generates a UUIDv4 object. */\nexport const uuidv4obj = () => (defaultGenerator || (defaultGenerator = new V7Generator())).generateV4();\n","import {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR, asyncInteractionContext, InteractionContext, dbConsoleLogger, TransactionCapability, defaultEncodeLiteral} from \"interaqt\";\nimport { PGlite} from '@electric-sql/pglite'\nimport { uuidv7 } from \"@interaqt/uuidv7\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name TEXT)`)\n }\n async getAutoId(recordName: string) {\n return uuidv7()\n }\n}\n\nexport type PGLiteDBConfig = { logger? :DatabaseLogger }\n\nexport class PGLiteDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db: InstanceType<typeof PGlite>\n supportsSelectForUpdate = true\n // PostgreSQL wire protocol 的绑定参数数量是 Int16(65535);留出安全余量。\n maxQueryParams = 65000\n transactionCapability: TransactionCapability = {\n transactions: true,\n isolationLevels: ['READ COMMITTED', 'SERIALIZABLE'],\n transactionBoundConnection: false,\n concurrentTransactions: 'unsupported',\n nestedStrategy: 'reuse',\n notes: [\n 'PGLite uses MonoStorage fallback BEGIN/COMMIT; SERIALIZABLE is framework metadata for retry-path tests, not a production PostgreSQL isolation guarantee.'\n ],\n }\n atomicSequenceCapability = {\n requiresActiveTransaction: true as const,\n transactional: true,\n crossConnection: false,\n crossProcess: false,\n returning: true,\n productionSafe: false,\n }\n schemaDialect = {\n name: 'postgres' as const,\n maxIdentifierLength: 63,\n supportsCreateIndexIfNotExists: true,\n encodeLiteral: defaultEncodeLiteral,\n constraints: { unique: true, filteredUnique: true, nonNull: true },\n }\n constructor(public database?:string, public options: PGLiteDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n this.db = new PGlite(this.database)\n }\n async open(forceDrop = false) {\n // PGLite doesn't support CREATE/DROP DATABASE commands\n // When forceDrop is true, we'll drop all existing tables instead\n \n if (forceDrop) {\n // Get all table names except system tables\n const tables = await this.db.query<{tablename: string}>(`\n SELECT tablename FROM pg_tables \n WHERE schemaname = 'public' \n AND tablename NOT LIKE 'pg_%'\n AND tablename NOT LIKE 'sql_%'\n `)\n \n // Drop each table\n for (const table of tables.rows) {\n await this.db.query(`DROP TABLE IF EXISTS \"${table.tablename}\" CASCADE`)\n }\n }\n\n await this.idSystem.setup()\n }\n async openForSchemaRead() {\n // PGLite is constructed with an open in-memory database. Avoid the\n // normal open() path here because it initializes framework tables.\n }\n async setupInternalComputationState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ComputationState_\" (\n \"key\" TEXT PRIMARY KEY,\n \"numberValue\" NUMERIC NULL,\n \"booleanValue\" BOOLEAN NULL,\n \"stringValue\" TEXT NULL,\n \"jsonValue\" JSON NULL\n)`, 'setup computation state table')\n }\n async setupScopedSequenceState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ScopedSequence_\" (\n \"sequenceName\" TEXT NOT NULL,\n \"scopeKey\" TEXT NOT NULL,\n \"scope\" JSONB NOT NULL,\n \"lastValue\" NUMERIC NOT NULL,\n PRIMARY KEY (\"sequenceName\", \"scopeKey\")\n)`, 'setup scoped sequence table')\n }\n async query<T>(sql:string, params: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n try {\n return (await this.db.query(sql, params)).rows as T[]\n } catch (error: unknown) {\n logger.error({\n type:'query',\n name,\n sql,\n params,\n error: error instanceof Error ? error.message : String(error)\n })\n throw error\n }\n }\n async update<T>(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.db.query(finalSQL, params)).rows as T[]\n \n }\n async insert(sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n const finalSQL = `${sql} RETURNING \"${ROW_ID_ATTR}\"`\n try {\n return (await this.db.query(finalSQL, params)).rows[0] as EntityIdRef\n } catch (error: unknown) {\n logger.error({\n type:'insert',\n name,\n sql: finalSQL,\n params,\n error: error instanceof Error ? error.message : String(error)\n })\n throw error\n }\n }\n async delete<T> (sql:string, params: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n \n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n try {\n return await this.db.query(sql)\n } catch (error: unknown) {\n logger.error({\n type:'scheme',\n name,\n sql,\n error: error instanceof Error ? error.message : String(error)\n })\n throw error\n }\n }\n close() {\n return this.db.close()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType.toLowerCase() === 'json') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${p()} = ANY (SELECT json_array_elements_text(${fieldNameWithQuotes}))`,\n fieldParams: [value[1]]\n }\n }\n // json 类型没有 = / != 操作符(\"operator does not exist: json = unknown\"),\n // 转成 jsonb 做语义相等比较(对键序不敏感)。NULL 行不参与匹配,与标量列的 =/!= 语义一致。\n if (value[0] === '=' || value[0] === '!=') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes}::jsonb ${value[0]} ${p()}::jsonb`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n }\n }\n\n getPlaceholder() {\n let index = 0\n return () => {\n index++\n return `$${index}`\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'SERIAL PRIMARY KEY'\n } else if (type === 'id') {\n return 'UUID'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'BOOL'\n } else if(type === 'number'){\n // CAUTION JS 的 number 是双精度浮点。映射成 INT 会让合法的小数值\n // (例如内置 Average 计算的结果 sum/count)在写入时直接报错。\n return \"DOUBLE PRECISION\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}","import {Database, DatabaseLogger, EntityIdRef, asyncInteractionContext, InteractionContext, dbConsoleLogger, TransactionCapability, defaultEncodeLiteral} from \"interaqt\";\nimport mysql, {type Connection, type ConnectionOptions, RowDataPacket} from 'mysql2/promise'\n\nclass IDSystem {\n constructor(public db: Database) {}\n async setup() {\n // name 必须有唯一约束(原子 UPSERT 依赖它);MySQL 的 TEXT 不能做主键,用定长 VARCHAR。\n await this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name VARCHAR(191), PRIMARY KEY (name))`)\n // 兼容旧版建出的无约束 _IDS_ 表:检测到缺主键时补齐。\n const primaryKey = await this.db.query<{ cnt: number }>(\n `SELECT COUNT(1) AS cnt FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = '_IDS_' AND index_name = 'PRIMARY'`,\n [],\n 'check _IDS_ primary key'\n )\n if (!primaryKey[0]?.cnt) {\n await this.db.scheme(`ALTER TABLE \"_IDS_\" MODIFY name VARCHAR(191), ADD PRIMARY KEY (name)`)\n }\n }\n // CAUTION LAST_INSERT_ID() 是会话级的,而「UPSERT + SELECT」是两条语句:同一连接上并发的\n // getAutoId 交错执行会让两次 SELECT 读到同一个值(实测复现)。用本地分配链把两条语句\n // 串成不可交错的对;跨连接/跨进程由 UPSERT 的原子性 + 会话隔离保证。\n private allocating: Promise<unknown> = Promise.resolve()\n async getAutoId(recordName: string) {\n const allocation = this.allocating.then(async () => {\n // 原子 UPSERT:此前的「SELECT 再 INSERT/UPDATE」读-改-写在并发下会分配重复 id;\n // recordName 一律走参数绑定。LAST_INSERT_ID(expr) 是 MySQL 的会话级取值惯用法:\n // 插入分支把会话值置为 1,冲突分支置为 last+1。\n await this.db.update(\n `INSERT INTO \"_IDS_\" (name, last) VALUES (?, LAST_INSERT_ID(1))\nON DUPLICATE KEY UPDATE last = LAST_INSERT_ID(last + 1)`,\n [recordName],\n undefined,\n `allocate next id for ${recordName}`\n )\n const rows = await this.db.query<{ id: number }>(`SELECT LAST_INSERT_ID() AS id`, [], `read allocated id for ${recordName}`)\n return rows[0].id as unknown as string\n })\n this.allocating = allocation.catch(() => {})\n return allocation\n }\n}\n\nexport type MysqlDBConfig = Omit<ConnectionOptions, 'database'> & { logger? :DatabaseLogger }\n\nexport class MysqlDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db!: Connection\n // MySQL 8.0+ 支持 SELECT ... FOR UPDATE OF <alias>\n supportsSelectForUpdate = true\n // MySQL prepared statement 的占位符数量上限为 65535;留出安全余量。\n maxQueryParams = 65000\n transactionCapability: TransactionCapability = {\n transactions: false,\n isolationLevels: [],\n transactionBoundConnection: false,\n concurrentTransactions: 'unsupported',\n nestedStrategy: 'unsupported',\n notes: [\n 'The current MySQL driver has no transaction-bound connection implementation; strong dispatch transactions are unsupported.'\n ],\n }\n schemaDialect = {\n name: 'mysql' as const,\n maxIdentifierLength: 64,\n supportsCreateIndexIfNotExists: false,\n encodeLiteral: defaultEncodeLiteral,\n constraints: { unique: false, filteredUnique: false, nonNull: false },\n }\n constructor(public database:string, public options: MysqlDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n }\n async open(forceDrop = false) {\n // 第一条连接不带默认库,仅用于检查/创建目标库;用完必须关闭(否则每次 open 泄漏一条连接)。\n const bootstrapConnection = await mysql.createConnection({\n ...this.options,\n })\n await bootstrapConnection.connect()\n try {\n // CAUTION 库名不能字符串拼接进 SQL:LIKE 走参数绑定,标识符用反引号转义\n // (bootstrap 连接尚未 SET ANSI_QUOTES,双引号不可用)。\n const quotedDatabase = `\\`${this.database.replace(/`/g, '``')}\\``\n const [rows] = await bootstrapConnection.query(`SHOW DATABASES LIKE ?`, [this.database])\n if ((rows as RowDataPacket[]).length === 0) {\n await bootstrapConnection.query(`CREATE DATABASE ${quotedDatabase}`)\n } else if (forceDrop) {\n await bootstrapConnection.query(`DROP DATABASE ${quotedDatabase}`)\n await bootstrapConnection.query(`CREATE DATABASE ${quotedDatabase}`)\n }\n } finally {\n await bootstrapConnection.end()\n }\n\n // CAUTION 无论目标库是已有还是刚创建,工作连接都必须显式带上 database,\n // 否则后续 scheme/query 跑在没有默认库的连接上,首次建库启动即失败。\n this.db = await mysql.createConnection({\n ...this.options,\n database: this.database\n })\n await this.db.connect()\n await this.db.query(`SET sql_mode='ANSI_QUOTES'`)\n\n await this.idSystem.setup()\n\n }\n async openForSchemaRead() {\n if (this.db) return\n // Strict dry-run schema planning should not create databases or\n // initialize framework tables such as _IDS_.\n this.db = await mysql.createConnection({\n ...this.options,\n database: this.database\n })\n await this.db.connect()\n await this.db.query(`SET sql_mode='ANSI_QUOTES'`)\n }\n async query<T>(sql:string, where: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async update<T>(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n // CAUTION MySQL 不支持 UPDATE ... RETURNING,无法履行 idField 返回契约。\n // 这里如实记录并执行原始 SQL;调用方(storage 层)不依赖 update 的返回行。\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async insert(sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n await this.db.query(sql, params)\n const [rows] = (await this.db.query(`SELECT LAST_INSERT_ID();`))\n const insertedId = (rows as RowDataPacket[])[0]['LAST_INSERT_ID()']\n return {id: insertedId} as EntityIdRef\n }\n async delete<T> (sql:string, where: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return await this.db.query(sql)\n }\n close() {\n return this.db.end()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n // CAUTION 匹配值必须走参数绑定,不能字符串拼接进 SQL(否则存在 SQL 注入)。\n return {\n fieldValue: `IS NOT NULL AND JSON_CONTAINS(${fieldNameWithQuotes}, ${p()}, '$')`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n // JSON 列与字符串参数直接比较会按类型序比较(恒不等)。CAST 成 JSON 做语义相等比较。\n // NULL 行不参与匹配,与标量列的 =/!= 语义一致。\n if (value[0] === '=' || value[0] === '!=') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes} ${value[0]} CAST(${p()} AS JSON)`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n }\n }\n\n getPlaceholder() {\n return () => {\n return '?'\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INT AUTO_INCREMENT PRIMARY KEY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'INT(2)'\n } else if(type === 'number'){\n // CAUTION JS 的 number 是双精度浮点。映射成 INT 会让合法的小数值\n // (例如内置 Average 计算的结果 sum/count)在写入时直接报错。\n return \"DOUBLE\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}"],"names":["IDSystem$3","db","recordName","SQLiteDB","file","options","sqliteEncodeLiteral","IDSystem","dbConsoleLogger","SQLite","sql","where","name","context","asyncInteractionContext","logger","params","x","values","idField","finalSQL","ROW_ID_ATTR","key","value","fieldName","fieldType","isReferenceValue","getReferenceFieldValue","p","type","collection","Client","Pool","pg","IDSystem$2","displayName","createHash","identifier","records","idsTableExists","sequenceMax","record","sequenceName","quotedSequence","tableRows","legacyMax","legacyRows","maxExistingId","PostgreSQLDB","database","AsyncLocalStorage","defaultEncodeLiteral","forceDrop","adminClient","pool","error","fn","existing","RequireSerializableRetry","isolation","client","released","result","fieldNameWithQuotes","index","DIGITS","UUID","bytes","unixTsMs","randA","randBHi","randBLo","uuid","_a","_b","_c","_d","hex","inner","i","n","text","e","other","diff","V7Generator","randomNumberGenerator","getDefaultRandom","rollbackAllowance","BufferedCryptoRandom","defaultGenerator","uuidv7","uuidv7obj","IDSystem$1","PGLiteDB","PGlite","tables","table","allocation","MysqlDB","bootstrapConnection","mysql","quotedDatabase","rows"],"mappings":";;;;;;;AAKA,IAAAA,IAAA,MAAe;AAAA,EACX,YAAmBC,GAAc;AAAd,SAAA,KAAAA;AAAA,EAAe;AAAA,EAClC,MAAM,QAAQ;AACV,UAAM,KAAK,GAAG,OAAO,4DAA4D,GAEjF,MAAM,KAAK,GAAG,OAAO,uEAAuE;AAAA,EAChG;AAAA,EACA,MAAM,UAAUC,GAAoB;AAUhC,YAPa,MAAM,KAAK,GAAG;AAAA,MACvB;AAAA;AAAA;AAAA,MAGA,CAACA,CAAU;AAAA,MACX,wBAAwBA,CAAU;AAAA,IAAA,GAE1B,CAAC,EAAE;AAAA,EACnB;AACJ;AAIO,MAAMC,EAA4B;AAAA,EAgCrC,YAAmBC,IAAc,YAAmBC,GAA2B;AAA5D,SAAA,OAAAD,GAAiC,KAAA,UAAAC,GA5BpD,KAAA,0BAA0B,IAE1B,KAAA,iBAAiB,MACjB,KAAA,wBAA+C;AAAA,MAC3C,cAAc;AAAA,MACd,iBAAiB,CAAC,kBAAkB,cAAc;AAAA,MAClD,4BAA4B;AAAA,MAC5B,wBAAwB;AAAA,MACxB,gBAAgB;AAAA,MAChB,OAAO;AAAA,QACH;AAAA,MAAA;AAAA,IACJ,GAEJ,KAAA,2BAA2B;AAAA,MACvB,2BAA2B;AAAA,MAC3B,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA,GAEpB,KAAA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,eAAeC;AAAA,MACf,aAAa,EAAE,QAAQ,IAAM,gBAAgB,IAAM,SAAS,GAAA;AAAA,IAAM,GAGlE,KAAK,WAAW,IAAIC,EAAS,IAAI,GACjC,KAAK,SAAS,KAAK,SAAS,UAAUC;AAAA,EAC1C;AAAA,EACA,MAAM,OAAO;AACT,SAAK,KAAK,IAAIC,EAAO,KAAK,MAAM,KAAK,OAAO,GAC5C,MAAM,KAAK,SAAS,MAAA;AAAA,EACxB;AAAA,EACA,MAAM,oBAAoB;AACtB,SAAK,KAAK,IAAIA,EAAO,KAAK,MAAM,KAAK,OAAO;AAAA,EAChD;AAAA,EACA,MAAM,gCAAgC;AAClC,UAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOtB,+BAA+B;AAAA,EAC/B;AAAA,EACA,MAAM,2BAA2B;AAC7B,UAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOtB,6BAA6B;AAAA,EAC7B;AAAA,EACA,MAAM,MAASC,GAAYC,IAAkB,CAAA,GAAIC,IAAM,IAAK;AACxD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GAEpDG,IAASL,EAAM,IAAI,CAAAM,MAAKA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CAAC;AAC9D,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,GACO,KAAK,GAAG,QAAQN,CAAG,EAAE,IAAI,GAAGM,CAAM;AAAA,EAC9C;AAAA,EACA,MAAM,OAAON,GAAWQ,GAAmBC,GAAiBP,IAAK,IAAI;AACjE,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDO,IAAW,GAAGV,CAAG,IAAIS,IAAU,aAAaA,CAAO,WAAU,EAAE,IAC/DH,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CACpG;AASD,WARAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAIQ;AAAA,MACJ,QAAAJ;AAAA,IAAA,CACH,GAGGG,IACO,KAAK,GAAG,QAAQC,CAAQ,EAAE,IAAI,GAAGJ,CAAM,IAE3C,KAAK,GAAG,QAAQI,CAAQ,EAAE,IAAI,GAAGJ,CAAM;AAAA,EAClD;AAAA,EACA,MAAM,OAAQN,GAAYQ,GAAkBN,IAAK,IAAK;AAClD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CACpG;AACD,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,GAIY,KAAK,GAAG,QAAQ,GAAGN,CAAG,cAAcW,CAAW,EAAE,EAAE,IAAI,GAAGL,CAAM,EACjE,CAAC;AAAA,EACjB;AAAA,EACA,MAAM,OAAWN,GAAYC,GAAkBC,IAAK,IAAI;AACpD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASL,EAAM,IAAI,CAAAM,MAAKA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CAAC;AAC9D,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,GACM,KAAK,GAAG,QAAQN,CAAG,EAAE,IAAI,GAAGM,CAAM;AAAA,EAC7C;AAAA,EACA,MAAM,OAAON,GAAaE,IAAK,IAAI;AAC/B,UAAMC,IAASC,EAAwB,SAAA;AAEvC,WADe,KAAK,OAAO,MAAMD,GAAS,cAAc,EAAE,EACnD,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAD;AAAA,MACA,KAAAF;AAAA,IAAA,CACH,GACM,KAAK,GAAG,QAAQA,CAAG,EAAE,IAAA;AAAA,EAChC;AAAA,EACA,MAAM,QAAQ;AACV,SAAK,GAAG,MAAA;AAAA,EACZ;AAAA,EACA,MAAM,UAAUR,GAAoB;AAChC,WAAO,KAAK,SAAS,UAAUA,CAAU;AAAA,EAC7C;AAAA,EACA,qBAAqBoB,GAAaC,GAAwBC,GAAmBC,GAAmBC,GAA2BC,GAA+CC,GAAiB;AACvL,QAAIH,MAAc,UACVF,EAAM,CAAC,EAAE,YAAA,MAAkB;AAC3B,aAAO;AAAA,QACH,YAAY;AAAA;AAAA,qBAEXC,CAAS;AAAA,8BACAI,GAAG;AAAA;AAAA,QAEb,aAAa,CAACL,EAAM,CAAC,CAAC;AAAA,MAAA;AAAA,EAItC;AAAA,EACA,iBAAiBM,GAAcC,GAAsB;AACjD,WAAID,MAAS,OACF,wBACAA,MAAS,OACT,QACAC,KAAcD,MAAS,YAAUA,MAAO,SACxC,SACAA,MAAS,WACT,SACAA,MAAS,YACT,WACDA,MAAS,YAKVA,MAAS,cADP,QAIAA;AAAA,EAEf;AACJ;ACzMA,MAAM,EAAE,QAAAE,GAAQ,MAAAC,EAAA,IAASC;AAQzB,IAAAC,IAAA,MAAe;AAAA,EAGX,YAAmBjC,GAAkB;AAAlB,SAAA,KAAAA,GAFnB,KAAQ,kCAAkB,IAAA,GAC1B,KAAQ,2CAA2B,IAAA;AAAA,EACG;AAAA,EACtC,QAAQ;AACJ,WAAO,KAAK,GAAG,OAAO,8DAA8D;AAAA,EACxF;AAAA,EACQ,uBAAuBsB,GAAe;AAE1C,YADkBA,EAAM,QAAQ,kBAAkB,GAAG,EAAE,QAAQ,OAAO,EAAE,KACnD,UAAU,MAAM,GAAG,EAAE;AAAA,EAC9C;AAAA,EACA,aAAarB,GAAoB;AAC7B,WAAO,KAAK,mBAAmBA,GAAYA,CAAU;AAAA,EACzD;AAAA,EACQ,mBAAmBoB,GAAaa,GAAqB;AAEzD,WAAO,OADMC,EAAW,MAAM,EAAE,OAAOd,CAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CACnD,IAAI,KAAK,uBAAuBa,CAAW,CAAC,GAAG,MAAM,GAAG,EAAE;AAAA,EAChF;AAAA,EACQ,gBAAgBE,GAAoB;AACxC,WAAO,IAAIA,EAAW,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC7C;AAAA,EACA,MAAM,eAAeC,GAA4E;AAC7F,UAAMC,KAAkB,MAAM,KAAK,GAAG;AAAA,MAClC;AAAA,MACA,CAAC,SAAS;AAAA,MACV;AAAA,IAAA,GACD,CAAC,GAAG,QAEDC,wBAAkB,IAAA;AACxB,eAAWC,KAAUH,GAAS;AAC1B,YAAMI,IAAe,KAAK,mBAAmB,GAAGD,EAAO,SAAS,IAAIA,EAAO,OAAO,IAAIA,EAAO,SAAS;AACtG,WAAK,qBAAqB,IAAIA,EAAO,YAAYC,CAAY;AAC7D,YAAMC,IAAiB,KAAK,gBAAgBD,CAAY;AACxD,YAAM,KAAK,GAAG,OAAO,iCAAiCC,CAAc,iBAAiB,mBAAmBF,EAAO,UAAU,EAAE;AAE3H,YAAMG,IAAY,MAAM,KAAK,GAAG;AAAA,QAC5B,wBAAwBH,EAAO,OAAO,sBAAsB,KAAK,gBAAgBA,EAAO,SAAS,CAAC;AAAA,QAClG,CAAA;AAAA,QACA,mBAAmBA,EAAO,UAAU;AAAA,MAAA;AAExC,UAAII,IAAY;AAChB,UAAIN,GAAgB;AAChB,cAAMO,IAAa,MAAM,KAAK,GAAG;AAAA,UAC7B;AAAA,UACA,CAACL,EAAO,UAAU;AAAA,UAClB,sBAAsBA,EAAO,UAAU;AAAA,QAAA;AAE3C,QAAAI,IAAY,OAAOC,EAAW,CAAC,GAAG,QAAQ,CAAC;AAAA,MAC/C;AACA,YAAMC,IAAgB,KAAK,IAAI,OAAOH,EAAU,CAAC,GAAG,OAAO,CAAC,GAAGC,CAAS;AACxE,MAAAL,EAAY,IAAIG,GAAgB,KAAK,IAAIH,EAAY,IAAIG,CAAc,KAAK,GAAGI,CAAa,CAAC,GAC7F,KAAK,YAAY,IAAIN,EAAO,UAAU;AAAA,IAC1C;AACA,eAAW,CAACE,GAAgBI,CAAa,KAAKP;AAC1C,MAAIO,KAAiB,KAOjB,MAAM,KAAK,GAAG;AAAA,QACV,8CAA8CJ,CAAc;AAAA,QAC5D,CAACA,GAAgBI,CAAa;AAAA,QAC9B,oBAAoBJ,CAAc;AAAA,MAAA;AAAA,EAIlD;AAAA,EACA,MAAM,UAAUzC,GAAoB;AAChC,QAAI,CAAC,KAAK,YAAY,IAAIA,CAAU;AAChC,YAAM,IAAI,MAAM,2BAA2BA,CAAU,iEAAiE;AAE1H,UAAMwC,IAAe,KAAK,qBAAqB,IAAIxC,CAAU,KAAK,KAAK,aAAaA,CAAU;AAM9F,YALa,MAAM,KAAK,GAAG;AAAA,MACvB;AAAA,MACA,CAAC,KAAK,gBAAgBwC,CAAY,CAAC;AAAA,MACnC,eAAexC,CAAU;AAAA,IAAA,GAEjB,CAAC,EAAG;AAAA,EACpB;AACJ;AAIO,MAAM8C,EAAgC;AAAA,EA+BzC,YAAmBC,GAAwB5C,IAA8B,IAAI;AAA1D,SAAA,WAAA4C,GAAwB,KAAA,UAAA5C,GA1B3C,KAAQ,qBAAqB,IAAI6C,EAAA,GACjC,KAAA,0BAA0B,IAE1B,KAAA,iBAAiB,MACjB,KAAA,wBAA+C;AAAA,MAC3C,cAAc;AAAA,MACd,iBAAiB,CAAC,kBAAkB,cAAc;AAAA,MAClD,4BAA4B;AAAA,MAC5B,wBAAwB;AAAA,MACxB,gBAAgB;AAAA,IAAA,GAEpB,KAAA,2BAA2B;AAAA,MACvB,2BAA2B;AAAA,MAC3B,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA,GAEpB,KAAA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,eAAeC;AAAA,MACf,aAAa,EAAE,QAAQ,IAAM,gBAAgB,IAAM,SAAS,GAAA;AAAA,IAAK,GAGjE,KAAK,WAAW,IAAI5C,EAAS,IAAI,GACjC,KAAK,SAAS,KAAK,SAAS,UAAUC,GACtC,KAAK,KAAK,IAAIuB,EAAO,EAAE,GAAG1B,GAAS;AAAA,EACvC;AAAA,EACA,MAAM,KAAK+C,IAAY,IAAO;AAM1B,IAAI,KAAK,QAAQA,MAEb,MAAM,KAAK,KAAK,IAAA,GAChB,KAAK,OAAO;AAGhB,UAAMC,IAAc,IAAItB,EAAO;AAAA,MAC3B,GAAG,KAAK;AAAA,IAAA,CACX;AACD,UAAMsB,EAAY,QAAA,IAGI,MAAMA,EAAY,MAAM,8CAA8C,CAAC,KAAK,QAAQ,CAAC,GACzF,KAAK,WAAW,IAC9B,MAAMA,EAAY,MAAM,oBAAoB,KAAK,QAAQ,GAAG,IAExDD,MACA,MAAMC,EAAY,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB,GACvE,MAAMA,EAAY,MAAM,oBAAoB,KAAK,QAAQ,GAAG,IAGpE,MAAMA,EAAY,IAAA,GAEb,KAAK,SACN,KAAK,OAAO,KAAK,WAAA,GAEjB,KAAK,KAAK,IAAItB,EAAO;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,IAAA,CAClB;AAAA,EAET;AAAA,EACA,MAAM,oBAAoB;AACtB,IAAI,KAAK,SAIT,KAAK,OAAO,KAAK,WAAA,GAEjB,KAAK,KAAK,IAAIA,EAAO;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,IAAA,CAClB;AAAA,EACL;AAAA,EACQ,aAAa;AACjB,UAAMuB,IAAO,IAAItB,EAAK;AAAA,MAClB,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,IAAA,CAClB;AAKD,WAAAsB,EAAK,GAAG,SAAS,CAACC,MAAU;AACxB,WAAK,OAAO,MAAM;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,OAAOA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,MAAA,CAC/D;AAAA,IACL,CAAC,GACMD;AAAA,EACX;AAAA,EACQ,eAAe;AACnB,UAAMzC,IAAU,KAAK,mBAAmB,SAAA;AACxC,QAAIA,KAAWA,EAAQ,QAAQ,UAAUA,EAAQ;AACjD,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,MAAM,kEAAkE;AAEtF,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,MAAM,iBAAoBR,GAA6BmD,GAAkC;AACrF,UAAMC,IAAW,KAAK,mBAAmB,SAAA;AACzC,QAAIA,KAAYA,EAAS,QAAQ,GAAG;AAChC,UAAIA,EAAS,cAAc,mBAAmBpD,EAAQ,aAAa,sBAAsB;AACrF,cAAM,IAAIqD,EAAyB,GAAGrD,EAAQ,QAAQ,oBAAoB,kCAAkC;AAEhH,MAAAoD,EAAS;AACT,UAAI;AACA,eAAO,MAAMD,EAAA;AAAA,MACjB,UAAA;AACI,QAAAC,EAAS;AAAA,MACb;AAAA,IACJ;AACA,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,MAAM,gFAAgF;AAEpG,UAAME,IAAYtD,EAAQ,aAAa,kBACjCuD,IAAS,MAAM,KAAK,KAAK,QAAA,GACzB/C,IAA8B,EAAE,QAAA+C,GAAQ,OAAO,GAAG,WAAAD,EAAA;AACxD,QAAIE,IAAW;AACf,QAAI;AACA,YAAMD,EAAO,MAAM,yBAAyBD,CAAS,EAAE;AACvD,YAAMG,IAAS,MAAM,KAAK,mBAAmB,IAAIjD,GAAS2C,CAAE;AAC5D,mBAAMI,EAAO,MAAM,QAAQ,GACpBE;AAAA,IACX,SAASP,GAAO;AACZ,UAAI;AACA,cAAMK,EAAO,MAAM,UAAU;AAAA,MACjC,UAAA;AACI,QAAAA,EAAO,QAAA,GACPC,IAAW;AAAA,MACf;AACA,YAAMN;AAAA,IACV,UAAA;AACI,MAAKM,KACDD,EAAO,QAAA;AAAA,IAEf;AAAA,EACJ;AAAA,EACA,MAAM,gCAAgC;AAClC,UAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOtB,+BAA+B;AAAA,EAC/B;AAAA,EACA,MAAM,2BAA2B;AAC7B,UAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOtB,6BAA6B;AAAA,EAC7B;AAAA,EACA,MAAM,MAASlD,GAAYC,IAAkB,CAAA,GAAIC,IAAM,IAAK;AACxD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GAEpDG,IAASL;AACf,WAAAI,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,aAAA,EAAe,MAAMN,GAAKM,CAAM,GAAG;AAAA,EAC3D;AAAA,EACA,MAAM,OAAUN,GAAWQ,GAAmBC,GAAiBP,IAAK,IAAI;AACpE,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDO,IAAW,GAAGV,CAAG,IAAIS,IAAU,cAAcA,CAAO,YAAW,EAAE,IACjEH,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,CACrE;AACD,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAIQ;AAAA,MACJ,QAAAJ;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,aAAA,EAAe,MAAMI,GAAUJ,CAAM,GAAG;AAAA,EAChE;AAAA,EACA,MAAM,OAAON,GAAYQ,GAAkBN,IAAK,IAAK;AACjD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,CACrE;AACD,IAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH;AAED,UAAMI,IAAW,GAAGV,CAAG,eAAeW,CAAW;AACjD,YAAQ,MAAM,KAAK,eAAe,MAAMD,GAAUJ,CAAM,GAAG,KAAK,CAAC;AAAA,EACrE;AAAA,EACA,MAAM,OAAWN,GAAYC,GAAkBC,IAAK,IAAI;AACpD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASL;AACf,WAAAI,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,aAAA,EAAe,MAAMN,GAAKM,CAAM,GAAG;AAAA,EAC3D;AAAA,EACA,MAAM,OAAON,GAAaE,IAAK,IAAI;AAC/B,UAAMC,IAASC,EAAwB,SAAA;AAEvC,WADe,KAAK,OAAO,MAAMD,GAAS,cAAc,EAAE,EACnD,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAD;AAAA,MACA,KAAAF;AAAA,IAAA,CACH,GACO,MAAM,KAAK,eAAe,MAAMA,CAAG;AAAA,EAC/C;AAAA,EACA,QAAQ;AACJ,WAAO,KAAK,OAAO,KAAK,KAAK,QAAQ,KAAK,GAAG,IAAA;AAAA,EACjD;AAAA,EACA,MAAM,UAAUR,GAAoB;AAChC,WAAO,KAAK,SAAS,UAAUA,CAAU;AAAA,EAC7C;AAAA,EACA,qBAAqBoC,GAA4E;AAC7F,WAAO,KAAK,SAAS,eAAeA,CAAO;AAAA,EAC/C;AAAA,EACA,qBAAqBhB,GAAaC,GAAwBC,GAAmBC,GAAmBC,GAA2BC,GAA+CC,GAAiB;AACvL,QAAIH,MAAc,QAAQ;AACtB,UAAIF,EAAM,CAAC,EAAE,YAAA,MAAkB,YAAY;AACvC,cAAMwC,IAAsBvC,EAAU,MAAM,GAAG,EAAE,IAAI,CAAAP,MAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG;AAC5E,eAAO;AAAA,UACH,YAAY,mBAAmBW,EAAA,CAAG,2CAA2CmC,CAAmB;AAAA,UAChG,aAAa,CAACxC,EAAM,CAAC,CAAC;AAAA,QAAA;AAAA,MAE9B;AAGA,UAAIA,EAAM,CAAC,MAAM,OAAOA,EAAM,CAAC,MAAM;AAEjC,eAAO;AAAA,UACH,YAAY,mBAFYC,EAAU,MAAM,GAAG,EAAE,IAAI,CAAAP,MAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG,CAEtB,WAAWM,EAAM,CAAC,CAAC,IAAIK,EAAA,CAAG;AAAA,UAC5E,aAAa,CAAC,KAAK,UAAUL,EAAM,CAAC,CAAC,CAAC;AAAA,QAAA;AAAA,IAGlD;AAAA,EACJ;AAAA,EAEA,iBAAiB;AACb,QAAIyC,IAAQ;AACZ,WAAO,OACHA,KACO,IAAIA,CAAK;AAAA,EAExB;AAAA,EACA,iBAAiBnC,GAAcC,GAAsB;AACjD,WAAID,MAAS,OACF,qCACAA,MAAS,OACT,QACAC,KAAcD,MAAS,WACvB,SACAA,MAAS,WACT,SACAA,MAAS,YACT,YACDA,MAAS,WAGR,qBACFA,MAAS,cACP,cAEAA;AAAA,EAEf;AACJ;AClYA,MAAMoC,IAAS;AAER,MAAMC,EAAK;AAAA;AAAA,EAEd,YAAYC,GAAO;AACf,SAAK,QAAQA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,QAAQA,GAAO;AAClB,QAAIA,EAAM,WAAW;AACjB,YAAM,IAAI,UAAU,oBAAoB;AAGxC,WAAO,IAAID,EAAKC,CAAK;AAAA,EAE7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,aAAaC,GAAUC,GAAOC,GAASC,GAAS;AACnD,QAAI,CAAC,OAAO,UAAUH,CAAQ,KAC1B,CAAC,OAAO,UAAUC,CAAK,KACvB,CAAC,OAAO,UAAUC,CAAO,KACzB,CAAC,OAAO,UAAUC,CAAO,KACzBH,IAAW,KACXC,IAAQ,KACRC,IAAU,KACVC,IAAU,KACVH,IAAW,mBACXC,IAAQ,QACRC,IAAU,cACVC,IAAU;AACV,YAAM,IAAI,WAAW,qBAAqB;AAE9C,UAAMJ,IAAQ,IAAI,WAAW,EAAE;AAC/B,WAAAA,EAAM,CAAC,IAAIC,IAAW,KAAK,IAC3BD,EAAM,CAAC,IAAIC,IAAW,KAAK,IAC3BD,EAAM,CAAC,IAAIC,IAAW,KAAK,IAC3BD,EAAM,CAAC,IAAIC,IAAW,KAAK,IAC3BD,EAAM,CAAC,IAAIC,IAAW,KAAK,GAC3BD,EAAM,CAAC,IAAIC,GACXD,EAAM,CAAC,IAAI,MAAQE,MAAU,GAC7BF,EAAM,CAAC,IAAIE,GACXF,EAAM,CAAC,IAAI,MAAQG,MAAY,IAC/BH,EAAM,CAAC,IAAIG,MAAY,IACvBH,EAAM,EAAE,IAAIG,MAAY,GACxBH,EAAM,EAAE,IAAIG,GACZH,EAAM,EAAE,IAAII,MAAY,IACxBJ,EAAM,EAAE,IAAII,MAAY,IACxBJ,EAAM,EAAE,IAAII,MAAY,GACxBJ,EAAM,EAAE,IAAII,GACL,IAAIL,EAAKC,CAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,MAAMK,GAAM;AACf,QAAIC,GAAIC,GAAIC,GAAIC;AAChB,QAAIC;AACJ,YAAQL,EAAK,QAAM;AAAA,MACf,KAAK;AACD,QAAAK,KAAOJ,IAAK,kBAAkB,KAAKD,CAAI,OAAO,QAAQC,MAAO,SAAS,SAASA,EAAG,CAAC;AACnF;AAAA,MACJ,KAAK;AACD,QAAAI,KACKH,IAAK,4EACD,KAAKF,CAAI,OAAO,QAAQE,MAAO,SAAS,SAASA,EAAG,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;AAAA,MACJ,KAAK;AACD,QAAAG,KACKF,IAAK,gFACD,KAAKH,CAAI,OAAO,QAAQG,MAAO,SAAS,SAASA,EAAG,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;AAAA,MACJ,KAAK;AACD,QAAAE,KACKD,IAAK,qFACD,KAAKJ,CAAI,OAAO,QAAQI,MAAO,SAAS,SAASA,EAAG,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;AAAA,IAGhB;AACQ,QAAIC,GAAK;AACL,YAAMC,IAAQ,IAAI,WAAW,EAAE;AAC/B,eAASC,IAAI,GAAGA,IAAI,IAAIA,KAAK,GAAG;AAC5B,cAAMC,IAAI,SAASH,EAAI,UAAU,IAAIE,GAAG,IAAIA,IAAI,CAAC,GAAG,EAAE;AACtD,QAAAD,EAAMC,IAAI,CAAC,IAAIC,MAAM,IACrBF,EAAMC,IAAI,CAAC,IAAIC,MAAM,IACrBF,EAAMC,IAAI,CAAC,IAAIC,MAAM,GACrBF,EAAMC,IAAI,CAAC,IAAIC;AAAA,MACnB;AACA,aAAO,IAAId,EAAKY,CAAK;AAAA,IACzB;AAEI,YAAM,IAAI,YAAY,6BAA6B;AAAA,EAE3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACP,QAAIG,IAAO;AACX,aAASF,IAAI,GAAGA,IAAI,KAAK,MAAM,QAAQA;AACnC,MAAAE,KAAQhB,EAAO,OAAO,KAAK,MAAMc,CAAC,MAAM,CAAC,GACzCE,KAAQhB,EAAO,OAAO,KAAK,MAAMc,CAAC,IAAI,EAAG,IACrCA,MAAM,KAAKA,MAAM,KAAKA,MAAM,KAAKA,MAAM,OACvCE,KAAQ;AAGhB,WAAOA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACJ,QAAIA,IAAO;AACX,aAASF,IAAI,GAAGA,IAAI,KAAK,MAAM,QAAQA;AACnC,MAAAE,KAAQhB,EAAO,OAAO,KAAK,MAAMc,CAAC,MAAM,CAAC,GACzCE,KAAQhB,EAAO,OAAO,KAAK,MAAMc,CAAC,IAAI,EAAG;AAE7C,WAAOE;AAAA,EACX;AAAA;AAAA,EAEA,SAAS;AACL,WAAO,KAAK,SAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa;AACT,UAAMD,IAAI,KAAK,MAAM,CAAC,MAAM;AAC5B,QAAIA,IAAI;AACJ,YAAM,IAAI,MAAM,aAAa;AAE5B,QAAIA,KAAK;AACV,aAAO,KAAK,MAAM,MAAM,CAACE,MAAMA,MAAM,CAAC,IAAI,QAAQ;AAEjD,QAAIF,KAAK;AACV,aAAO;AAEN,QAAIA,KAAK;AACV,aAAO;AAEN,QAAIA,KAAK;AACV,aAAO,KAAK,MAAM,MAAM,CAACE,MAAMA,MAAM,GAAI,IAAI,QAAQ;AAGrD,UAAM,IAAI,MAAM,aAAa;AAAA,EAErC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACT,WAAO,KAAK,WAAU,MAAO,WAAW,KAAK,MAAM,CAAC,MAAM,IAAI;AAAA,EAClE;AAAA;AAAA,EAEA,QAAQ;AACJ,WAAO,IAAIhB,EAAK,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EACvC;AAAA;AAAA,EAEA,OAAOiB,GAAO;AACV,WAAO,KAAK,UAAUA,CAAK,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUA,GAAO;AACb,aAASJ,IAAI,GAAGA,IAAI,IAAIA,KAAK;AACzB,YAAMK,IAAO,KAAK,MAAML,CAAC,IAAII,EAAM,MAAMJ,CAAC;AAC1C,UAAIK,MAAS;AACT,eAAO,KAAK,KAAKA,CAAI;AAAA,IAE7B;AACA,WAAO;AAAA,EACX;AACJ;AAUO,MAAMC,EAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,YAAYC,GAAuB;AAC/B,SAAK,YAAY,GACjB,KAAK,UAAU,GACf,KAAK,SAASA,KAA6FC,EAAgB;AAAA,EAC/H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WAAW;AACP,WAAO,KAAK,oBAAoB,KAAK,IAAG,GAAI,GAAK;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,kBAAkB;AACd,WAAO,KAAK,oBAAoB,KAAK,IAAG,GAAI,GAAK;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,oBAAoBnB,GAAUoB,GAAmB;AAC7C,QAAIjE,IAAQ,KAAK,oBAAoB6C,GAAUoB,CAAiB;AAChE,WAAIjE,MAAU,WAEV,KAAK,YAAY,GACjBA,IAAQ,KAAK,oBAAoB6C,GAAUoB,CAAiB,IAEzDjE;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,oBAAoB6C,GAAUoB,GAAmB;AAE7C,QAAI,CAAC,OAAO,UAAUpB,CAAQ,KAC1BA,IAAW,KACXA,IAAW;AACX,YAAM,IAAI,WAAW,uDAAuDA,CAAQ,EAAE;AAErF,QAAIoB,IAAoB,KAAKA,IAAoB;AAClD,YAAM,IAAI,WAAW,sDAAsDA,CAAiB,EAAE;AAElG,QAAIpB,IAAW,KAAK;AAChB,WAAK,YAAYA,GACjB,KAAK,aAAY;AAAA,aAEZA,IAAWoB,KAAqB,KAAK;AAE1C,WAAK,WACD,KAAK,UAAU,kBAEf,KAAK,aACL,KAAK,aAAY;AAAA;AAKrB;AAEJ,WAAOtB,EAAK,aAAa,KAAK,WAAW,KAAK,MAAM,KAAK,UAAU,KAAK,EAAE,GAAG,KAAK,UAAW,KAAK,KAAK,GAAI,KAAK,OAAO,YAAY;AAAA,EACvI;AAAA;AAAA,EAEA,eAAe;AACX,SAAK,UACD,KAAK,OAAO,eAAe,QAAS,KAAK,OAAO,WAAU,IAAK;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa;AACT,UAAMC,IAAQ,IAAI,WAAW,YAAY,GAAG,KAAK,OAAO,WAAU,GAAI,KAAK,OAAO,cAAc,KAAK,OAAO,WAAU,GAAI,KAAK,OAAO,YAAY,EAAE,MAAM;AAC1J,WAAAA,EAAM,CAAC,IAAI,KAAQA,EAAM,CAAC,MAAM,GAChCA,EAAM,CAAC,IAAI,MAAQA,EAAM,CAAC,MAAM,GACzBD,EAAK,QAAQC,CAAK;AAAA,EAC7B;AACJ;AAEA,MAAMoB,IAAmB,MAAM;AAE3B,MAAI,OAAO,SAAW,OAClB,OAAO,OAAO,kBAAoB;AAClC,WAAO,IAAIE,EAAoB;AAI/B,MAAI,OAAO,uBAAyB,OAAe;AAC/C,UAAM,IAAI,MAAM,2CAA2C;AAE/D,SAAO;AAAA,IACH,YAAY,MAAM,KAAK,MAAM,KAAK,OAAM,IAAK,KAAK,IAAI,QAClD,KAAK,MAAM,KAAK,OAAM,IAAK,KAAK;AAAA,EAChD;AAEA;AAMA,MAAMA,EAAqB;AAAA,EACvB,cAAc;AACV,SAAK,SAAS,IAAI,YAAY,CAAC,GAC/B,KAAK,SAAS;AAAA,EAClB;AAAA,EACA,aAAa;AACT,WAAI,KAAK,UAAU,KAAK,OAAO,WAC3B,OAAO,gBAAgB,KAAK,MAAM,GAClC,KAAK,SAAS,IAEX,KAAK,OAAO,KAAK,QAAQ;AAAA,EACpC;AACJ;AACA,IAAIC;AAOG,MAAMC,IAAS,MAAMC,EAAS,EAAG,SAAQ,GAEnCA,IAAY,OAAOF,MAAqBA,IAAmB,IAAIL,EAAW,IAAK,SAAQ;ACrYpG,IAAAQ,IAAA,MAAe;AAAA,EACX,YAAmB5F,GAAc;AAAd,SAAA,KAAAA;AAAA,EAAe;AAAA,EAClC,QAAQ;AACJ,WAAO,KAAK,GAAG,OAAO,8DAA8D;AAAA,EACxF;AAAA,EACA,MAAM,UAAUC,GAAoB;AAChC,WAAOyF,EAAA;AAAA,EACX;AACJ;AAIO,MAAMG,EAA4B;AAAA,EAgCrC,YAAmB7C,GAAyB5C,IAA0B,IAAI;AAAvD,SAAA,WAAA4C,GAAyB,KAAA,UAAA5C,GA5B5C,KAAA,0BAA0B,IAE1B,KAAA,iBAAiB,MACjB,KAAA,wBAA+C;AAAA,MAC3C,cAAc;AAAA,MACd,iBAAiB,CAAC,kBAAkB,cAAc;AAAA,MAClD,4BAA4B;AAAA,MAC5B,wBAAwB;AAAA,MACxB,gBAAgB;AAAA,MAChB,OAAO;AAAA,QACH;AAAA,MAAA;AAAA,IACJ,GAEJ,KAAA,2BAA2B;AAAA,MACvB,2BAA2B;AAAA,MAC3B,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA,GAEpB,KAAA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,eAAe8C;AAAA,MACf,aAAa,EAAE,QAAQ,IAAM,gBAAgB,IAAM,SAAS,GAAA;AAAA,IAAK,GAGjE,KAAK,WAAW,IAAI5C,EAAS,IAAI,GACjC,KAAK,SAAS,KAAK,SAAS,UAAUC,GACtC,KAAK,KAAK,IAAIuF,EAAO,KAAK,QAAQ;AAAA,EACtC;AAAA,EACA,MAAM,KAAK3C,IAAY,IAAO;AAI1B,QAAIA,GAAW;AAEX,YAAM4C,IAAS,MAAM,KAAK,GAAG,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,aAKvD;AAGD,iBAAWC,KAASD,EAAO;AACvB,cAAM,KAAK,GAAG,MAAM,yBAAyBC,EAAM,SAAS,WAAW;AAAA,IAE/E;AAEA,UAAM,KAAK,SAAS,MAAA;AAAA,EACxB;AAAA,EACA,MAAM,oBAAoB;AAAA,EAG1B;AAAA,EACA,MAAM,gCAAgC;AAClC,UAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOtB,+BAA+B;AAAA,EAC/B;AAAA,EACA,MAAM,2BAA2B;AAC7B,UAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOtB,6BAA6B;AAAA,EAC7B;AAAA,EACA,MAAM,MAASvF,GAAYM,IAAmB,CAAA,GAAIJ,IAAM,IAAK;AACzD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE;AAE1D,IAAAE,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH;AACD,QAAI;AACA,cAAQ,MAAM,KAAK,GAAG,MAAMN,GAAKM,CAAM,GAAG;AAAA,IAC9C,SAASuC,GAAgB;AACrB,YAAAxC,EAAO,MAAM;AAAA,QACT,MAAK;AAAA,QACL,MAAAH;AAAA,QACA,KAAAF;AAAA,QACA,QAAAM;AAAA,QACA,OAAOuC,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,MAAA,CAC/D,GACKA;AAAA,IACV;AAAA,EACJ;AAAA,EACA,MAAM,OAAU7C,GAAWQ,GAAmBC,GAAiBP,IAAK,IAAI;AACpE,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDO,IAAW,GAAGV,CAAG,IAAIS,IAAU,cAAcA,CAAO,YAAW,EAAE,IACjEH,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,CACrE;AACD,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAIQ;AAAA,MACJ,QAAAJ;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,GAAG,MAAMI,GAAUJ,CAAM,GAAG;AAAA,EAEpD;AAAA,EACA,MAAM,OAAON,GAAYQ,GAAkBN,IAAK,IAAK;AACjD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAKA,CACtE;AACD,IAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH;AAED,UAAMI,IAAW,GAAGV,CAAG,eAAeW,CAAW;AACjD,QAAI;AACA,cAAQ,MAAM,KAAK,GAAG,MAAMD,GAAUJ,CAAM,GAAG,KAAK,CAAC;AAAA,IACzD,SAASuC,GAAgB;AACrB,YAAAxC,EAAO,MAAM;AAAA,QACT,MAAK;AAAA,QACL,MAAAH;AAAA,QACA,KAAKQ;AAAA,QACL,QAAAJ;AAAA,QACA,OAAOuC,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,MAAA,CAC/D,GACKA;AAAA,IACV;AAAA,EACJ;AAAA,EACA,MAAM,OAAW7C,GAAYM,GAAmBJ,IAAK,IAAI;AACrD,UAAMC,IAASC,EAAwB,SAAA;AAEvC,WADe,KAAK,OAAO,MAAMD,GAAS,cAAc,EAAE,EACnD,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAD;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,GAAG,MAAMN,GAAKM,CAAM,GAAG;AAAA,EAE/C;AAAA,EACA,MAAM,OAAON,GAAaE,IAAK,IAAI;AAC/B,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE;AAC1D,IAAAE,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,IAAA,CACH;AACD,QAAI;AACA,aAAO,MAAM,KAAK,GAAG,MAAMA,CAAG;AAAA,IAClC,SAAS6C,GAAgB;AACrB,YAAAxC,EAAO,MAAM;AAAA,QACT,MAAK;AAAA,QACL,MAAAH;AAAA,QACA,KAAAF;AAAA,QACA,OAAO6C,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,MAAA,CAC/D,GACKA;AAAA,IACV;AAAA,EACJ;AAAA,EACA,QAAQ;AACJ,WAAO,KAAK,GAAG,MAAA;AAAA,EACnB;AAAA,EACA,MAAM,UAAUrD,GAAoB;AAChC,WAAO,KAAK,SAAS,UAAUA,CAAU;AAAA,EAC7C;AAAA,EACA,qBAAqBoB,GAAaC,GAAwBC,GAAmBC,GAAmBC,GAA2BC,GAA+CC,GAAiB;AACvL,QAAIH,EAAU,YAAA,MAAkB,QAAQ;AACpC,UAAIF,EAAM,CAAC,EAAE,YAAA,MAAkB,YAAY;AACvC,cAAMwC,IAAsBvC,EAAU,MAAM,GAAG,EAAE,IAAI,CAAAP,MAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG;AAC5E,eAAO;AAAA,UACH,YAAY,mBAAmBW,EAAA,CAAG,2CAA2CmC,CAAmB;AAAA,UAChG,aAAa,CAACxC,EAAM,CAAC,CAAC;AAAA,QAAA;AAAA,MAE9B;AAGA,UAAIA,EAAM,CAAC,MAAM,OAAOA,EAAM,CAAC,MAAM;AAEjC,eAAO;AAAA,UACH,YAAY,mBAFYC,EAAU,MAAM,GAAG,EAAE,IAAI,CAAAP,MAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG,CAEtB,WAAWM,EAAM,CAAC,CAAC,IAAIK,EAAA,CAAG;AAAA,UAC5E,aAAa,CAAC,KAAK,UAAUL,EAAM,CAAC,CAAC,CAAC;AAAA,QAAA;AAAA,IAGlD;AAAA,EACJ;AAAA,EAEA,iBAAiB;AACb,QAAIyC,IAAQ;AACZ,WAAO,OACHA,KACO,IAAIA,CAAK;AAAA,EAExB;AAAA,EACA,iBAAiBnC,GAAcC,GAAsB;AACjD,WAAID,MAAS,OACF,uBACAA,MAAS,OACT,SACAC,KAAcD,MAAS,WACvB,SACAA,MAAS,WACT,SACAA,MAAS,YACT,SACDA,MAAS,WAGR,qBACFA,MAAS,cACP,cAEAA;AAAA,EAEf;AACJ;ACxPA,MAAMtB,EAAS;AAAA,EACX,YAAmBN,GAAc;AAAd,SAAA,KAAAA,GAiBnB,KAAQ,aAA+B,QAAQ,QAAA;AAAA,EAjBb;AAAA,EAClC,MAAM,QAAQ;AAEV,UAAM,KAAK,GAAG,OAAO,0FAA0F,IAE5F,MAAM,KAAK,GAAG;AAAA,MAC7B;AAAA,MACA,CAAA;AAAA,MACA;AAAA,IAAA,GAEY,CAAC,GAAG,OAChB,MAAM,KAAK,GAAG,OAAO,sEAAsE;AAAA,EAEnG;AAAA,EAKA,MAAM,UAAUC,GAAoB;AAChC,UAAMgG,IAAa,KAAK,WAAW,KAAK,aAIpC,MAAM,KAAK,GAAG;AAAA,MACV;AAAA;AAAA,MAEA,CAAChG,CAAU;AAAA,MACX;AAAA,MACA,wBAAwBA,CAAU;AAAA,IAAA,IAEzB,MAAM,KAAK,GAAG,MAAsB,iCAAiC,IAAI,yBAAyBA,CAAU,EAAE,GAC/G,CAAC,EAAE,GAClB;AACD,gBAAK,aAAagG,EAAW,MAAM,MAAM;AAAA,IAAC,CAAC,GACpCA;AAAA,EACX;AACJ;AAIO,MAAMC,EAA2B;AAAA,EAyBpC,YAAmBlD,GAAwB5C,IAAyB,IAAI;AAArD,SAAA,WAAA4C,GAAwB,KAAA,UAAA5C,GApB3C,KAAA,0BAA0B,IAE1B,KAAA,iBAAiB,MACjB,KAAA,wBAA+C;AAAA,MAC3C,cAAc;AAAA,MACd,iBAAiB,CAAA;AAAA,MACjB,4BAA4B;AAAA,MAC5B,wBAAwB;AAAA,MACxB,gBAAgB;AAAA,MAChB,OAAO;AAAA,QACH;AAAA,MAAA;AAAA,IACJ,GAEJ,KAAA,gBAAgB;AAAA,MACZ,MAAM;AAAA,MACN,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,eAAe8C;AAAA,MACf,aAAa,EAAE,QAAQ,IAAO,gBAAgB,IAAO,SAAS,GAAA;AAAA,IAAM,GAGpE,KAAK,WAAW,IAAI5C,EAAS,IAAI,GACjC,KAAK,SAAS,KAAK,SAAS,UAAUC;AAAA,EAC1C;AAAA,EACA,MAAM,KAAK4C,IAAY,IAAO;AAE1B,UAAMgD,IAAsB,MAAMC,EAAM,iBAAiB;AAAA,MACrD,GAAG,KAAK;AAAA,IAAA,CACX;AACD,UAAMD,EAAoB,QAAA;AAC1B,QAAI;AAGA,YAAME,IAAiB,KAAK,KAAK,SAAS,QAAQ,MAAM,IAAI,CAAC,MACvD,CAACC,CAAI,IAAI,MAAMH,EAAoB,MAAM,yBAAyB,CAAC,KAAK,QAAQ,CAAC;AACvF,MAAKG,EAAyB,WAAW,IACrC,MAAMH,EAAoB,MAAM,mBAAmBE,CAAc,EAAE,IAC5DlD,MACP,MAAMgD,EAAoB,MAAM,iBAAiBE,CAAc,EAAE,GACjE,MAAMF,EAAoB,MAAM,mBAAmBE,CAAc,EAAE;AAAA,IAE3E,UAAA;AACI,YAAMF,EAAoB,IAAA;AAAA,IAC9B;AAIA,SAAK,KAAK,MAAMC,EAAM,iBAAiB;AAAA,MACnC,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,IAAA,CAClB,GACD,MAAM,KAAK,GAAG,QAAA,GACd,MAAM,KAAK,GAAG,MAAM,4BAA4B,GAEhD,MAAM,KAAK,SAAS,MAAA;AAAA,EAExB;AAAA,EACA,MAAM,oBAAoB;AACtB,IAAI,KAAK,OAGT,KAAK,KAAK,MAAMA,EAAM,iBAAiB;AAAA,MACnC,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,IAAA,CAClB,GACD,MAAM,KAAK,GAAG,QAAA,GACd,MAAM,KAAK,GAAG,MAAM,4BAA4B;AAAA,EACpD;AAAA,EACA,MAAM,MAAS3F,GAAYC,IAAkB,CAAA,GAAIC,IAAM,IAAK;AACxD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GAEpDG,IAASL,EAAM,IAAI,CAAAM,MAAKA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CAAC;AAC9D,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,GAAG,MAAMN,GAAKM,CAAM,GAAG,CAAC;AAAA,EAChD;AAAA,EACA,MAAM,OAAUN,GAAWQ,GAAmBC,GAAiBP,IAAK,IAAI;AACpE,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GAGpDG,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CACpG;AACD,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,GAAG,MAAMN,GAAKM,CAAM,GAAG,CAAC;AAAA,EAChD;AAAA,EACA,MAAM,OAAON,GAAYQ,GAAkBN,IAAK,IAAK;AACjD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASE,EAAO,IAAI,CAAAD,MACd,OAAOA,KAAM,YAAYA,MAAK,OAAQ,KAAK,UAAUA,CAAC,IAAIA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CACpG;AAED,IAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,GAED,MAAM,KAAK,GAAG,MAAMN,GAAKM,CAAM;AAC/B,UAAM,CAACuF,CAAI,IAAK,MAAM,KAAK,GAAG,MAAM,0BAA0B;AAE9D,WAAO,EAAC,IADYA,EAAyB,CAAC,EAAE,kBAAkB,EACtD;AAAA,EAChB;AAAA,EACA,MAAM,OAAW7F,GAAYC,GAAkBC,IAAK,IAAI;AACpD,UAAMC,IAASC,EAAwB,SAAA,GACjCC,IAAS,KAAK,OAAO,MAAMF,GAAS,cAAc,EAAE,GACpDG,IAASL,EAAM,IAAI,CAAAM,MAAKA,MAAI,KAAQ,IAAIA,MAAI,KAAO,IAAIA,CAAC;AAC9D,WAAAF,EAAO,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAH;AAAA,MACA,KAAAF;AAAA,MACA,QAAAM;AAAA,IAAA,CACH,IACQ,MAAM,KAAK,GAAG,MAAMN,GAAKM,CAAM,GAAG,CAAC;AAAA,EAChD;AAAA,EACA,MAAM,OAAON,GAAaE,IAAK,IAAI;AAC/B,UAAMC,IAASC,EAAwB,SAAA;AAEvC,WADe,KAAK,OAAO,MAAMD,GAAS,cAAc,EAAE,EACnD,KAAK;AAAA,MACR,MAAK;AAAA,MACL,MAAAD;AAAA,MACA,KAAAF;AAAA,IAAA,CACH,GACO,MAAM,KAAK,GAAG,MAAMA,CAAG;AAAA,EACnC;AAAA,EACA,QAAQ;AACJ,WAAO,KAAK,GAAG,IAAA;AAAA,EACnB;AAAA,EACA,MAAM,UAAUR,GAAoB;AAChC,WAAO,KAAK,SAAS,UAAUA,CAAU;AAAA,EAC7C;AAAA,EACA,qBAAqBoB,GAAaC,GAAwBC,GAAmBC,GAAmBC,GAA2BC,GAA+CC,GAAiB;AACvL,QAAIH,MAAc,QAAQ;AACtB,UAAIF,EAAM,CAAC,EAAE,YAAA,MAAkB;AAG3B,eAAO;AAAA,UACH,YAAY,iCAHYC,EAAU,MAAM,GAAG,EAAE,IAAI,CAAAP,MAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG,CAGR,KAAKW,GAAG;AAAA,UACxE,aAAa,CAAC,KAAK,UAAUL,EAAM,CAAC,CAAC,CAAC;AAAA,QAAA;AAK9C,UAAIA,EAAM,CAAC,MAAM,OAAOA,EAAM,CAAC,MAAM;AAEjC,eAAO;AAAA,UACH,YAAY,mBAFYC,EAAU,MAAM,GAAG,EAAE,IAAI,CAAAP,MAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,GAAG,CAEtB,IAAIM,EAAM,CAAC,CAAC,SAASK,EAAA,CAAG;AAAA,UAC1E,aAAa,CAAC,KAAK,UAAUL,EAAM,CAAC,CAAC,CAAC;AAAA,QAAA;AAAA,IAGlD;AAAA,EACJ;AAAA,EAEA,iBAAiB;AACb,WAAO,MACI;AAAA,EAEf;AAAA,EACA,iBAAiBM,GAAcC,GAAsB;AACjD,WAAID,MAAS,OACF,mCACAA,MAAS,OACT,QACAC,KAAcD,MAAS,WACvB,SACAA,MAAS,WACT,SACAA,MAAS,YACT,WACDA,MAAS,WAGR,WACFA,MAAS,cACP,cAEAA;AAAA,EAEf;AACJ;","x_google_ignoreList":[2]}
1
+ {"version":3,"file":"drivers.js","sources":["../src/drivers/SQLite.ts","../src/drivers/PostgreSQL.ts","../node_modules/@interaqt/uuidv7/dist/index.js","../src/drivers/PGLite.ts","../src/drivers/Mysql.ts"],"sourcesContent":["import SQLite from \"better-sqlite3\";\n// CAUTION drivers 是发布包的独立子入口(interaqt/drivers),只能从主入口 \"interaqt\" 导入:\n// 路径别名(@storage 等)在消费者环境不存在,且共享单例(asyncInteractionContext)必须与主包同源。\nimport {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR, asyncInteractionContext, InteractionContext, dbConsoleLogger, TransactionCapability, sqliteEncodeLiteral} from \"interaqt\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n async setup() {\n await this.db.scheme(`CREATE Table IF NOT EXISTS _IDS_ (last INTEGER, name TEXT)`)\n // 原子 UPSERT 依赖 name 上的唯一索引;IF NOT EXISTS 同时兼容旧版建出的无约束 _IDS_ 表。\n await this.db.scheme(`CREATE UNIQUE INDEX IF NOT EXISTS \"_IDS__name_unique\" ON _IDS_ (name)`)\n }\n async getAutoId(recordName: string) {\n // CAUTION 原子 UPSERT:此前的「SELECT 再 INSERT/UPDATE」读-改-写在并发下会分配重复 id;\n // recordName 一律走参数绑定(与 PostgreSQL 驱动的参数化路径一致)。\n const rows = await this.db.query<{ last: number }>(\n `INSERT INTO _IDS_ (name, last) VALUES (?, 1)\nON CONFLICT(name) DO UPDATE SET last = last + 1\nRETURNING last`,\n [recordName],\n `allocate next id for ${recordName}`\n )\n return rows[0].last as unknown as string\n }\n}\n\nexport type SQLiteDBOptions = Parameters<typeof SQLite>[1] & { logger :DatabaseLogger }\n\nexport class SQLiteDB implements Database{\n db!: InstanceType<typeof SQLite>\n idSystem!: IDSystem\n logger: DatabaseLogger\n supportsSelectForUpdate = false\n // SQLite 的 SQLITE_MAX_VARIABLE_NUMBER 自 3.32 起默认 32766;留出安全余量。\n maxQueryParams = 32000\n transactionCapability: TransactionCapability = {\n transactions: true,\n isolationLevels: ['READ COMMITTED', 'SERIALIZABLE'],\n transactionBoundConnection: false,\n concurrentTransactions: 'unsupported',\n nestedStrategy: 'reuse',\n notes: [\n 'SQLite uses MonoStorage fallback transaction metadata for retry paths and does not provide PostgreSQL-level concurrent dispatch isolation.'\n ],\n }\n atomicSequenceCapability = {\n requiresActiveTransaction: true as const,\n transactional: true,\n crossConnection: false,\n crossProcess: false,\n returning: true,\n productionSafe: false,\n }\n schemaDialect = {\n name: 'sqlite' as const,\n maxIdentifierLength: 63,\n supportsCreateIndexIfNotExists: true,\n encodeLiteral: sqliteEncodeLiteral,\n constraints: { unique: true, filteredUnique: true, nonNull: false },\n }\n constructor(public file:string = ':memory:', public options?: SQLiteDBOptions) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n }\n async open() {\n this.db = new SQLite(this.file, this.options)\n await this.idSystem.setup()\n }\n async openForSchemaRead() {\n this.db = new SQLite(this.file, this.options)\n }\n async setupInternalComputationState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ComputationState_\" (\n \"key\" TEXT PRIMARY KEY,\n \"numberValue\" NUMERIC NULL,\n \"booleanValue\" BOOLEAN NULL,\n \"stringValue\" TEXT NULL,\n \"jsonValue\" JSON NULL\n)`, 'setup computation state table')\n }\n async setupScopedSequenceState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ScopedSequence_\" (\n \"sequenceName\" TEXT NOT NULL,\n \"scopeKey\" TEXT NOT NULL,\n \"scope\" JSON NOT NULL,\n \"lastValue\" NUMERIC NOT NULL,\n PRIMARY KEY (\"sequenceName\", \"scopeKey\")\n)`, 'setup scoped sequence table')\n }\n async query<T>(sql:string, where: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return this.db.prepare(sql).all(...params) as T[]\n }\n async update(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING ${idField} AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n // CAUTION better-sqlite3 对 RETURNING 语句必须用 .all() 才能取回行;\n // .run() 只返回 {changes, lastInsertRowid},与 PostgreSQL/PGLite 驱动的返回行契约不一致。\n if (idField) {\n return this.db.prepare(finalSQL).all(...params) as unknown as EntityIdRef[]\n }\n return this.db.prepare(finalSQL).run(...params) as unknown as EntityIdRef[]\n }\n async insert (sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n // CAUTION better-sqlite3 对 RETURNING 语句必须用 .all() 才能取回行;\n // .run() 只返回 {changes, lastInsertRowid},这些元数据会被上层 Object.assign 进创建的记录,\n // 与 PostgreSQL/PGLite 驱动(返回 RETURNING 行)的契约不一致。\n const rows = this.db.prepare(`${sql} RETURNING ${ROW_ID_ATTR}`).all(...params) as unknown as EntityIdRef[]\n return rows[0]\n }\n async delete<T> (sql:string, where: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return this.db.prepare(sql).run(...params) as unknown as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return this.db.prepare(sql).run()\n }\n async close() {\n this.db.close()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n return {\n fieldValue: `NOT NULL AND EXISTS (\n SELECT 1\n FROM json_each(${fieldName})\n WHERE json_each.value = ${p()}\n)`,\n fieldParams: [value[1]]\n }\n }\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INTEGER PRIMARY KEY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object'||type==='json') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'INT(2)'\n } else if(type === 'number'){\n // CAUTION SQLite 是动态类型(type affinity):INT 亲和的列写入 2.5 仍原样存为 REAL,\n // 不会像 PG/MySQL 的 INT 那样报错或截断,所以 number 在 SQLite 上没有精度问题。\n // 保持 INT 声明是为了既有部署的 schema/manifest 兼容(改声明会触发迁移 diff)。\n return \"INT\"\n }else if(type === 'timestamp'){\n return \"INT\"\n }else{\n return type\n }\n }\n}","import {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR, asyncInteractionContext, InteractionContext, dbConsoleLogger, RequireSerializableRetry, TransactionCapability, TransactionOptions, defaultEncodeLiteral} from \"interaqt\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createHash } from \"node:crypto\";\nimport pg, { type ClientConfig, type PoolClient} from 'pg'\n\nconst { Client, Pool } = pg\n\ntype TransactionContext = {\n client: PoolClient\n depth: number\n isolation: TransactionOptions['isolation']\n}\n\nclass IDSystem {\n private initialized = new Set<string>()\n private recordToSequenceName = new Map<string, string>()\n constructor(public db: PostgreSQLDB) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name TEXT)`)\n }\n private sanitizeIdentifierPart(value: string) {\n const sanitized = value.replace(/[^a-zA-Z0-9_]/g, '_').replace(/^_+/, '')\n return (sanitized || 'record').slice(0, 32)\n }\n sequenceName(recordName: string) {\n return this.sequenceNameForKey(recordName, recordName)\n }\n private sequenceNameForKey(key: string, displayName: string) {\n const hash = createHash('sha1').update(key).digest('hex').slice(0, 12)\n return `seq_${hash}_${this.sanitizeIdentifierPart(displayName)}`.slice(0, 63)\n }\n private quoteIdentifier(identifier: string) {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`\n }\n async setupSequences(records: Array<{ recordName: string, tableName: string, idField: string }>) {\n const idsTableExists = (await this.db.query<{ exists: string | null }>(\n `SELECT to_regclass($1) AS exists`,\n ['\"_IDS_\"'],\n 'check legacy id table'\n ))[0]?.exists\n\n const sequenceMax = new Map<string, number>()\n for (const record of records) {\n const sequenceName = this.sequenceNameForKey(`${record.tableName}.${record.idField}`, record.tableName)\n this.recordToSequenceName.set(record.recordName, sequenceName)\n const quotedSequence = this.quoteIdentifier(sequenceName)\n await this.db.scheme(`CREATE SEQUENCE IF NOT EXISTS ${quotedSequence} START WITH 1`, `create sequence ${record.recordName}`)\n\n const tableRows = await this.db.query<{ max: number | string | null }>(\n `SELECT COALESCE(MAX(\"${record.idField}\"), 0) AS max FROM ${this.quoteIdentifier(record.tableName)}`,\n [],\n `read max id for ${record.recordName}`\n )\n let legacyMax = 0\n if (idsTableExists) {\n const legacyRows = await this.db.query<{ last: number | string | null }>(\n `SELECT COALESCE(MAX(\"last\"), 0) AS last FROM \"_IDS_\" WHERE \"name\" = $1`,\n [record.recordName],\n `read legacy id for ${record.recordName}`\n )\n legacyMax = Number(legacyRows[0]?.last ?? 0)\n }\n const maxExistingId = Math.max(Number(tableRows[0]?.max ?? 0), legacyMax)\n sequenceMax.set(quotedSequence, Math.max(sequenceMax.get(quotedSequence) ?? 0, maxExistingId))\n this.initialized.add(record.recordName)\n }\n for (const [quotedSequence, maxExistingId] of sequenceMax) {\n if (maxExistingId >= 1) {\n // CAUTION 只允许\"向前推进\"序列,绝不能回拨。\n // setup(false)(新进程 attach 已运行的库)会走到这里,此时其他进程可能正在写入:\n // 它们未提交的行对 MAX() 不可见,但已经消费了更大的序列值。无条件 setval 会把\n // 序列拨回已提交的最大 id,后续 nextval 就会发出重复 id。\n // last_value/is_called 与 nextval 一样是非事务性的、立即可见,所以用它们做守卫是安全的:\n // 只在序列从未使用(初始化/legacy 迁移)或落后于表内已有 id(外部 id 写入)时才推进。\n await this.db.query(\n `SELECT setval($1::regclass, $2, true) FROM ${quotedSequence} WHERE NOT is_called OR last_value < $2`,\n [quotedSequence, maxExistingId],\n `advance sequence ${quotedSequence}`\n )\n }\n }\n }\n async getAutoId(recordName: string) {\n if (!this.initialized.has(recordName)) {\n throw new Error(`PostgreSQL sequence for ${recordName} is not initialized. Run storage setup before creating records.`)\n }\n const sequenceName = this.recordToSequenceName.get(recordName) ?? this.sequenceName(recordName)\n const rows = await this.db.query<{ id: number | string }>(\n `SELECT nextval($1::regclass) AS id`,\n [this.quoteIdentifier(sequenceName)],\n `next id for ${recordName}`\n )\n return rows[0]!.id as unknown as string\n }\n}\n\nexport type PostgreSQLDBConfig = Omit<ClientConfig, 'database'> & { logger? :DatabaseLogger }\n\nexport class PostgreSQLDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db: InstanceType<typeof Client>\n pool?: InstanceType<typeof Pool>\n private transactionContext = new AsyncLocalStorage<TransactionContext>()\n supportsSelectForUpdate = true\n // PostgreSQL wire protocol 的绑定参数数量是 Int16(65535);留出安全余量。\n maxQueryParams = 65000\n transactionCapability: TransactionCapability = {\n transactions: true,\n isolationLevels: ['READ COMMITTED', 'SERIALIZABLE'],\n transactionBoundConnection: true,\n concurrentTransactions: 'database',\n nestedStrategy: 'reuse',\n }\n atomicSequenceCapability = {\n requiresActiveTransaction: true as const,\n transactional: true,\n crossConnection: true,\n crossProcess: true,\n returning: true,\n productionSafe: true,\n }\n schemaDialect = {\n name: 'postgres' as const,\n maxIdentifierLength: 63,\n supportsCreateIndexIfNotExists: true,\n encodeLiteral: defaultEncodeLiteral,\n constraints: { unique: true, filteredUnique: true, nonNull: true },\n }\n constructor(public database:string, public options: PostgreSQLDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n this.db = new Client({ ...options })\n }\n async open(forceDrop = false) {\n // CAUTION open() 必须可以在 openForSchemaRead()(或再次 open)之后被调用而不泄漏连接池。\n // 例如 Controller.setup(false) 会先经 prepareMigrationSchema 打开只读池做 manifest 校验,\n // 再走 system.setup 调用 open(false)。如果这里无条件 new Pool,旧池会被孤儿化:\n // close() 只会关掉最新的池,残留的空闲连接之后被 DROP DATABASE ... WITH (FORCE)\n // 之类的管理命令杀死时,会在进程里产生无人处理的 'error' 事件。\n if (this.pool && forceDrop) {\n // forceDrop 会摧毁当前数据库,先优雅关闭已有的池,避免它的空闲连接被强杀。\n await this.pool.end()\n this.pool = undefined\n }\n\n const adminClient = new Client({\n ...this.options,\n })\n await adminClient.connect()\n // 要不要有存在 就删掉的?\n // SELECT 'DROP DATABASE your_database_name' WHERE EXISTS (SELECT FROM pg_database WHERE dataname = 'your_database_name');\n const databaseExist = await adminClient.query(`SELECT FROM pg_database WHERE datname = $1`, [this.database])\n if (databaseExist.rows.length === 0) {\n await adminClient.query(`CREATE DATABASE \"${this.database}\"`)\n } else {\n if (forceDrop) {\n await adminClient.query(`DROP DATABASE \"${this.database}\" WITH (FORCE)`)\n await adminClient.query(`CREATE DATABASE \"${this.database}\"`)\n }\n }\n await adminClient.end()\n\n if (!this.pool) {\n this.pool = this.createPool()\n\n this.db = new Client({\n ...this.options,\n database: this.database\n })\n }\n }\n async openForSchemaRead() {\n if (this.pool) return\n // Strict dry-run schema planning must only connect to the target\n // database. Database creation/drop and framework table setup belong to\n // the normal open/setup paths.\n this.pool = this.createPool()\n\n this.db = new Client({\n ...this.options,\n database: this.database\n })\n }\n private createPool() {\n const pool = new Pool({\n ...this.options,\n database: this.database\n })\n // CAUTION 必须给 Pool 挂 'error' 监听器(node-postgres 的标准要求)。\n // 空闲连接被服务端终止(如管理命令、服务重启)时 Pool 会 emit 'error',\n // 没有监听器的话会直接变成进程级 uncaught exception。\n // 这种错误是可恢复的:Pool 会丢弃该连接,下次取用时重建,所以记录日志即可。\n pool.on('error', (error) => {\n this.logger.error({\n type: 'pool',\n name: 'idle client error',\n sql: '',\n error: error instanceof Error ? error.message : String(error),\n })\n })\n return pool\n }\n private getQueryable() {\n const context = this.transactionContext.getStore()\n if (context && context.depth > 0) return context.client\n if (!this.pool) {\n throw new Error(`PostgreSQL pool is not initialized. Call open() before querying.`)\n }\n return this.pool\n }\n async runInTransaction<T>(options: TransactionOptions, fn: () => Promise<T>): Promise<T> {\n const existing = this.transactionContext.getStore()\n if (existing && existing.depth > 0) {\n if (existing.isolation !== 'SERIALIZABLE' && (options.isolation ?? 'READ COMMITTED') === 'SERIALIZABLE') {\n throw new RequireSerializableRetry(`${options.name || 'nested transaction'} requires SERIALIZABLE isolation`)\n }\n existing.depth++\n try {\n return await fn()\n } finally {\n existing.depth--\n }\n }\n if (!this.pool) {\n throw new Error(`PostgreSQL pool is not initialized. Call open() before starting a transaction.`)\n }\n const isolation = options.isolation ?? 'READ COMMITTED'\n const client = await this.pool.connect()\n const context: TransactionContext = { client, depth: 1, isolation }\n let released = false\n try {\n await client.query(`BEGIN ISOLATION LEVEL ${isolation}`)\n const result = await this.transactionContext.run(context, fn)\n await client.query('COMMIT')\n return result\n } catch (error) {\n try {\n await client.query('ROLLBACK')\n } finally {\n client.release()\n released = true\n }\n throw error\n } finally {\n if (!released) {\n client.release()\n }\n }\n }\n async setupInternalComputationState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ComputationState_\" (\n \"key\" TEXT PRIMARY KEY,\n \"numberValue\" NUMERIC NULL,\n \"booleanValue\" BOOLEAN NULL,\n \"stringValue\" TEXT NULL,\n \"jsonValue\" JSONB NULL\n)`, 'setup computation state table')\n }\n async setupScopedSequenceState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ScopedSequence_\" (\n \"sequenceName\" TEXT NOT NULL,\n \"scopeKey\" TEXT NOT NULL,\n \"scope\" JSONB NOT NULL,\n \"lastValue\" NUMERIC NOT NULL,\n PRIMARY KEY (\"sequenceName\", \"scopeKey\")\n)`, 'setup scoped sequence table')\n }\n async query<T>(sql:string, where: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return (await this.getQueryable().query(sql, params)).rows as T[]\n }\n async update<T>(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.getQueryable().query(finalSQL, params)).rows as T[]\n }\n async insert(sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n const finalSQL = `${sql} RETURNING \"${ROW_ID_ATTR}\"`\n return (await this.getQueryable().query(finalSQL, params)).rows[0] as EntityIdRef\n }\n async delete<T> (sql:string, where: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.getQueryable().query(sql, params)).rows as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return await this.getQueryable().query(sql)\n }\n close() {\n return this.pool ? this.pool.end() : this.db.end()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n setupRecordSequences(records: Array<{ recordName: string, tableName: string, idField: string }>) {\n return this.idSystem.setupSequences(records)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${p()} = ANY (SELECT json_array_elements_text(${fieldNameWithQuotes}))`,\n fieldParams: [value[1]]\n }\n }\n // json 类型没有 = / != 操作符(\"operator does not exist: json = unknown\"),\n // 转成 jsonb 做语义相等比较(对键序不敏感)。NULL 行不参与匹配,与标量列的 =/!= 语义一致。\n if (value[0] === '=' || value[0] === '!=') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes}::jsonb ${value[0]} ${p()}::jsonb`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n // IN / NOT IN 与 =/!= 同理:逐元素做 jsonb 语义比较。NULL 行不参与匹配。\n const lowerOp = value[0].toLowerCase()\n if ((lowerOp === 'in' || lowerOp === 'not in') && Array.isArray(value[1]) && value[1].length > 0) {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n const placeholders = (value[1] as unknown[]).map(() => `${p()}::jsonb`).join(',')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes}::jsonb ${lowerOp === 'in' ? 'IN' : 'NOT IN'} (${placeholders})`,\n fieldParams: (value[1] as unknown[]).map(item => JSON.stringify(item))\n }\n }\n }\n }\n\n getPlaceholder() {\n let index = 0\n return () => {\n index++\n return `$${index}`\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INT GENERATED ALWAYS AS IDENTITY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'BOOLEAN'\n } else if(type === 'number'){\n // CAUTION JS 的 number 是双精度浮点。映射成 INT 会让合法的小数值\n // (例如内置 Average 计算的结果 sum/count)在写入时直接报错。\n return \"DOUBLE PRECISION\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}","/**\n * uuidv7: A JavaScript implementation of UUID version 7\n *\n * Copyright 2021-2024 LiosK\n *\n * @license Apache-2.0\n * @packageDocumentation\n */\nconst DIGITS = \"0123456789abcdef\";\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(bytes) {\n this.bytes = bytes;\n }\n /**\n * Creates an object from the internal representation, a 16-byte byte array\n * containing the binary UUID representation in the big-endian byte order.\n *\n * This method does NOT shallow-copy the argument, and thus the created object\n * holds the reference to the underlying buffer.\n *\n * @throws TypeError if the length of the argument is not 16.\n */\n static ofInner(bytes) {\n if (bytes.length !== 16) {\n throw new TypeError(\"not 128-bit length\");\n }\n else {\n return new UUID(bytes);\n }\n }\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n * @throws RangeError if any field value is out of the specified range.\n */\n static fromFieldsV7(unixTsMs, randA, randBHi, randBLo) {\n if (!Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 281474976710655 ||\n randA > 0xfff ||\n randBHi > 1073741823 ||\n randBLo > 4294967295) {\n throw new RangeError(\"invalid field value\");\n }\n const bytes = new Uint8Array(16);\n bytes[0] = unixTsMs / 2 ** 40;\n bytes[1] = unixTsMs / 2 ** 32;\n bytes[2] = unixTsMs / 2 ** 24;\n bytes[3] = unixTsMs / 2 ** 16;\n bytes[4] = unixTsMs / 2 ** 8;\n bytes[5] = unixTsMs;\n bytes[6] = 0x70 | (randA >>> 8);\n bytes[7] = randA;\n bytes[8] = 0x80 | (randBHi >>> 24);\n bytes[9] = randBHi >>> 16;\n bytes[10] = randBHi >>> 8;\n bytes[11] = randBHi;\n bytes[12] = randBLo >>> 24;\n bytes[13] = randBLo >>> 16;\n bytes[14] = randBLo >>> 8;\n bytes[15] = randBLo;\n return new UUID(bytes);\n }\n /**\n * Builds a byte array from a string representation.\n *\n * This method accepts the following formats:\n *\n * - 32-digit hexadecimal format without hyphens: `0189dcd553117d408db09496a2eef37b`\n * - 8-4-4-4-12 hyphenated format: `0189dcd5-5311-7d40-8db0-9496a2eef37b`\n * - Hyphenated format with surrounding braces: `{0189dcd5-5311-7d40-8db0-9496a2eef37b}`\n * - RFC 9562 URN format: `urn:uuid:0189dcd5-5311-7d40-8db0-9496a2eef37b`\n *\n * Leading and trailing whitespaces represents an error.\n *\n * @throws SyntaxError if the argument could not parse as a valid UUID string.\n */\n static parse(uuid) {\n var _a, _b, _c, _d;\n let hex = undefined;\n switch (uuid.length) {\n case 32:\n hex = (_a = /^[0-9a-f]{32}$/i.exec(uuid)) === null || _a === void 0 ? void 0 : _a[0];\n break;\n case 36:\n hex =\n (_b = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i\n .exec(uuid)) === null || _b === void 0 ? void 0 : _b.slice(1, 6).join(\"\");\n break;\n case 38:\n hex =\n (_c = /^\\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\\}$/i\n .exec(uuid)) === null || _c === void 0 ? void 0 : _c.slice(1, 6).join(\"\");\n break;\n case 45:\n hex =\n (_d = /^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i\n .exec(uuid)) === null || _d === void 0 ? void 0 : _d.slice(1, 6).join(\"\");\n break;\n default:\n break;\n }\n if (hex) {\n const inner = new Uint8Array(16);\n for (let i = 0; i < 16; i += 4) {\n const n = parseInt(hex.substring(2 * i, 2 * i + 8), 16);\n inner[i + 0] = n >>> 24;\n inner[i + 1] = n >>> 16;\n inner[i + 2] = n >>> 8;\n inner[i + 3] = n;\n }\n return new UUID(inner);\n }\n else {\n throw new SyntaxError(\"could not parse UUID string\");\n }\n }\n /**\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (`0189dcd5-5311-7d40-8db0-9496a2eef37b`).\n */\n toString() {\n let text = \"\";\n for (let i = 0; i < this.bytes.length; i++) {\n text += DIGITS.charAt(this.bytes[i] >>> 4);\n text += DIGITS.charAt(this.bytes[i] & 0xf);\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += \"-\";\n }\n }\n return text;\n }\n /**\n * @returns The 32-digit hexadecimal representation without hyphens\n * (`0189dcd553117d408db09496a2eef37b`).\n */\n toHex() {\n let text = \"\";\n for (let i = 0; i < this.bytes.length; i++) {\n text += DIGITS.charAt(this.bytes[i] >>> 4);\n text += DIGITS.charAt(this.bytes[i] & 0xf);\n }\n return text;\n }\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toJSON() {\n return this.toString();\n }\n /**\n * Reports the variant field value of the UUID or, if appropriate, \"NIL\" or\n * \"MAX\".\n *\n * For convenience, this method reports \"NIL\" or \"MAX\" if `this` represents\n * the Nil or Max UUID, although the Nil and Max UUIDs are technically\n * subsumed under the variants `0b0` and `0b111`, respectively.\n */\n getVariant() {\n const n = this.bytes[8] >>> 4;\n if (n < 0) {\n throw new Error(\"unreachable\");\n }\n else if (n <= 0b0111) {\n return this.bytes.every((e) => e === 0) ? \"NIL\" : \"VAR_0\";\n }\n else if (n <= 0b1011) {\n return \"VAR_10\";\n }\n else if (n <= 0b1101) {\n return \"VAR_110\";\n }\n else if (n <= 0b1111) {\n return this.bytes.every((e) => e === 0xff) ? \"MAX\" : \"VAR_RESERVED\";\n }\n else {\n throw new Error(\"unreachable\");\n }\n }\n /**\n * Returns the version field value of the UUID or `undefined` if the UUID does\n * not have the variant field value of `0b10`.\n */\n getVersion() {\n return this.getVariant() === \"VAR_10\" ? this.bytes[6] >>> 4 : undefined;\n }\n /** Creates an object from `this`. */\n clone() {\n return new UUID(this.bytes.slice(0));\n }\n /** Returns true if `this` is equivalent to `other`. */\n equals(other) {\n return this.compareTo(other) === 0;\n }\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other) {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i];\n if (diff !== 0) {\n return Math.sign(diff);\n }\n }\n return 0;\n }\n}\n/**\n * Encapsulates the monotonic counter state.\n *\n * This class provides APIs to utilize a separate counter state from that of the\n * global generator used by {@link uuidv7} and {@link uuidv7obj}. In addition to\n * the default {@link generate} method, this class has {@link generateOrAbort}\n * that is useful to absolutely guarantee the monotonically increasing order of\n * generated UUIDs. See their respective documentation for details.\n */\nexport class V7Generator {\n /**\n * Creates a generator object with the default random number generator, or\n * with the specified one if passed as an argument. The specified random\n * number generator should be cryptographically strong and securely seeded.\n */\n constructor(randomNumberGenerator) {\n this.timestamp = 0;\n this.counter = 0;\n this.random = randomNumberGenerator !== null && randomNumberGenerator !== void 0 ? randomNumberGenerator : getDefaultRandom();\n }\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns a monotonically increasing UUID by reusing the previous\n * timestamp even if the up-to-date timestamp is smaller than the immediately\n * preceding UUID's. However, when such a clock rollback is considered\n * significant (i.e., by more than ten seconds), this method resets the\n * generator and returns a new UUID based on the given timestamp, breaking the\n * increasing order of UUIDs.\n *\n * See {@link generateOrAbort} for the other mode of generation and\n * {@link generateOrResetCore} for the low-level primitive.\n */\n generate() {\n return this.generateOrResetCore(Date.now(), 10000);\n }\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns a monotonically increasing UUID by reusing the previous\n * timestamp even if the up-to-date timestamp is smaller than the immediately\n * preceding UUID's. However, when such a clock rollback is considered\n * significant (i.e., by more than ten seconds), this method aborts and\n * returns `undefined` immediately.\n *\n * See {@link generate} for the other mode of generation and\n * {@link generateOrAbortCore} for the low-level primitive.\n */\n generateOrAbort() {\n return this.generateOrAbortCore(Date.now(), 10000);\n }\n /**\n * Generates a new UUIDv7 object from the `unixTsMs` passed, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method is equivalent to {@link generate} except that it takes a custom\n * timestamp and clock rollback allowance.\n *\n * @param rollbackAllowance - The amount of `unixTsMs` rollback that is\n * considered significant. A suggested value is `10_000` (milliseconds).\n * @throws RangeError if `unixTsMs` is not a 48-bit positive integer.\n */\n generateOrResetCore(unixTsMs, rollbackAllowance) {\n let value = this.generateOrAbortCore(unixTsMs, rollbackAllowance);\n if (value === undefined) {\n // reset state and resume\n this.timestamp = 0;\n value = this.generateOrAbortCore(unixTsMs, rollbackAllowance);\n }\n return value;\n }\n /**\n * Generates a new UUIDv7 object from the `unixTsMs` passed, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method is equivalent to {@link generateOrAbort} except that it takes a\n * custom timestamp and clock rollback allowance.\n *\n * @param rollbackAllowance - The amount of `unixTsMs` rollback that is\n * considered significant. A suggested value is `10_000` (milliseconds).\n * @throws RangeError if `unixTsMs` is not a 48-bit positive integer.\n */\n generateOrAbortCore(unixTsMs, rollbackAllowance) {\n const MAX_COUNTER = 4398046511103;\n if (!Number.isInteger(unixTsMs) ||\n unixTsMs < 0 ||\n unixTsMs > 281474976710655) {\n throw new RangeError(`\\`unixTsMs\\` must be a 48-bit positive integer, got ${unixTsMs}`);\n }\n else if (rollbackAllowance < 0 || rollbackAllowance > 281474976710655) {\n throw new RangeError(`\\`rollbackAllowance\\` out of reasonable range, got ${rollbackAllowance}`);\n }\n if (unixTsMs > this.timestamp) {\n this.timestamp = unixTsMs;\n this.resetCounter();\n }\n else if (unixTsMs + rollbackAllowance >= this.timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this.counter++;\n if (this.counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this.timestamp++;\n this.resetCounter();\n }\n }\n else {\n // abort if clock went backwards to unbearable extent\n return undefined;\n }\n return UUID.fromFieldsV7(this.timestamp, Math.trunc(this.counter / 2 ** 30), this.counter & (2 ** 30 - 1), this.random.nextUint32());\n }\n /** Initializes the counter at a 42-bit random integer. */\n resetCounter() {\n this.counter =\n this.random.nextUint32() * 0x400 + (this.random.nextUint32() & 0x3ff);\n }\n /**\n * Generates a new UUIDv4 object utilizing the random number generator inside.\n *\n * @internal\n */\n generateV4() {\n const bytes = new Uint8Array(Uint32Array.of(this.random.nextUint32(), this.random.nextUint32(), this.random.nextUint32(), this.random.nextUint32()).buffer);\n bytes[6] = 0x40 | (bytes[6] >>> 4);\n bytes[8] = 0x80 | (bytes[8] >>> 2);\n return UUID.ofInner(bytes);\n }\n}\n/** Returns the default random number generator available in the environment. */\nconst getDefaultRandom = () => {\n // detect Web Crypto API\n if (typeof crypto !== \"undefined\" &&\n typeof crypto.getRandomValues !== \"undefined\") {\n return new BufferedCryptoRandom();\n }\n else {\n // fall back on Math.random() unless the flag is set to true\n if (typeof UUIDV7_DENY_WEAK_RNG !== \"undefined\" && UUIDV7_DENY_WEAK_RNG) {\n throw new Error(\"no cryptographically strong RNG available\");\n }\n return {\n nextUint32: () => Math.trunc(Math.random() * 65536) * 65536 +\n Math.trunc(Math.random() * 65536),\n };\n }\n};\n/**\n * Wraps `crypto.getRandomValues()` to enable buffering; this uses a small\n * buffer by default to avoid both unbearable throughput decline in some\n * environments and the waste of time and space for unused values.\n */\nclass BufferedCryptoRandom {\n constructor() {\n this.buffer = new Uint32Array(8);\n this.cursor = 0xffff;\n }\n nextUint32() {\n if (this.cursor >= this.buffer.length) {\n crypto.getRandomValues(this.buffer);\n this.cursor = 0;\n }\n return this.buffer[this.cursor++];\n }\n}\nlet defaultGenerator;\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = () => uuidv7obj().toString();\n/** Generates a UUIDv7 object. */\nexport const uuidv7obj = () => (defaultGenerator || (defaultGenerator = new V7Generator())).generate();\n/**\n * Generates a UUIDv4 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv4 = () => uuidv4obj().toString();\n/** Generates a UUIDv4 object. */\nexport const uuidv4obj = () => (defaultGenerator || (defaultGenerator = new V7Generator())).generateV4();\n","import {Database, DatabaseLogger, EntityIdRef, ROW_ID_ATTR, asyncInteractionContext, InteractionContext, dbConsoleLogger, TransactionCapability, defaultEncodeLiteral} from \"interaqt\";\nimport { PGlite} from '@electric-sql/pglite'\nimport { uuidv7 } from \"@interaqt/uuidv7\";\n\nclass IDSystem {\n constructor(public db: Database) {}\n setup() {\n return this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name TEXT)`)\n }\n async getAutoId(recordName: string) {\n return uuidv7()\n }\n}\n\nexport type PGLiteDBConfig = { logger? :DatabaseLogger }\n\nexport class PGLiteDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db: InstanceType<typeof PGlite>\n supportsSelectForUpdate = true\n // PostgreSQL wire protocol 的绑定参数数量是 Int16(65535);留出安全余量。\n maxQueryParams = 65000\n transactionCapability: TransactionCapability = {\n transactions: true,\n isolationLevels: ['READ COMMITTED', 'SERIALIZABLE'],\n transactionBoundConnection: false,\n concurrentTransactions: 'unsupported',\n nestedStrategy: 'reuse',\n notes: [\n 'PGLite uses MonoStorage fallback BEGIN/COMMIT; SERIALIZABLE is framework metadata for retry-path tests, not a production PostgreSQL isolation guarantee.'\n ],\n }\n atomicSequenceCapability = {\n requiresActiveTransaction: true as const,\n transactional: true,\n crossConnection: false,\n crossProcess: false,\n returning: true,\n productionSafe: false,\n }\n schemaDialect = {\n name: 'postgres' as const,\n maxIdentifierLength: 63,\n supportsCreateIndexIfNotExists: true,\n encodeLiteral: defaultEncodeLiteral,\n constraints: { unique: true, filteredUnique: true, nonNull: true },\n }\n constructor(public database?:string, public options: PGLiteDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n this.db = new PGlite(this.database)\n }\n async open(forceDrop = false) {\n // PGLite doesn't support CREATE/DROP DATABASE commands\n // When forceDrop is true, we'll drop all existing tables instead\n \n if (forceDrop) {\n // Get all table names except system tables\n const tables = await this.db.query<{tablename: string}>(`\n SELECT tablename FROM pg_tables \n WHERE schemaname = 'public' \n AND tablename NOT LIKE 'pg_%'\n AND tablename NOT LIKE 'sql_%'\n `)\n \n // Drop each table\n for (const table of tables.rows) {\n await this.db.query(`DROP TABLE IF EXISTS \"${table.tablename}\" CASCADE`)\n }\n }\n\n await this.idSystem.setup()\n }\n async openForSchemaRead() {\n // PGLite is constructed with an open in-memory database. Avoid the\n // normal open() path here because it initializes framework tables.\n }\n async setupInternalComputationState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ComputationState_\" (\n \"key\" TEXT PRIMARY KEY,\n \"numberValue\" NUMERIC NULL,\n \"booleanValue\" BOOLEAN NULL,\n \"stringValue\" TEXT NULL,\n \"jsonValue\" JSON NULL\n)`, 'setup computation state table')\n }\n async setupScopedSequenceState() {\n await this.scheme(`\nCREATE TABLE IF NOT EXISTS \"_ScopedSequence_\" (\n \"sequenceName\" TEXT NOT NULL,\n \"scopeKey\" TEXT NOT NULL,\n \"scope\" JSONB NOT NULL,\n \"lastValue\" NUMERIC NOT NULL,\n PRIMARY KEY (\"sequenceName\", \"scopeKey\")\n)`, 'setup scoped sequence table')\n }\n async query<T>(sql:string, params: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n try {\n return (await this.db.query(sql, params)).rows as T[]\n } catch (error: unknown) {\n logger.error({\n type:'query',\n name,\n sql,\n params,\n error: error instanceof Error ? error.message : String(error)\n })\n throw error\n }\n }\n async update<T>(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const finalSQL = `${sql} ${idField ? `RETURNING \"${idField}\" AS id`: ''}`\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'update',\n name,\n sql:finalSQL,\n params\n })\n return (await this.db.query(finalSQL, params)).rows as T[]\n \n }\n async insert(sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x\n })\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n const finalSQL = `${sql} RETURNING \"${ROW_ID_ATTR}\"`\n try {\n return (await this.db.query(finalSQL, params)).rows[0] as EntityIdRef\n } catch (error: unknown) {\n logger.error({\n type:'insert',\n name,\n sql: finalSQL,\n params,\n error: error instanceof Error ? error.message : String(error)\n })\n throw error\n }\n }\n async delete<T> (sql:string, params: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params)).rows as T[]\n \n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n try {\n return await this.db.query(sql)\n } catch (error: unknown) {\n logger.error({\n type:'scheme',\n name,\n sql,\n error: error instanceof Error ? error.message : String(error)\n })\n throw error\n }\n }\n close() {\n return this.db.close()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType.toLowerCase() === 'json') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${p()} = ANY (SELECT json_array_elements_text(${fieldNameWithQuotes}))`,\n fieldParams: [value[1]]\n }\n }\n // json 类型没有 = / != 操作符(\"operator does not exist: json = unknown\"),\n // 转成 jsonb 做语义相等比较(对键序不敏感)。NULL 行不参与匹配,与标量列的 =/!= 语义一致。\n if (value[0] === '=' || value[0] === '!=') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes}::jsonb ${value[0]} ${p()}::jsonb`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n // IN / NOT IN 与 =/!= 同理:逐元素做 jsonb 语义比较。NULL 行不参与匹配。\n const lowerOp = value[0].toLowerCase()\n if ((lowerOp === 'in' || lowerOp === 'not in') && Array.isArray(value[1]) && value[1].length > 0) {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n const placeholders = (value[1] as unknown[]).map(() => `${p()}::jsonb`).join(',')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes}::jsonb ${lowerOp === 'in' ? 'IN' : 'NOT IN'} (${placeholders})`,\n fieldParams: (value[1] as unknown[]).map(item => JSON.stringify(item))\n }\n }\n }\n }\n\n getPlaceholder() {\n let index = 0\n return () => {\n index++\n return `$${index}`\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'SERIAL PRIMARY KEY'\n } else if (type === 'id') {\n return 'UUID'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'BOOL'\n } else if(type === 'number'){\n // CAUTION JS 的 number 是双精度浮点。映射成 INT 会让合法的小数值\n // (例如内置 Average 计算的结果 sum/count)在写入时直接报错。\n return \"DOUBLE PRECISION\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}","import {Database, DatabaseLogger, EntityIdRef, asyncInteractionContext, InteractionContext, dbConsoleLogger, TransactionCapability, defaultEncodeLiteral} from \"interaqt\";\nimport mysql, {type Connection, type ConnectionOptions, RowDataPacket} from 'mysql2/promise'\n\nclass IDSystem {\n constructor(public db: Database) {}\n async setup() {\n // name 必须有唯一约束(原子 UPSERT 依赖它);MySQL 的 TEXT 不能做主键,用定长 VARCHAR。\n await this.db.scheme(`CREATE Table IF NOT EXISTS \"_IDS_\" (last INTEGER, name VARCHAR(191), PRIMARY KEY (name))`)\n // 兼容旧版建出的无约束 _IDS_ 表:检测到缺主键时补齐。\n const primaryKey = await this.db.query<{ cnt: number }>(\n `SELECT COUNT(1) AS cnt FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = '_IDS_' AND index_name = 'PRIMARY'`,\n [],\n 'check _IDS_ primary key'\n )\n if (!primaryKey[0]?.cnt) {\n await this.db.scheme(`ALTER TABLE \"_IDS_\" MODIFY name VARCHAR(191), ADD PRIMARY KEY (name)`)\n }\n }\n // CAUTION LAST_INSERT_ID() 是会话级的,而「UPSERT + SELECT」是两条语句:同一连接上并发的\n // getAutoId 交错执行会让两次 SELECT 读到同一个值(实测复现)。用本地分配链把两条语句\n // 串成不可交错的对;跨连接/跨进程由 UPSERT 的原子性 + 会话隔离保证。\n private allocating: Promise<unknown> = Promise.resolve()\n async getAutoId(recordName: string) {\n const allocation = this.allocating.then(async () => {\n // 原子 UPSERT:此前的「SELECT 再 INSERT/UPDATE」读-改-写在并发下会分配重复 id;\n // recordName 一律走参数绑定。LAST_INSERT_ID(expr) 是 MySQL 的会话级取值惯用法:\n // 插入分支把会话值置为 1,冲突分支置为 last+1。\n await this.db.update(\n `INSERT INTO \"_IDS_\" (name, last) VALUES (?, LAST_INSERT_ID(1))\nON DUPLICATE KEY UPDATE last = LAST_INSERT_ID(last + 1)`,\n [recordName],\n undefined,\n `allocate next id for ${recordName}`\n )\n const rows = await this.db.query<{ id: number }>(`SELECT LAST_INSERT_ID() AS id`, [], `read allocated id for ${recordName}`)\n return rows[0].id as unknown as string\n })\n this.allocating = allocation.catch(() => {})\n return allocation\n }\n}\n\nexport type MysqlDBConfig = Omit<ConnectionOptions, 'database'> & { logger? :DatabaseLogger }\n\nexport class MysqlDB implements Database{\n idSystem!: IDSystem\n logger: DatabaseLogger\n db!: Connection\n // MySQL 8.0+ 支持 SELECT ... FOR UPDATE OF <alias>\n supportsSelectForUpdate = true\n // MySQL prepared statement 的占位符数量上限为 65535;留出安全余量。\n maxQueryParams = 65000\n transactionCapability: TransactionCapability = {\n transactions: false,\n isolationLevels: [],\n transactionBoundConnection: false,\n concurrentTransactions: 'unsupported',\n nestedStrategy: 'unsupported',\n notes: [\n 'The current MySQL driver has no transaction-bound connection implementation; strong dispatch transactions are unsupported.'\n ],\n }\n schemaDialect = {\n name: 'mysql' as const,\n maxIdentifierLength: 64,\n supportsCreateIndexIfNotExists: false,\n encodeLiteral: defaultEncodeLiteral,\n constraints: { unique: false, filteredUnique: false, nonNull: false },\n }\n constructor(public database:string, public options: MysqlDBConfig = {}) {\n this.idSystem = new IDSystem(this)\n this.logger = this.options?.logger || dbConsoleLogger\n }\n async open(forceDrop = false) {\n // 第一条连接不带默认库,仅用于检查/创建目标库;用完必须关闭(否则每次 open 泄漏一条连接)。\n const bootstrapConnection = await mysql.createConnection({\n ...this.options,\n })\n await bootstrapConnection.connect()\n try {\n // CAUTION 库名不能字符串拼接进 SQL:LIKE 走参数绑定,标识符用反引号转义\n // (bootstrap 连接尚未 SET ANSI_QUOTES,双引号不可用)。\n const quotedDatabase = `\\`${this.database.replace(/`/g, '``')}\\``\n const [rows] = await bootstrapConnection.query(`SHOW DATABASES LIKE ?`, [this.database])\n if ((rows as RowDataPacket[]).length === 0) {\n await bootstrapConnection.query(`CREATE DATABASE ${quotedDatabase}`)\n } else if (forceDrop) {\n await bootstrapConnection.query(`DROP DATABASE ${quotedDatabase}`)\n await bootstrapConnection.query(`CREATE DATABASE ${quotedDatabase}`)\n }\n } finally {\n await bootstrapConnection.end()\n }\n\n // CAUTION 无论目标库是已有还是刚创建,工作连接都必须显式带上 database,\n // 否则后续 scheme/query 跑在没有默认库的连接上,首次建库启动即失败。\n this.db = await mysql.createConnection({\n ...this.options,\n database: this.database\n })\n await this.db.connect()\n await this.db.query(`SET sql_mode='ANSI_QUOTES'`)\n\n await this.idSystem.setup()\n\n }\n async openForSchemaRead() {\n if (this.db) return\n // Strict dry-run schema planning should not create databases or\n // initialize framework tables such as _IDS_.\n this.db = await mysql.createConnection({\n ...this.options,\n database: this.database\n })\n await this.db.connect()\n await this.db.query(`SET sql_mode='ANSI_QUOTES'`)\n }\n async query<T>(sql:string, where: unknown[] =[], name= '') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'query',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async update<T>(sql:string,values: unknown[], idField?:string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n // CAUTION MySQL 不支持 UPDATE ... RETURNING,无法履行 idField 返回契约。\n // 这里如实记录并执行原始 SQL;调用方(storage 层)不依赖 update 的返回行。\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n logger.info({\n type:'update',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async insert(sql:string, values:unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = values.map(x => {\n return (typeof x === 'object' && x !==null) ? JSON.stringify(x) : x===false ? 0 : x===true ? 1 : x\n })\n\n logger.info({\n type:'insert',\n name,\n sql,\n params\n })\n\n await this.db.query(sql, params)\n const [rows] = (await this.db.query(`SELECT LAST_INSERT_ID();`))\n const insertedId = (rows as RowDataPacket[])[0]['LAST_INSERT_ID()']\n return {id: insertedId} as EntityIdRef\n }\n async delete<T> (sql:string, where: unknown[], name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n const params = where.map(x => x===false ? 0 : x===true ? 1 : x)\n logger.info({\n type:'delete',\n name,\n sql,\n params\n })\n return (await this.db.query(sql, params))[0] as T[]\n }\n async scheme(sql: string, name='') {\n const context= asyncInteractionContext.getStore() as InteractionContext\n const logger = this.logger.child(context?.logContext || {})\n logger.info({\n type:'scheme',\n name,\n sql,\n })\n return await this.db.query(sql)\n }\n close() {\n return this.db.end()\n }\n async getAutoId(recordName: string) {\n return this.idSystem.getAutoId(recordName)\n }\n parseMatchExpression(key: string, value:[string, string], fieldName: string, fieldType: string, isReferenceValue: boolean, getReferenceFieldValue: (v: string) => string, p: () => string) {\n if (fieldType === 'JSON') {\n if (value[0].toLowerCase() === 'contains') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n // CAUTION 匹配值必须走参数绑定,不能字符串拼接进 SQL(否则存在 SQL 注入)。\n return {\n fieldValue: `IS NOT NULL AND JSON_CONTAINS(${fieldNameWithQuotes}, ${p()}, '$')`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n // JSON 列与字符串参数直接比较会按类型序比较(恒不等)。CAST 成 JSON 做语义相等比较。\n // NULL 行不参与匹配,与标量列的 =/!= 语义一致。\n if (value[0] === '=' || value[0] === '!=') {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes} ${value[0]} CAST(${p()} AS JSON)`,\n fieldParams: [JSON.stringify(value[1])]\n }\n }\n // IN / NOT IN 与 =/!= 同理:逐元素 CAST 成 JSON 做语义比较。NULL 行不参与匹配。\n const lowerOp = value[0].toLowerCase()\n if ((lowerOp === 'in' || lowerOp === 'not in') && Array.isArray(value[1]) && value[1].length > 0) {\n const fieldNameWithQuotes = fieldName.split('.').map(x => `\"${x}\"`).join('.')\n const placeholders = (value[1] as unknown[]).map(() => `CAST(${p()} AS JSON)`).join(',')\n return {\n fieldValue: `IS NOT NULL AND ${fieldNameWithQuotes} ${lowerOp === 'in' ? 'IN' : 'NOT IN'} (${placeholders})`,\n fieldParams: (value[1] as unknown[]).map(item => JSON.stringify(item))\n }\n }\n }\n }\n\n getPlaceholder() {\n return () => {\n return '?'\n }\n }\n mapToDBFieldType(type: string, collection?: boolean) {\n if (type === 'pk') {\n return 'INT AUTO_INCREMENT PRIMARY KEY'\n } else if (type === 'id') {\n return 'INT'\n } else if (collection || type === 'object') {\n return 'JSON'\n } else if (type === 'string') {\n return 'TEXT'\n } else if (type === 'boolean') {\n return 'INT(2)'\n } else if(type === 'number'){\n // CAUTION JS 的 number 是双精度浮点。映射成 INT 会让合法的小数值\n // (例如内置 Average 计算的结果 sum/count)在写入时直接报错。\n return \"DOUBLE\"\n }else if(type === 'timestamp'){\n return \"TIMESTAMP\"\n }else{\n return type\n }\n }\n}"],"names":["IDSystem$3","db","recordName","SQLiteDB","file","options","sqliteEncodeLiteral","IDSystem","dbConsoleLogger","SQLite","sql","where","name","context","asyncInteractionContext","logger","params","x","values","idField","finalSQL","ROW_ID_ATTR","key","value","fieldName","fieldType","isReferenceValue","getReferenceFieldValue","p","type","collection","Client","Pool","pg","IDSystem$2","displayName","createHash","identifier","records","idsTableExists","sequenceMax","record","sequenceName","quotedSequence","tableRows","legacyMax","legacyRows","maxExistingId","PostgreSQLDB","database","AsyncLocalStorage","defaultEncodeLiteral","forceDrop","adminClient","pool","error","fn","existing","RequireSerializableRetry","isolation","client","released","result","fieldNameWithQuotes","lowerOp","placeholders","item","index","DIGITS","UUID","bytes","unixTsMs","randA","randBHi","randBLo","uuid","_a","_b","_c","_d","hex","inner","n","text","i","e","other","diff","V7Generator","randomNumberGenerator","getDefaultRandom","rollbackAllowance","BufferedCryptoRandom","defaultGenerator","uuidv7","uuidv7obj","IDSystem$1","PGLiteDB","PGlite","tables","table","allocation","MysqlDB","bootstrapConnection","mysql","quotedDatabase","rows"],"mappings":"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","x_google_ignoreList":[2]}