@substrat-run/adapter-sqlite 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +49 -0
- package/dist/actor.d.ts +11 -0
- package/dist/actor.d.ts.map +1 -0
- package/dist/actor.js +16 -0
- package/dist/actor.js.map +1 -0
- package/dist/checker.d.ts +11 -0
- package/dist/checker.d.ts.map +1 -0
- package/dist/checker.js +136 -0
- package/dist/checker.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +431 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import { domainEvent, domainEventInput, eventId, instant, moduleManifest, objectRef, principalId, roleDefinition, } from '@substrat-run/contracts';
|
|
5
|
+
import { ulid, } from '@substrat-run/kernel';
|
|
6
|
+
import { ScopeActor } from './actor.js';
|
|
7
|
+
import { createTupleChecker } from './checker.js';
|
|
8
|
+
const KERNEL_DDL = `
|
|
9
|
+
CREATE TABLE IF NOT EXISTS _substrat_outbox (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
type TEXT NOT NULL,
|
|
12
|
+
schema_version INTEGER NOT NULL,
|
|
13
|
+
occurred_at TEXT NOT NULL,
|
|
14
|
+
tenant_id TEXT NOT NULL,
|
|
15
|
+
scope_id TEXT NOT NULL,
|
|
16
|
+
actor TEXT NOT NULL,
|
|
17
|
+
entity_type TEXT NOT NULL,
|
|
18
|
+
entity_id TEXT NOT NULL,
|
|
19
|
+
pii_class TEXT NOT NULL,
|
|
20
|
+
subject_id TEXT,
|
|
21
|
+
payload TEXT,
|
|
22
|
+
drained_at TEXT
|
|
23
|
+
);
|
|
24
|
+
CREATE TABLE IF NOT EXISTS _substrat_migrations (
|
|
25
|
+
module_id TEXT NOT NULL,
|
|
26
|
+
version TEXT NOT NULL,
|
|
27
|
+
applied_at TEXT NOT NULL,
|
|
28
|
+
PRIMARY KEY (module_id, version)
|
|
29
|
+
);
|
|
30
|
+
CREATE TABLE IF NOT EXISTS _substrat_tuples (
|
|
31
|
+
subject TEXT NOT NULL,
|
|
32
|
+
relation TEXT NOT NULL,
|
|
33
|
+
object TEXT NOT NULL,
|
|
34
|
+
expires_at TEXT,
|
|
35
|
+
PRIMARY KEY (subject, relation, object)
|
|
36
|
+
);
|
|
37
|
+
CREATE TABLE IF NOT EXISTS _substrat_deliveries (
|
|
38
|
+
event_id TEXT NOT NULL,
|
|
39
|
+
consumer_module TEXT NOT NULL,
|
|
40
|
+
delivered_at TEXT NOT NULL,
|
|
41
|
+
error TEXT,
|
|
42
|
+
PRIMARY KEY (event_id, consumer_module)
|
|
43
|
+
);
|
|
44
|
+
`;
|
|
45
|
+
export class SqliteScopeHost {
|
|
46
|
+
admin;
|
|
47
|
+
dir;
|
|
48
|
+
checker;
|
|
49
|
+
directory;
|
|
50
|
+
scopes = new Map();
|
|
51
|
+
scopesById = new Map();
|
|
52
|
+
operations = new Map();
|
|
53
|
+
modules = new Map();
|
|
54
|
+
relations = new Map();
|
|
55
|
+
roles = new Map(); // 'tenantId/roleKey'
|
|
56
|
+
systemPrincipal = principalId.parse(ulid());
|
|
57
|
+
constructor(options) {
|
|
58
|
+
this.dir = options.dir;
|
|
59
|
+
mkdirSync(this.dir, { recursive: true });
|
|
60
|
+
this.directory = new Database(join(this.dir, '_directory.sqlite'));
|
|
61
|
+
this.directory.pragma('journal_mode = WAL');
|
|
62
|
+
this.directory.exec(`
|
|
63
|
+
CREATE TABLE IF NOT EXISTS scopes (
|
|
64
|
+
scope_id TEXT PRIMARY KEY,
|
|
65
|
+
tenant_id TEXT NOT NULL,
|
|
66
|
+
storage_shape TEXT NOT NULL DEFAULT 'A',
|
|
67
|
+
jurisdiction TEXT,
|
|
68
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
69
|
+
schema_version TEXT NOT NULL DEFAULT '0',
|
|
70
|
+
created_at TEXT NOT NULL
|
|
71
|
+
);
|
|
72
|
+
CREATE TABLE IF NOT EXISTS _substrat_tenant_tuples (
|
|
73
|
+
tenant_id TEXT NOT NULL,
|
|
74
|
+
subject TEXT NOT NULL,
|
|
75
|
+
relation TEXT NOT NULL,
|
|
76
|
+
object TEXT NOT NULL,
|
|
77
|
+
expires_at TEXT,
|
|
78
|
+
PRIMARY KEY (tenant_id, subject, relation, object)
|
|
79
|
+
);
|
|
80
|
+
CREATE TABLE IF NOT EXISTS _substrat_roles (
|
|
81
|
+
tenant_id TEXT NOT NULL,
|
|
82
|
+
role_key TEXT NOT NULL,
|
|
83
|
+
permissions TEXT NOT NULL,
|
|
84
|
+
source TEXT NOT NULL,
|
|
85
|
+
PRIMARY KEY (tenant_id, role_key)
|
|
86
|
+
);
|
|
87
|
+
`);
|
|
88
|
+
this.loadRoles();
|
|
89
|
+
this.checker =
|
|
90
|
+
options.checker ??
|
|
91
|
+
createTupleChecker({
|
|
92
|
+
directory: this.directory,
|
|
93
|
+
scopeDb: (scopeId) => this.scopesById.get(scopeId)?.db,
|
|
94
|
+
getRole: (tenantId, key) => this.roles.get(`${tenantId}/${key}`),
|
|
95
|
+
});
|
|
96
|
+
this.admin = this.buildAdmin();
|
|
97
|
+
}
|
|
98
|
+
registerModule(registration) {
|
|
99
|
+
const manifest = moduleManifest.parse(registration.manifest);
|
|
100
|
+
if (this.modules.has(manifest.id)) {
|
|
101
|
+
throw new Error(`module already registered: ${manifest.id}`);
|
|
102
|
+
}
|
|
103
|
+
const migrations = registration.migrations ?? [];
|
|
104
|
+
const seen = new Set();
|
|
105
|
+
for (const m of migrations) {
|
|
106
|
+
if (seen.has(m.version)) {
|
|
107
|
+
throw new Error(`duplicate migration version in ${manifest.id}: ${m.version}`);
|
|
108
|
+
}
|
|
109
|
+
seen.add(m.version);
|
|
110
|
+
}
|
|
111
|
+
const declaredConsumes = new Set(manifest.events.consumes.map((c) => c.type));
|
|
112
|
+
const consumers = Object.entries(registration.consumers ?? {}).map(([eventType, handler]) => {
|
|
113
|
+
if (!declaredConsumes.has(eventType)) {
|
|
114
|
+
throw new Error(`${manifest.id} registers a consumer for undeclared event type: ${eventType}`);
|
|
115
|
+
}
|
|
116
|
+
return { eventType, handler };
|
|
117
|
+
});
|
|
118
|
+
this.modules.set(manifest.id, { id: manifest.id, migrations, consumers });
|
|
119
|
+
for (const rel of manifest.entityRelations ?? []) {
|
|
120
|
+
const parents = this.relations.get(rel.entityType) ?? new Set();
|
|
121
|
+
parents.add(rel.parentType);
|
|
122
|
+
this.relations.set(rel.entityType, parents);
|
|
123
|
+
}
|
|
124
|
+
for (const [name, handler] of Object.entries(registration.operations ?? {})) {
|
|
125
|
+
this.defineOperation(name, handler);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
defineOperation(name, handler) {
|
|
129
|
+
if (this.operations.has(name))
|
|
130
|
+
throw new Error(`operation already defined: ${name}`);
|
|
131
|
+
this.operations.set(name, handler);
|
|
132
|
+
}
|
|
133
|
+
async provisionScope(input) {
|
|
134
|
+
this.directory
|
|
135
|
+
.prepare(`INSERT OR IGNORE INTO scopes (scope_id, tenant_id, storage_shape, jurisdiction, created_at)
|
|
136
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
137
|
+
.run(input.scopeId, input.tenantId, input.storageShape ?? 'A', input.jurisdiction ?? null, new Date().toISOString());
|
|
138
|
+
const rt = this.runtime(input.tenantId, input.scopeId);
|
|
139
|
+
await this.applyPendingMigrations(rt);
|
|
140
|
+
}
|
|
141
|
+
async getScope(principal, tenantId, scopeId) {
|
|
142
|
+
const row = this.directory
|
|
143
|
+
.prepare('SELECT tenant_id FROM scopes WHERE scope_id = ?')
|
|
144
|
+
.get(scopeId);
|
|
145
|
+
if (!row || row.tenant_id !== tenantId) {
|
|
146
|
+
throw new Error(`unknown scope for tenant: (${tenantId}, ${scopeId})`);
|
|
147
|
+
}
|
|
148
|
+
const rt = this.runtime(tenantId, scopeId);
|
|
149
|
+
await this.applyPendingMigrations(rt);
|
|
150
|
+
const ctx = this.operationContext(rt, principal);
|
|
151
|
+
const operations = this.operations;
|
|
152
|
+
return {
|
|
153
|
+
tenantId,
|
|
154
|
+
scopeId,
|
|
155
|
+
invoke: (operation, input) => {
|
|
156
|
+
const handler = operations.get(operation);
|
|
157
|
+
if (!handler)
|
|
158
|
+
return Promise.reject(new Error(`unknown operation: ${operation}`));
|
|
159
|
+
return rt.actor.enqueue(async () => {
|
|
160
|
+
const clonedInput = structuredClone(input);
|
|
161
|
+
rt.db.exec('BEGIN IMMEDIATE');
|
|
162
|
+
let result;
|
|
163
|
+
try {
|
|
164
|
+
result = await handler(ctx, clonedInput);
|
|
165
|
+
rt.db.exec('COMMIT');
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
rt.db.exec('ROLLBACK');
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
// Post-commit, still inside the actor task: drain outbox → consumers.
|
|
172
|
+
await this.dispatch(rt);
|
|
173
|
+
return structuredClone(result);
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async close() {
|
|
179
|
+
for (const { db } of this.scopes.values())
|
|
180
|
+
db.close();
|
|
181
|
+
this.scopes.clear();
|
|
182
|
+
this.scopesById.clear();
|
|
183
|
+
this.directory.close();
|
|
184
|
+
}
|
|
185
|
+
// -------------------------------------------------------------------------
|
|
186
|
+
// Event dispatch (testrun spec §9.2.3): at-least-once, kernel-journaled,
|
|
187
|
+
// consumers run as system-actor operations in their own transactions.
|
|
188
|
+
// -------------------------------------------------------------------------
|
|
189
|
+
async dispatch(rt) {
|
|
190
|
+
for (let round = 0; round < 50; round++) {
|
|
191
|
+
let deliveredAny = false;
|
|
192
|
+
for (const mod of this.modules.values()) {
|
|
193
|
+
for (const consumer of mod.consumers) {
|
|
194
|
+
const rows = rt.db
|
|
195
|
+
.prepare(`SELECT * FROM _substrat_outbox o
|
|
196
|
+
WHERE o.type = ?
|
|
197
|
+
AND NOT EXISTS (
|
|
198
|
+
SELECT 1 FROM _substrat_deliveries d
|
|
199
|
+
WHERE d.event_id = o.id AND d.consumer_module = ?
|
|
200
|
+
)
|
|
201
|
+
ORDER BY o.id`)
|
|
202
|
+
.all(consumer.eventType, mod.id);
|
|
203
|
+
for (const row of rows) {
|
|
204
|
+
const event = this.parseOutboxRow(row);
|
|
205
|
+
const ctx = this.operationContext(rt, this.systemPrincipal, {
|
|
206
|
+
system: mod.id,
|
|
207
|
+
});
|
|
208
|
+
rt.db.exec('BEGIN IMMEDIATE');
|
|
209
|
+
try {
|
|
210
|
+
await consumer.handler(ctx, event);
|
|
211
|
+
rt.db
|
|
212
|
+
.prepare(`INSERT INTO _substrat_deliveries (event_id, consumer_module, delivered_at)
|
|
213
|
+
VALUES (?, ?, ?)`)
|
|
214
|
+
.run(event.id, mod.id, new Date().toISOString());
|
|
215
|
+
rt.db.exec('COMMIT');
|
|
216
|
+
deliveredAny = true;
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
rt.db.exec('ROLLBACK');
|
|
220
|
+
// Dead-letter (v0): journal the failure so one poison event
|
|
221
|
+
// can't wedge the loop. Real redelivery/backoff is a later cut.
|
|
222
|
+
rt.db
|
|
223
|
+
.prepare(`INSERT INTO _substrat_deliveries (event_id, consumer_module, delivered_at, error)
|
|
224
|
+
VALUES (?, ?, ?, ?)`)
|
|
225
|
+
.run(event.id, mod.id, new Date().toISOString(), String(err));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (!deliveredAny)
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
parseOutboxRow(row) {
|
|
235
|
+
return domainEvent.parse({
|
|
236
|
+
id: row.id,
|
|
237
|
+
type: row.type,
|
|
238
|
+
schemaVersion: row.schema_version,
|
|
239
|
+
occurredAt: row.occurred_at,
|
|
240
|
+
tenantId: row.tenant_id,
|
|
241
|
+
scopeId: row.scope_id,
|
|
242
|
+
actor: JSON.parse(row.actor),
|
|
243
|
+
entity: { entityType: row.entity_type, entityId: row.entity_id },
|
|
244
|
+
piiClass: row.pii_class,
|
|
245
|
+
...(row.subject_id ? { subjectId: row.subject_id } : {}),
|
|
246
|
+
payload: row.payload === null ? undefined : JSON.parse(row.payload),
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
// -------------------------------------------------------------------------
|
|
250
|
+
// Admin surface (enforcement input, §9.2.5)
|
|
251
|
+
// -------------------------------------------------------------------------
|
|
252
|
+
buildAdmin() {
|
|
253
|
+
const writeTenantTuple = (tenantId, subject, relation, object, expiresAt) => this.directory
|
|
254
|
+
.prepare(`INSERT OR REPLACE INTO _substrat_tenant_tuples
|
|
255
|
+
(tenant_id, subject, relation, object, expires_at)
|
|
256
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
257
|
+
.run(tenantId, subject, relation, object, expiresAt ?? null);
|
|
258
|
+
const writeScopeTuple = (node, subject, relation, object, expiresAt) => {
|
|
259
|
+
if (!node.scopeId)
|
|
260
|
+
throw new Error('scope tuple requires node.scopeId');
|
|
261
|
+
const rt = this.runtime(node.tenantId, node.scopeId);
|
|
262
|
+
rt.db
|
|
263
|
+
.prepare(`INSERT OR REPLACE INTO _substrat_tuples (subject, relation, object, expires_at)
|
|
264
|
+
VALUES (?, ?, ?, ?)`)
|
|
265
|
+
.run(subject, relation, object, expiresAt ?? null);
|
|
266
|
+
};
|
|
267
|
+
const writeGrant = (subject, permission, node, entity, expiresAt) => {
|
|
268
|
+
if (entity) {
|
|
269
|
+
writeScopeTuple(node, subject, `granted:${permission}`, `${entity.entityType}:${entity.entityId}`, expiresAt);
|
|
270
|
+
}
|
|
271
|
+
else if (node.scopeId) {
|
|
272
|
+
writeScopeTuple(node, subject, `granted:${permission}`, `scope:${node.scopeId}`, expiresAt);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
writeTenantTuple(node.tenantId, subject, `granted:${permission}`, `tenant:${node.tenantId}`, expiresAt);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
return {
|
|
279
|
+
defineRole: (tenantId, role) => {
|
|
280
|
+
const parsed = roleDefinition.parse(role);
|
|
281
|
+
this.directory
|
|
282
|
+
.prepare(`INSERT OR REPLACE INTO _substrat_roles (tenant_id, role_key, permissions, source)
|
|
283
|
+
VALUES (?, ?, ?, ?)`)
|
|
284
|
+
.run(tenantId, parsed.key, JSON.stringify(parsed.permissions), String(parsed.source));
|
|
285
|
+
this.roles.set(`${tenantId}/${parsed.key}`, parsed);
|
|
286
|
+
},
|
|
287
|
+
assignRole: (assignment) => {
|
|
288
|
+
const subject = `principal:${assignment.principalId}`;
|
|
289
|
+
if (assignment.node.scopeId) {
|
|
290
|
+
writeScopeTuple(assignment.node, subject, `role:${assignment.roleKey}`, `scope:${assignment.node.scopeId}`);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
writeTenantTuple(assignment.node.tenantId, subject, `role:${assignment.roleKey}`, `tenant:${assignment.node.tenantId}`);
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
grant: (grant) => {
|
|
297
|
+
writeGrant(`principal:${grant.principalId}`, grant.permission, grant.node, grant.entity, grant.expiresAt);
|
|
298
|
+
},
|
|
299
|
+
grantToOrg: (orgId, permission, node, entity) => {
|
|
300
|
+
writeGrant(`org:${orgId}`, permission, node, entity);
|
|
301
|
+
},
|
|
302
|
+
addMember: (tenantId, principal, orgId) => {
|
|
303
|
+
writeTenantTuple(tenantId, `principal:${principal}`, 'member', `org:${orgId}`);
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
loadRoles() {
|
|
308
|
+
const rows = this.directory
|
|
309
|
+
.prepare('SELECT tenant_id, role_key, permissions, source FROM _substrat_roles')
|
|
310
|
+
.all();
|
|
311
|
+
for (const r of rows) {
|
|
312
|
+
this.roles.set(`${r.tenant_id}/${r.role_key}`, {
|
|
313
|
+
key: r.role_key,
|
|
314
|
+
permissions: JSON.parse(r.permissions),
|
|
315
|
+
source: r.source,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// -------------------------------------------------------------------------
|
|
320
|
+
operationContext(rt, principal, systemActor) {
|
|
321
|
+
const checker = this.checker;
|
|
322
|
+
const relations = this.relations;
|
|
323
|
+
return {
|
|
324
|
+
tenantId: rt.tenantId,
|
|
325
|
+
scopeId: rt.scopeId,
|
|
326
|
+
principal,
|
|
327
|
+
sql: scopedSql(rt.db),
|
|
328
|
+
emit: (event) => {
|
|
329
|
+
const input = domainEventInput.parse(event);
|
|
330
|
+
const full = domainEvent.parse({
|
|
331
|
+
...input,
|
|
332
|
+
id: eventId.parse(ulid()),
|
|
333
|
+
occurredAt: instant.parse(new Date().toISOString()),
|
|
334
|
+
tenantId: rt.tenantId,
|
|
335
|
+
scopeId: rt.scopeId,
|
|
336
|
+
actor: systemActor ?? principal,
|
|
337
|
+
});
|
|
338
|
+
rt.db
|
|
339
|
+
.prepare(`INSERT INTO _substrat_outbox
|
|
340
|
+
(id, type, schema_version, occurred_at, tenant_id, scope_id, actor,
|
|
341
|
+
entity_type, entity_id, pii_class, subject_id, payload)
|
|
342
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
343
|
+
.run(full.id, full.type, full.schemaVersion, full.occurredAt, full.tenantId, full.scopeId, JSON.stringify(full.actor), full.entity.entityType, full.entity.entityId, full.piiClass, full.subjectId ?? null, full.payload === undefined ? null : JSON.stringify(full.payload));
|
|
344
|
+
},
|
|
345
|
+
check: (permission, entity) => systemActor
|
|
346
|
+
? Promise.resolve({
|
|
347
|
+
allowed: true,
|
|
348
|
+
proof: [
|
|
349
|
+
{
|
|
350
|
+
subject: objectRef.parse(`system:${systemActor.system.replace(/[^a-zA-Z0-9_.-]/g, '-')}`),
|
|
351
|
+
relation: `granted:${permission}`,
|
|
352
|
+
object: objectRef.parse(`scope:${rt.scopeId}`),
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
})
|
|
356
|
+
: checker.check(principal, permission, { tenantId: rt.tenantId, scopeId: rt.scopeId }, entity),
|
|
357
|
+
link: (child, parent) => {
|
|
358
|
+
const allowed = relations.get(child.entityType);
|
|
359
|
+
if (!allowed?.has(parent.entityType)) {
|
|
360
|
+
throw new Error(`undeclared entity relation: ${child.entityType} → ${parent.entityType} ` +
|
|
361
|
+
`(declare it in a module manifest's entityRelations)`);
|
|
362
|
+
}
|
|
363
|
+
rt.db
|
|
364
|
+
.prepare(`INSERT OR IGNORE INTO _substrat_tuples (subject, relation, object)
|
|
365
|
+
VALUES (?, 'parent', ?)`)
|
|
366
|
+
.run(`${child.entityType}:${child.entityId}`, `${parent.entityType}:${parent.entityId}`);
|
|
367
|
+
},
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
applyPendingMigrations(rt) {
|
|
371
|
+
const pending = [];
|
|
372
|
+
for (const mod of this.modules.values()) {
|
|
373
|
+
for (const migration of mod.migrations) {
|
|
374
|
+
if (!rt.appliedMigrations.has(`${mod.id}@${migration.version}`)) {
|
|
375
|
+
pending.push({ moduleId: mod.id, migration });
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (pending.length === 0)
|
|
380
|
+
return Promise.resolve();
|
|
381
|
+
return rt.actor.enqueue(() => {
|
|
382
|
+
for (const { moduleId, migration } of pending) {
|
|
383
|
+
const key = `${moduleId}@${migration.version}`;
|
|
384
|
+
if (rt.appliedMigrations.has(key))
|
|
385
|
+
continue;
|
|
386
|
+
rt.db.exec('BEGIN IMMEDIATE');
|
|
387
|
+
try {
|
|
388
|
+
const already = rt.db
|
|
389
|
+
.prepare('SELECT 1 FROM _substrat_migrations WHERE module_id = ? AND version = ?')
|
|
390
|
+
.get(moduleId, migration.version);
|
|
391
|
+
if (!already) {
|
|
392
|
+
rt.db.exec(migration.sql);
|
|
393
|
+
rt.db
|
|
394
|
+
.prepare('INSERT INTO _substrat_migrations (module_id, version, applied_at) VALUES (?, ?, ?)')
|
|
395
|
+
.run(moduleId, migration.version, new Date().toISOString());
|
|
396
|
+
}
|
|
397
|
+
rt.db.exec('COMMIT');
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
rt.db.exec('ROLLBACK');
|
|
401
|
+
throw new Error(`migration failed for ${key} — scope fails closed: ${err.message}`);
|
|
402
|
+
}
|
|
403
|
+
rt.appliedMigrations.add(key);
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
runtime(tenantId, scopeId) {
|
|
408
|
+
const key = `${tenantId}/${scopeId}`;
|
|
409
|
+
const existing = this.scopes.get(key);
|
|
410
|
+
if (existing)
|
|
411
|
+
return existing;
|
|
412
|
+
const db = new Database(join(this.dir, `${tenantId}__${scopeId}.sqlite`));
|
|
413
|
+
db.pragma('journal_mode = WAL');
|
|
414
|
+
db.exec(KERNEL_DDL);
|
|
415
|
+
const appliedMigrations = new Set(db.prepare('SELECT module_id, version FROM _substrat_migrations').all().map((r) => `${r.module_id}@${r.version}`));
|
|
416
|
+
const created = { tenantId, scopeId, db, actor: new ScopeActor(), appliedMigrations };
|
|
417
|
+
this.scopes.set(key, created);
|
|
418
|
+
this.scopesById.set(scopeId, created);
|
|
419
|
+
return created;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
function scopedSql(db) {
|
|
423
|
+
return {
|
|
424
|
+
query: (sql, params = []) => db.prepare(sql).all(...params),
|
|
425
|
+
exec: (sql, params = []) => {
|
|
426
|
+
const info = db.prepare(sql).run(...params);
|
|
427
|
+
return { changes: info.changes };
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@substrat-run/adapter-sqlite",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pure-SQLite scope host — real kernel semantics with no Cloudflare dependency (D-14): local dev, CI, self-host/escrow",
|
|
5
|
+
"license": "AGPL-3.0-only",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/substrat-run/substrat.git",
|
|
9
|
+
"directory": "packages/adapter-sqlite"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/substrat-run/substrat",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"better-sqlite3": "^12.0.0",
|
|
26
|
+
"@substrat-run/kernel": "^0.1.0",
|
|
27
|
+
"@substrat-run/contracts": "^0.1.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
31
|
+
"typescript": "^5.6.0",
|
|
32
|
+
"vitest": "^3.0.0",
|
|
33
|
+
"@substrat-run/contract-tests": "^0.1.0"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc -p tsconfig.json",
|
|
40
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
41
|
+
"test": "vitest run"
|
|
42
|
+
}
|
|
43
|
+
}
|