@kyneta/prisma-store 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#client","#seqNos","#metaModelName","#recordModelName","#meta","#records","#txModels"],"sources":["../src/index.ts"],"sourcesContent":["// Prisma-based Store backend.\n//\n// Why `unknown`-typed client: capturing Prisma's generic typed\n// accessors without a hard dep on `@prisma/client` types is brittle,\n// and depending on them pins this package to one Prisma major. The\n// trade is less compile-time safety inside this package (one cast to\n// the structural interfaces below) for version portability across\n// Prisma releases. Caller's call site stays fully typed.\n\nimport {\n type DocId,\n SeqNoTracker,\n type Store,\n type StoreMeta,\n type StoreRecord,\n} from \"@kyneta/exchange\"\nimport {\n fromRow,\n planAppend,\n planReplace,\n type RowShape,\n} from \"@kyneta/sql-store-core\"\n\n// ---------------------------------------------------------------------------\n// Internal structural types — narrow shapes for the Prisma methods we use\n// ---------------------------------------------------------------------------\n\ninterface MetaRow {\n docId: string\n data: unknown\n}\n\ninterface RecordRow {\n docId: string\n seq: number\n kind: string\n payload: string | null\n blob: Uint8Array | null\n}\n\ninterface MetaModel {\n findUnique(args: { where: { docId: string } }): Promise<MetaRow | null>\n findMany(args: {\n where?: { docId?: { gte?: string; lt?: string } }\n select: { docId: true }\n }): Promise<Array<{ docId: string }>>\n upsert(args: {\n where: { docId: string }\n create: { docId: string; data: unknown }\n update: { data: unknown }\n }): Promise<MetaRow>\n delete(args: { where: { docId: string } }): Promise<unknown>\n deleteMany(args: { where: { docId: string } }): Promise<unknown>\n}\n\ninterface RecordModel {\n findMany(args: {\n where: { docId: string }\n orderBy: { seq: \"asc\" }\n }): Promise<RecordRow[]>\n create(args: { data: RecordRow }): Promise<unknown>\n deleteMany(args: { where: { docId: string } }): Promise<unknown>\n aggregate(args: {\n where: { docId: string }\n _max: { seq: true }\n }): Promise<{ _max: { seq: number | null } }>\n}\n\ninterface PrismaClientLike {\n $transaction<R>(fn: (tx: PrismaTransactionLike) => Promise<R>): Promise<R>\n}\n\n/**\n * Real Prisma's `tx` exposes the same model accessors as the client.\n * Indexed by string so caller-chosen model names (via `metaModel` /\n * `recordModel` options) resolve through the same lookup path.\n */\ninterface PrismaTransactionLike {\n readonly [k: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface PrismaStoreOptions {\n /** The PrismaClient. Pass `prisma` directly. */\n client: unknown\n\n /** Property name on the client. Default matches `model KynetaMeta`. */\n metaModel?: string\n\n /** Property name on the client. Default matches `model KynetaRecord`. */\n recordModel?: string\n}\n\n// ---------------------------------------------------------------------------\n// PrismaStore\n// ---------------------------------------------------------------------------\n\nexport class PrismaStore implements Store {\n readonly #client: PrismaClientLike\n readonly #seqNos = new SeqNoTracker()\n readonly #metaModelName: string\n readonly #recordModelName: string\n\n constructor(options: PrismaStoreOptions) {\n this.#client = options.client as PrismaClientLike\n this.#metaModelName = options.metaModel ?? \"kynetaMeta\"\n this.#recordModelName = options.recordModel ?? \"kynetaRecord\"\n }\n\n get #meta(): MetaModel {\n return (this.#client as unknown as Record<string, unknown>)[\n this.#metaModelName\n ] as MetaModel\n }\n\n get #records(): RecordModel {\n return (this.#client as unknown as Record<string, unknown>)[\n this.#recordModelName\n ] as RecordModel\n }\n\n #txModels(tx: PrismaTransactionLike): {\n meta: MetaModel\n records: RecordModel\n } {\n return {\n meta: tx[this.#metaModelName] as MetaModel,\n records: tx[this.#recordModelName] as RecordModel,\n }\n }\n\n // -------------------------------------------------------------------------\n // Store interface\n // -------------------------------------------------------------------------\n\n async append(docId: DocId, record: StoreRecord): Promise<void> {\n const existingMeta = await this.currentMeta(docId)\n const seq = await this.#seqNos.next(docId, async () => {\n const result = await this.#records.aggregate({\n where: { docId },\n _max: { seq: true },\n })\n return result._max.seq ?? null\n })\n\n const plan = planAppend(docId, record, existingMeta, seq)\n\n await this.#client.$transaction(async tx => {\n const { meta, records } = this.#txModels(tx)\n\n if (plan.upsertMeta !== null) {\n const dataValue = JSON.parse(plan.upsertMeta.data) as unknown\n await meta.upsert({\n where: { docId },\n create: { docId, data: dataValue },\n update: { data: dataValue },\n })\n }\n\n const { row } = plan.insertRecord\n await records.create({\n data: {\n docId,\n seq: plan.insertRecord.seq,\n kind: row.kind,\n payload: row.payload,\n blob: row.blob,\n },\n })\n })\n }\n\n async *loadAll(docId: DocId): AsyncIterable<StoreRecord> {\n const rows = await this.#records.findMany({\n where: { docId },\n orderBy: { seq: \"asc\" },\n })\n for (const r of rows) {\n const row: RowShape = {\n kind: r.kind === \"meta\" ? \"meta\" : \"entry\",\n payload: r.payload as string,\n blob: r.blob ?? null,\n }\n yield fromRow(row)\n }\n }\n\n async replace(docId: DocId, records: StoreRecord[]): Promise<void> {\n const existingMeta = await this.currentMeta(docId)\n const plan = planReplace(records, existingMeta)\n\n await this.#client.$transaction(async tx => {\n const { meta, records: recordsModel } = this.#txModels(tx)\n\n await recordsModel.deleteMany({ where: { docId } })\n\n for (const { seq, row } of plan.records) {\n await recordsModel.create({\n data: {\n docId,\n seq,\n kind: row.kind,\n payload: row.payload,\n blob: row.blob,\n },\n })\n }\n\n const dataValue = JSON.parse(plan.upsertMeta.data) as unknown\n await meta.upsert({\n where: { docId },\n create: { docId, data: dataValue },\n update: { data: dataValue },\n })\n })\n\n // Must run after commit. A `$transaction` rejection (failed COMMIT\n // or callback throw) propagates past this line; cache stays\n // unmutated. Inside the callback would corrupt it on rollback.\n this.#seqNos.reset(docId, records.length - 1)\n }\n\n async delete(docId: DocId): Promise<void> {\n await this.#client.$transaction(async tx => {\n const { meta, records } = this.#txModels(tx)\n await records.deleteMany({ where: { docId } })\n await meta.deleteMany({ where: { docId } })\n })\n this.#seqNos.remove(docId)\n }\n\n async currentMeta(docId: DocId): Promise<StoreMeta | null> {\n const row = await this.#meta.findUnique({ where: { docId } })\n if (row === null) return null\n return parseMetaData(row.data) as StoreMeta\n }\n\n async *listDocIds(prefix?: string): AsyncIterable<DocId> {\n if (prefix === undefined) {\n const rows = await this.#meta.findMany({ select: { docId: true } })\n for (const r of rows) yield r.docId\n return\n }\n\n const upper = prefixUpperBound(prefix)\n const rows = await this.#meta.findMany({\n where: {\n docId: upper === null ? { gte: prefix } : { gte: prefix, lt: upper },\n },\n select: { docId: true },\n })\n for (const r of rows) yield r.docId\n }\n\n async close(): Promise<void> {\n // Caller owns the lifecycle (`prisma.$disconnect()`).\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Prisma's `Json` field arrives parsed on Postgres/MySQL but as a raw\n * string on SQLite — the only place where the underlying database\n * type leaks through Prisma's abstraction.\n */\nfunction parseMetaData(value: unknown): unknown {\n if (typeof value === \"string\") return JSON.parse(value)\n return value\n}\n\nfunction prefixUpperBound(prefix: string): string | null {\n if (prefix.length === 0) return null\n const codes = Array.from(prefix)\n for (let i = codes.length - 1; i >= 0; i--) {\n const ch = codes[i] as string\n const code = ch.codePointAt(0) as number\n if (code < 0x10ffff) {\n const next = String.fromCodePoint(code + 1)\n return codes.slice(0, i).join(\"\") + next\n }\n }\n return null\n}\n\n/**\n * Async only for ergonomic parity with `createPostgresStore` — does\n * no schema validation. Prisma's typed accessors enforce model presence\n * at compile time; runtime failures surface on first call.\n */\nexport async function createPrismaStore(\n options: PrismaStoreOptions,\n): Promise<Store> {\n return new PrismaStore(options)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#client","#seqNos","#metaModelName","#recordModelName","#meta","#records","#txModels"],"sources":["../src/index.ts"],"sourcesContent":["// Prisma-based Store backend.\n//\n// Why `unknown`-typed client: capturing Prisma's generic typed\n// accessors without a hard dep on `@prisma/client` types is brittle,\n// and depending on them pins this package to one Prisma major. The\n// trade is less compile-time safety inside this package (one cast to\n// the structural interfaces below) for version portability across\n// Prisma releases. Caller's call site stays fully typed.\n\nimport {\n type DocId,\n SeqNoTracker,\n type Store,\n type StoreMeta,\n type StoreRecord,\n} from \"@kyneta/exchange\"\nimport {\n fromRow,\n planAppend,\n planReplace,\n type RowShape,\n} from \"@kyneta/sql-store-core\"\n\n// ---------------------------------------------------------------------------\n// Internal structural types — narrow shapes for the Prisma methods we use\n// ---------------------------------------------------------------------------\n\ninterface MetaRow {\n docId: string\n data: unknown\n}\n\ninterface RecordRow {\n docId: string\n seq: number\n kind: string\n payload: string | null\n blob: Uint8Array | null\n}\n\ninterface MetaModel {\n findUnique(args: { where: { docId: string } }): Promise<MetaRow | null>\n findMany(args: {\n where?: { docId?: { gte?: string; lt?: string } }\n select: { docId: true }\n }): Promise<Array<{ docId: string }>>\n upsert(args: {\n where: { docId: string }\n create: { docId: string; data: unknown }\n update: { data: unknown }\n }): Promise<MetaRow>\n delete(args: { where: { docId: string } }): Promise<unknown>\n deleteMany(args: { where: { docId: string } }): Promise<unknown>\n}\n\ninterface RecordModel {\n findMany(args: {\n where: { docId: string }\n orderBy: { seq: \"asc\" }\n }): Promise<RecordRow[]>\n create(args: { data: RecordRow }): Promise<unknown>\n deleteMany(args: { where: { docId: string } }): Promise<unknown>\n aggregate(args: {\n where: { docId: string }\n _max: { seq: true }\n }): Promise<{ _max: { seq: number | null } }>\n}\n\ninterface PrismaClientLike {\n $transaction<R>(fn: (tx: PrismaTransactionLike) => Promise<R>): Promise<R>\n}\n\n/**\n * Real Prisma's `tx` exposes the same model accessors as the client.\n * Indexed by string so caller-chosen model names (via `metaModel` /\n * `recordModel` options) resolve through the same lookup path.\n */\ninterface PrismaTransactionLike {\n readonly [k: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface PrismaStoreOptions {\n /** The PrismaClient. Pass `prisma` directly. */\n client: unknown\n\n /** Property name on the client. Default matches `model KynetaMeta`. */\n metaModel?: string\n\n /** Property name on the client. Default matches `model KynetaRecord`. */\n recordModel?: string\n}\n\n// ---------------------------------------------------------------------------\n// PrismaStore\n// ---------------------------------------------------------------------------\n\nexport class PrismaStore implements Store {\n readonly #client: PrismaClientLike\n readonly #seqNos = new SeqNoTracker()\n readonly #metaModelName: string\n readonly #recordModelName: string\n\n constructor(options: PrismaStoreOptions) {\n this.#client = options.client as PrismaClientLike\n this.#metaModelName = options.metaModel ?? \"kynetaMeta\"\n this.#recordModelName = options.recordModel ?? \"kynetaRecord\"\n }\n\n get #meta(): MetaModel {\n return (this.#client as unknown as Record<string, unknown>)[\n this.#metaModelName\n ] as MetaModel\n }\n\n get #records(): RecordModel {\n return (this.#client as unknown as Record<string, unknown>)[\n this.#recordModelName\n ] as RecordModel\n }\n\n #txModels(tx: PrismaTransactionLike): {\n meta: MetaModel\n records: RecordModel\n } {\n return {\n meta: tx[this.#metaModelName] as MetaModel,\n records: tx[this.#recordModelName] as RecordModel,\n }\n }\n\n // -------------------------------------------------------------------------\n // Store interface\n // -------------------------------------------------------------------------\n\n async append(docId: DocId, record: StoreRecord): Promise<void> {\n const existingMeta = await this.currentMeta(docId)\n const seq = await this.#seqNos.next(docId, async () => {\n const result = await this.#records.aggregate({\n where: { docId },\n _max: { seq: true },\n })\n return result._max.seq ?? null\n })\n\n const plan = planAppend(docId, record, existingMeta, seq)\n\n await this.#client.$transaction(async tx => {\n const { meta, records } = this.#txModels(tx)\n\n if (plan.upsertMeta !== null) {\n const dataValue = JSON.parse(plan.upsertMeta.data) as unknown\n await meta.upsert({\n where: { docId },\n create: { docId, data: dataValue },\n update: { data: dataValue },\n })\n }\n\n const { row } = plan.insertRecord\n await records.create({\n data: {\n docId,\n seq: plan.insertRecord.seq,\n kind: row.kind,\n payload: row.payload,\n blob: row.blob,\n },\n })\n })\n }\n\n async *loadAll(docId: DocId): AsyncIterable<StoreRecord> {\n const rows = await this.#records.findMany({\n where: { docId },\n orderBy: { seq: \"asc\" },\n })\n for (const r of rows) {\n const row: RowShape = {\n kind: r.kind === \"meta\" ? \"meta\" : \"entry\",\n payload: r.payload as string,\n blob: r.blob ?? null,\n }\n yield fromRow(row)\n }\n }\n\n async replace(docId: DocId, records: StoreRecord[]): Promise<void> {\n const existingMeta = await this.currentMeta(docId)\n const plan = planReplace(records, existingMeta)\n\n await this.#client.$transaction(async tx => {\n const { meta, records: recordsModel } = this.#txModels(tx)\n\n await recordsModel.deleteMany({ where: { docId } })\n\n for (const { seq, row } of plan.records) {\n await recordsModel.create({\n data: {\n docId,\n seq,\n kind: row.kind,\n payload: row.payload,\n blob: row.blob,\n },\n })\n }\n\n const dataValue = JSON.parse(plan.upsertMeta.data) as unknown\n await meta.upsert({\n where: { docId },\n create: { docId, data: dataValue },\n update: { data: dataValue },\n })\n })\n\n // Must run after commit. A `$transaction` rejection (failed COMMIT\n // or callback throw) propagates past this line; cache stays\n // unmutated. Inside the callback would corrupt it on rollback.\n this.#seqNos.reset(docId, records.length - 1)\n }\n\n async delete(docId: DocId): Promise<void> {\n await this.#client.$transaction(async tx => {\n const { meta, records } = this.#txModels(tx)\n await records.deleteMany({ where: { docId } })\n await meta.deleteMany({ where: { docId } })\n })\n this.#seqNos.remove(docId)\n }\n\n async currentMeta(docId: DocId): Promise<StoreMeta | null> {\n const row = await this.#meta.findUnique({ where: { docId } })\n if (row === null) return null\n return parseMetaData(row.data) as StoreMeta\n }\n\n async *listDocIds(prefix?: string): AsyncIterable<DocId> {\n if (prefix === undefined) {\n const rows = await this.#meta.findMany({ select: { docId: true } })\n for (const r of rows) yield r.docId\n return\n }\n\n const upper = prefixUpperBound(prefix)\n const rows = await this.#meta.findMany({\n where: {\n docId: upper === null ? { gte: prefix } : { gte: prefix, lt: upper },\n },\n select: { docId: true },\n })\n for (const r of rows) yield r.docId\n }\n\n async close(): Promise<void> {\n // Caller owns the lifecycle (`prisma.$disconnect()`).\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Prisma's `Json` field arrives parsed on Postgres/MySQL but as a raw\n * string on SQLite — the only place where the underlying database\n * type leaks through Prisma's abstraction.\n */\nfunction parseMetaData(value: unknown): unknown {\n if (typeof value === \"string\") return JSON.parse(value)\n return value\n}\n\nfunction prefixUpperBound(prefix: string): string | null {\n if (prefix.length === 0) return null\n const codes = Array.from(prefix)\n for (let i = codes.length - 1; i >= 0; i--) {\n const ch = codes[i] as string\n const code = ch.codePointAt(0) as number\n if (code < 0x10ffff) {\n const next = String.fromCodePoint(code + 1)\n return codes.slice(0, i).join(\"\") + next\n }\n }\n return null\n}\n\n/**\n * Async only for ergonomic parity with `createPostgresStore` — does\n * no schema validation. Prisma's typed accessors enforce model presence\n * at compile time; runtime failures surface on first call.\n */\nexport async function createPrismaStore(\n options: PrismaStoreOptions,\n): Promise<Store> {\n return new PrismaStore(options)\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kyneta/prisma-store",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Prisma-based storage backend for @kyneta/exchange",
|
|
5
5
|
"author": "Duane Johnson",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,19 +32,19 @@
|
|
|
32
32
|
"./schema.prisma.example": "./schema.prisma.example"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@
|
|
36
|
-
"@kyneta/
|
|
37
|
-
"@kyneta/
|
|
38
|
-
"@
|
|
35
|
+
"@prisma/client": "^5.0.0 || ^6.0.0",
|
|
36
|
+
"@kyneta/exchange": "^1.6.0",
|
|
37
|
+
"@kyneta/schema": "^1.6.0",
|
|
38
|
+
"@kyneta/sql-store-core": "^1.6.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^22",
|
|
42
|
-
"tsdown": "^0.
|
|
42
|
+
"tsdown": "^0.22.0",
|
|
43
43
|
"typescript": "^5.9.2",
|
|
44
44
|
"vitest": "^4.0.17",
|
|
45
|
-
"@kyneta/
|
|
46
|
-
"@kyneta/
|
|
47
|
-
"@kyneta/
|
|
45
|
+
"@kyneta/schema": "^1.6.0",
|
|
46
|
+
"@kyneta/sql-store-core": "^1.6.0",
|
|
47
|
+
"@kyneta/exchange": "^1.6.0"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsdown",
|