@enbox/dwn-server 0.0.6 → 0.0.8
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/esm/src/admin/admin-api.d.ts +5 -1
- package/dist/esm/src/admin/admin-api.d.ts.map +1 -1
- package/dist/esm/src/admin/admin-api.js +327 -7
- package/dist/esm/src/admin/admin-api.js.map +1 -1
- package/dist/esm/src/admin/admin-auth.d.ts +21 -3
- package/dist/esm/src/admin/admin-auth.d.ts.map +1 -1
- package/dist/esm/src/admin/admin-auth.js +17 -9
- package/dist/esm/src/admin/admin-auth.js.map +1 -1
- package/dist/esm/src/admin/admin-passkey-store.d.ts +68 -0
- package/dist/esm/src/admin/admin-passkey-store.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-passkey-store.js +132 -0
- package/dist/esm/src/admin/admin-passkey-store.js.map +1 -0
- package/dist/esm/src/admin/admin-session.d.ts +35 -0
- package/dist/esm/src/admin/admin-session.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-session.js +91 -0
- package/dist/esm/src/admin/admin-session.js.map +1 -0
- package/dist/esm/src/admin/audit-log.d.ts.map +1 -1
- package/dist/esm/src/admin/audit-log.js +5 -43
- package/dist/esm/src/admin/audit-log.js.map +1 -1
- package/dist/esm/src/admin/index.d.ts +5 -1
- package/dist/esm/src/admin/index.d.ts.map +1 -1
- package/dist/esm/src/admin/index.js +2 -0
- package/dist/esm/src/admin/index.js.map +1 -1
- package/dist/esm/src/admin/types.d.ts +22 -0
- package/dist/esm/src/admin/types.d.ts.map +1 -1
- package/dist/esm/src/admin/webhook-manager.d.ts.map +1 -1
- package/dist/esm/src/admin/webhook-manager.js +11 -10
- package/dist/esm/src/admin/webhook-manager.js.map +1 -1
- package/dist/esm/src/config.d.ts +18 -0
- package/dist/esm/src/config.d.ts.map +1 -1
- package/dist/esm/src/config.js +18 -0
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/dwn-server.d.ts +20 -1
- package/dist/esm/src/dwn-server.d.ts.map +1 -1
- package/dist/esm/src/dwn-server.js +111 -52
- package/dist/esm/src/dwn-server.js.map +1 -1
- package/dist/esm/src/http-api.d.ts +4 -0
- package/dist/esm/src/http-api.d.ts.map +1 -1
- package/dist/esm/src/http-api.js +14 -4
- package/dist/esm/src/http-api.js.map +1 -1
- package/dist/esm/src/index.d.ts +2 -0
- package/dist/esm/src/index.d.ts.map +1 -1
- package/dist/esm/src/index.js +2 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/migrations/001-initial-server-schema.d.ts +21 -0
- package/dist/esm/src/migrations/001-initial-server-schema.d.ts.map +1 -0
- package/dist/esm/src/migrations/001-initial-server-schema.js +97 -0
- package/dist/esm/src/migrations/001-initial-server-schema.js.map +1 -0
- package/dist/esm/src/migrations/index.d.ts +13 -0
- package/dist/esm/src/migrations/index.d.ts.map +1 -0
- package/dist/esm/src/migrations/index.js +5 -0
- package/dist/esm/src/migrations/index.js.map +1 -0
- package/dist/esm/src/registration/registration-store.d.ts +4 -0
- package/dist/esm/src/registration/registration-store.d.ts.map +1 -1
- package/dist/esm/src/registration/registration-store.js +11 -34
- package/dist/esm/src/registration/registration-store.js.map +1 -1
- package/dist/esm/src/server-migration-runner.d.ts +23 -0
- package/dist/esm/src/server-migration-runner.d.ts.map +1 -0
- package/dist/esm/src/server-migration-runner.js +57 -0
- package/dist/esm/src/server-migration-runner.js.map +1 -0
- package/dist/esm/src/storage.d.ts +15 -0
- package/dist/esm/src/storage.d.ts.map +1 -1
- package/dist/esm/src/storage.js +135 -17
- package/dist/esm/src/storage.js.map +1 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts +11 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.js +19 -20
- package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
- package/dist/esm/src/web5-connect/web5-connect-server.d.ts +10 -3
- package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -1
- package/dist/esm/src/web5-connect/web5-connect-server.js +10 -4
- package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -1
- package/package.json +3 -2
- package/src/admin/admin-api.ts +403 -10
- package/src/admin/admin-auth.ts +38 -9
- package/src/admin/admin-passkey-store.ts +190 -0
- package/src/admin/admin-session.ts +116 -0
- package/src/admin/audit-log.ts +7 -44
- package/src/admin/index.ts +5 -0
- package/src/admin/types.ts +28 -0
- package/src/admin/webhook-manager.ts +12 -10
- package/src/config.ts +21 -0
- package/src/dwn-server.ts +137 -55
- package/src/http-api.ts +20 -5
- package/src/index.ts +2 -0
- package/src/migrations/001-initial-server-schema.ts +114 -0
- package/src/migrations/index.ts +18 -0
- package/src/registration/registration-store.ts +13 -36
- package/src/server-migration-runner.ts +74 -0
- package/src/storage.ts +145 -17
- package/src/web5-connect/sql-ttl-cache.ts +21 -22
- package/src/web5-connect/web5-connect-server.ts +14 -5
package/dist/esm/src/storage.js
CHANGED
|
@@ -5,6 +5,7 @@ import pg from 'pg';
|
|
|
5
5
|
import { Kysely } from 'kysely';
|
|
6
6
|
import { createBunSqliteDatabase } from '@enbox/dwn-sql-store';
|
|
7
7
|
import { PluginLoader } from './plugin-loader.js';
|
|
8
|
+
import { runServerMigrations } from './server-migration-runner.js';
|
|
8
9
|
import { DataStoreLevel, MessageStoreLevel, ResumableTaskStoreLevel, StateIndexLevel, } from '@enbox/dwn-sdk-js';
|
|
9
10
|
import { DataStoreSql, MessageStoreSql, MysqlDialect, PostgresDialect, ResumableTaskStoreSql, runDwnStoreMigrations, SqliteDialect, StateIndexSql, } from '@enbox/dwn-sql-store';
|
|
10
11
|
export var StoreType;
|
|
@@ -22,23 +23,24 @@ export var BackendTypes;
|
|
|
22
23
|
BackendTypes["POSTGRES"] = "postgres";
|
|
23
24
|
})(BackendTypes || (BackendTypes = {}));
|
|
24
25
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
*
|
|
33
|
-
* Non-Postgres URLs always return a fresh dialect (no caching).
|
|
26
|
+
* Returns a (potentially cached) dialect for the given connection URL. For
|
|
27
|
+
* Postgres, creates a pool with configurable sizing from the server config.
|
|
28
|
+
* For other backends, delegates to `getDialectFromUrl()` which handles its
|
|
29
|
+
* own caching (critical for in-memory SQLite).
|
|
30
|
+
*
|
|
31
|
+
* All Postgres dialects are cached in a separate map keyed by URL so that
|
|
32
|
+
* multiple DWN stores sharing the same Postgres URL reuse a single
|
|
33
|
+
* `pg.Pool`, reducing connection count from 4 × pool_max to 1 × pool_max.
|
|
34
34
|
*/
|
|
35
|
+
const postgresDialectCache = new Map();
|
|
35
36
|
function getOrCreateDialect(connectionUrl, config) {
|
|
36
37
|
const protocol = connectionUrl.protocol.slice(0, -1);
|
|
37
38
|
if (protocol !== BackendTypes.POSTGRES) {
|
|
39
|
+
// getDialectFromUrl handles its own caching for SQLite/MySQL.
|
|
38
40
|
return getDialectFromUrl(connectionUrl);
|
|
39
41
|
}
|
|
40
42
|
const key = connectionUrl.toString();
|
|
41
|
-
const cached =
|
|
43
|
+
const cached = postgresDialectCache.get(key);
|
|
42
44
|
if (cached !== undefined) {
|
|
43
45
|
return cached;
|
|
44
46
|
}
|
|
@@ -53,7 +55,7 @@ function getOrCreateDialect(connectionUrl, config) {
|
|
|
53
55
|
pool: async () => pool,
|
|
54
56
|
cursor: Cursor,
|
|
55
57
|
});
|
|
56
|
-
|
|
58
|
+
postgresDialectCache.set(key, dialect);
|
|
57
59
|
return dialect;
|
|
58
60
|
}
|
|
59
61
|
export async function getDwnConfig(config, options) {
|
|
@@ -100,13 +102,91 @@ async function runSqlMigrationsIfNeeded(config) {
|
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
104
|
finally {
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
// Do NOT destroy the Kysely instance — the dialect is cached and will be
|
|
106
|
+
// reused by stores. For in-memory SQLite, destroying would close the
|
|
107
|
+
// database and lose all migrated schema. For Postgres, the pool is shared.
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Runs DWN server schema migrations (admin stores, registration, TTL cache)
|
|
112
|
+
* if the given URL points to a SQL backend. Uses the `registrationStoreUrl`
|
|
113
|
+
* (or the TTL cache URL) as the target database.
|
|
114
|
+
*
|
|
115
|
+
* Server migrations use a separate tracking table (`dwn_server_migration`)
|
|
116
|
+
* so they do not conflict with the DWN store migrations.
|
|
117
|
+
*
|
|
118
|
+
* Call this once during server startup, before creating admin stores.
|
|
119
|
+
*
|
|
120
|
+
* @returns The dialect used for the target database (so the caller can reuse
|
|
121
|
+
* it for the TTL cache and admin stores), or `undefined` if no SQL
|
|
122
|
+
* backend was configured or needed.
|
|
123
|
+
*/
|
|
124
|
+
export async function runServerMigrationsIfNeeded(config) {
|
|
125
|
+
const sqlBackends = [BackendTypes.SQLITE, BackendTypes.MYSQL, BackendTypes.POSTGRES];
|
|
126
|
+
// Determine the target URL for server migrations. Prefer registrationStoreUrl
|
|
127
|
+
// since admin stores and the TTL cache share that database. Fall back to
|
|
128
|
+
// ttlCacheUrl when no registration store is configured (the cacheEntries
|
|
129
|
+
// table still needs a schema).
|
|
130
|
+
const targetUrl = config.registrationStoreUrl ?? config.ttlCacheUrl;
|
|
131
|
+
if (!targetUrl) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
if (isFilePath(targetUrl)) {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
let parsedUrl;
|
|
138
|
+
try {
|
|
139
|
+
parsedUrl = new URL(targetUrl);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const protocol = parsedUrl.protocol.slice(0, -1);
|
|
145
|
+
if (!sqlBackends.includes(protocol)) {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
// When both registrationStoreUrl and ttlCacheUrl are set and differ,
|
|
149
|
+
// validate they point at the same database — the cacheEntries table is
|
|
150
|
+
// included in the server migration so it must live alongside the other
|
|
151
|
+
// server tables.
|
|
152
|
+
if (config.registrationStoreUrl && config.ttlCacheUrl
|
|
153
|
+
&& config.ttlCacheUrl !== config.registrationStoreUrl) {
|
|
154
|
+
let ttlUrl;
|
|
155
|
+
try {
|
|
156
|
+
ttlUrl = new URL(config.ttlCacheUrl);
|
|
157
|
+
}
|
|
158
|
+
catch { /* not a URL */ }
|
|
159
|
+
if (ttlUrl) {
|
|
160
|
+
const ttlProtocol = ttlUrl.protocol.slice(0, -1);
|
|
161
|
+
if (sqlBackends.includes(ttlProtocol)) {
|
|
162
|
+
throw new Error('DWN server misconfiguration: DWN_TTL_CACHE_URL must point to the same database as ' +
|
|
163
|
+
'DWN_REGISTRATION_STORE_URL (or DWN_STORAGE) because the cacheEntries table is managed ' +
|
|
164
|
+
'by the server migration system. ' +
|
|
165
|
+
`Got registrationStoreUrl="${config.registrationStoreUrl}", ttlCacheUrl="${config.ttlCacheUrl}".`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const dialect = getOrCreateDialect(parsedUrl, config);
|
|
170
|
+
const db = new Kysely({ dialect });
|
|
171
|
+
try {
|
|
172
|
+
const applied = await runServerMigrations(db, dialect);
|
|
173
|
+
if (applied.length > 0) {
|
|
174
|
+
console.log(`Server migrations applied: ${applied.join(', ')}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
// For Postgres, don't destroy — the pool is cached in sharedDialectCache.
|
|
179
|
+
// For SQLite/MySQL, we also keep the Kysely instance alive so the caller
|
|
180
|
+
// can reuse the same dialect (critical for in-memory SQLite).
|
|
181
|
+
if (protocol === BackendTypes.POSTGRES) {
|
|
182
|
+
// Pool stays alive via sharedDialectCache.
|
|
108
183
|
}
|
|
184
|
+
// NOTE: We intentionally do NOT destroy the Kysely instance for any
|
|
185
|
+
// backend. The dialect is returned to the caller for reuse (e.g. by the
|
|
186
|
+
// TTL cache and admin stores). For in-memory SQLite, destroying would
|
|
187
|
+
// lose the database.
|
|
109
188
|
}
|
|
189
|
+
return dialect;
|
|
110
190
|
}
|
|
111
191
|
function getLevelStore(storeURI, storeType) {
|
|
112
192
|
switch (storeType) {
|
|
@@ -187,6 +267,20 @@ async function loadStoreFromFilePath(filePath, storeType) {
|
|
|
187
267
|
throw new Error(`Loading store for unsupported store type ${storeType} from path ${filePath}`);
|
|
188
268
|
}
|
|
189
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Cache for the in-memory SQLite dialect. Since every call to
|
|
272
|
+
* `createBunSqliteDatabase(':memory:')` creates a separate, empty database,
|
|
273
|
+
* we must ensure that `getDialectFromUrl(new URL('sqlite://'))` always
|
|
274
|
+
* returns the same dialect (and thus the same underlying database) within a
|
|
275
|
+
* process. This is critical for the DWN server startup flow where migrations,
|
|
276
|
+
* the registration store, and the TTL cache all need to share the same
|
|
277
|
+
* in-memory database.
|
|
278
|
+
*
|
|
279
|
+
* File-based SQLite and other backends are NOT cached here — file-based SQLite
|
|
280
|
+
* connections naturally share state through the filesystem, and caching would
|
|
281
|
+
* break test isolation when multiple test files run in the same process.
|
|
282
|
+
*/
|
|
283
|
+
let inMemorySqliteDialect;
|
|
190
284
|
export function getDialectFromUrl(connectionUrl) {
|
|
191
285
|
switch (connectionUrl.protocol.slice(0, -1)) {
|
|
192
286
|
case BackendTypes.SQLITE: {
|
|
@@ -196,8 +290,30 @@ export function getDialectFromUrl(connectionUrl) {
|
|
|
196
290
|
console.log('SQL-lite directory does not exist, creating:', connectionUrl.host);
|
|
197
291
|
fs.mkdirSync(connectionUrl.host, { recursive: true });
|
|
198
292
|
}
|
|
199
|
-
// Use in-memory database if no path is provided (for tests)
|
|
293
|
+
// Use in-memory database if no path is provided (for tests).
|
|
200
294
|
const dbPath = path || ':memory:';
|
|
295
|
+
// For in-memory SQLite, return a cached dialect so that all callers
|
|
296
|
+
// (migrations, registration store, TTL cache) share the same database.
|
|
297
|
+
// The wrapper makes close() a no-op so that individual consumers (e.g.
|
|
298
|
+
// DwnServer.stop() → Dwn.close() → store.close()) cannot destroy the
|
|
299
|
+
// shared database out from under other consumers.
|
|
300
|
+
if (dbPath === ':memory:') {
|
|
301
|
+
if (inMemorySqliteDialect === undefined) {
|
|
302
|
+
const sharedDb = createBunSqliteDatabase(':memory:');
|
|
303
|
+
const nonCloseableDb = {
|
|
304
|
+
close() {
|
|
305
|
+
// no-op — shared instance must survive the process
|
|
306
|
+
},
|
|
307
|
+
prepare(sql) {
|
|
308
|
+
return sharedDb.prepare(sql);
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
inMemorySqliteDialect = new SqliteDialect({
|
|
312
|
+
database: async () => nonCloseableDb,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return inMemorySqliteDialect;
|
|
316
|
+
}
|
|
201
317
|
return new SqliteDialect({
|
|
202
318
|
database: async () => createBunSqliteDatabase(dbPath),
|
|
203
319
|
});
|
|
@@ -211,6 +327,8 @@ export function getDialectFromUrl(connectionUrl) {
|
|
|
211
327
|
pool: async () => new pg.Pool({ connectionString: connectionUrl.toString() }),
|
|
212
328
|
cursor: Cursor,
|
|
213
329
|
});
|
|
330
|
+
default:
|
|
331
|
+
throw new Error(`Unsupported database protocol: ${connectionUrl.protocol}`);
|
|
214
332
|
}
|
|
215
333
|
}
|
|
216
334
|
function invalidStorageSchemeMessage(protocol) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,6 @@ import type { Dialect } from '@enbox/dwn-sql-store';
|
|
|
5
5
|
export declare class SqlTtlCache {
|
|
6
6
|
private static readonly cacheTableName;
|
|
7
7
|
private static readonly cleanupIntervalInSeconds;
|
|
8
|
-
private sqlDialect;
|
|
9
8
|
private db;
|
|
10
9
|
private cleanupTimer;
|
|
11
10
|
private constructor();
|
|
@@ -13,6 +12,10 @@ export declare class SqlTtlCache {
|
|
|
13
12
|
* Creates a new SqlTtlCache instance.
|
|
14
13
|
*/
|
|
15
14
|
static create(sqlDialect: Dialect): Promise<SqlTtlCache>;
|
|
15
|
+
/**
|
|
16
|
+
* Verifies that the required table exists and starts the cleanup timer.
|
|
17
|
+
* Throws a clear error directing the caller to run server migrations first.
|
|
18
|
+
*/
|
|
16
19
|
private initialize;
|
|
17
20
|
/**
|
|
18
21
|
* Starts a timer to periodically clean up expired cache entries.
|
|
@@ -35,5 +38,12 @@ export declare class SqlTtlCache {
|
|
|
35
38
|
* Cleans up expired cache entries.
|
|
36
39
|
*/
|
|
37
40
|
cleanUpExpiredEntries(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Stops the background cleanup timer. The underlying database connection is
|
|
43
|
+
* NOT destroyed here because the dialect is shared with other components
|
|
44
|
+
* (e.g. DWN stores, registration store) and its lifecycle is managed by the
|
|
45
|
+
* dialect owner.
|
|
46
|
+
*/
|
|
47
|
+
close(): void;
|
|
38
48
|
}
|
|
39
49
|
//# sourceMappingURL=sql-ttl-cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-ttl-cache.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAEtD,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"sql-ttl-cache.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAEtD,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,YAAY,CAAiB;IAErC,OAAO;IAIP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAQrE;;;OAGG;YACW,UAAU;IAaxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA+B1D;;OAEG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnD;;;;;OAKG;IACI,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { Kysely } from 'kysely';
|
|
1
|
+
import { Kysely, sql } from 'kysely';
|
|
2
2
|
/**
|
|
3
3
|
* The SqlTtlCache is responsible for storing and retrieving cache data with TTL (Time-to-Live).
|
|
4
4
|
*/
|
|
5
5
|
export class SqlTtlCache {
|
|
6
6
|
static cacheTableName = 'cacheEntries';
|
|
7
7
|
static cleanupIntervalInSeconds = 60;
|
|
8
|
-
sqlDialect;
|
|
9
8
|
db;
|
|
10
9
|
cleanupTimer;
|
|
11
10
|
constructor(sqlDialect) {
|
|
12
11
|
this.db = new Kysely({ dialect: sqlDialect });
|
|
13
|
-
this.sqlDialect = sqlDialect;
|
|
14
12
|
}
|
|
15
13
|
/**
|
|
16
14
|
* Creates a new SqlTtlCache instance.
|
|
@@ -20,24 +18,16 @@ export class SqlTtlCache {
|
|
|
20
18
|
await cacheManager.initialize();
|
|
21
19
|
return cacheManager;
|
|
22
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Verifies that the required table exists and starts the cleanup timer.
|
|
23
|
+
* Throws a clear error directing the caller to run server migrations first.
|
|
24
|
+
*/
|
|
23
25
|
async initialize() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.ifNotExists() // kept to show supported by all dialects in contrast to ifNotExists() below, though not needed due to tableExists check above
|
|
30
|
-
// 512 chars to accommodate potentially large `state` in Web5 Connect flow
|
|
31
|
-
.addColumn('key', 'varchar(512)', (column) => column.primaryKey())
|
|
32
|
-
.addColumn('value', 'text', (column) => column.notNull())
|
|
33
|
-
.addColumn('expiry', 'bigint', (column) => column.notNull())
|
|
34
|
-
.execute();
|
|
35
|
-
await this.db.schema
|
|
36
|
-
.createIndex('index_expiry')
|
|
37
|
-
// .ifNotExists() // intentionally kept commented out code to show that it is not supported by all dialects (ie. MySQL)
|
|
38
|
-
.on(SqlTtlCache.cacheTableName)
|
|
39
|
-
.column('expiry')
|
|
40
|
-
.execute();
|
|
26
|
+
try {
|
|
27
|
+
await sql `SELECT 1 FROM ${sql.table(SqlTtlCache.cacheTableName)} LIMIT 0`.execute(this.db);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error(`SqlTtlCache: table '${SqlTtlCache.cacheTableName}' does not exist. Run server migrations before starting.`);
|
|
41
31
|
}
|
|
42
32
|
// Start the cleanup timer
|
|
43
33
|
this.startCleanupTimer();
|
|
@@ -110,5 +100,14 @@ export class SqlTtlCache {
|
|
|
110
100
|
.where('expiry', '<', Date.now())
|
|
111
101
|
.execute();
|
|
112
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Stops the background cleanup timer. The underlying database connection is
|
|
105
|
+
* NOT destroyed here because the dialect is shared with other components
|
|
106
|
+
* (e.g. DWN stores, registration store) and its lifecycle is managed by the
|
|
107
|
+
* dialect owner.
|
|
108
|
+
*/
|
|
109
|
+
close() {
|
|
110
|
+
clearInterval(this.cleanupTimer);
|
|
111
|
+
}
|
|
113
112
|
}
|
|
114
113
|
//# sourceMappingURL=sql-ttl-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-ttl-cache.js","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-ttl-cache.js","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Dialect } from '@enbox/dwn-sql-store';
|
|
1
2
|
/**
|
|
2
3
|
* The Web5 Connect Request object.
|
|
3
4
|
*/
|
|
@@ -30,11 +31,12 @@ export declare class Web5ConnectServer {
|
|
|
30
31
|
* Creates a new instance of the Web5 Connect Server.
|
|
31
32
|
* @param params.baseUrl The the base URL of the connect server including the port.
|
|
32
33
|
* This is given to the Identity Provider (wallet) to fetch the Web5 Connect Request object.
|
|
33
|
-
* @param params.
|
|
34
|
+
* @param params.sqlDialect The SQL dialect to use for the TTL cache. Must point to a database
|
|
35
|
+
* where server migrations have already been run.
|
|
34
36
|
*/
|
|
35
|
-
static create({ baseUrl,
|
|
37
|
+
static create({ baseUrl, sqlDialect }: {
|
|
36
38
|
baseUrl: string;
|
|
37
|
-
|
|
39
|
+
sqlDialect: Dialect;
|
|
38
40
|
}): Promise<Web5ConnectServer>;
|
|
39
41
|
private constructor();
|
|
40
42
|
/**
|
|
@@ -54,5 +56,10 @@ export declare class Web5ConnectServer {
|
|
|
54
56
|
* Gets the Web5 Connect Response object. The `state` string can only be used once.
|
|
55
57
|
*/
|
|
56
58
|
getWeb5ConnectResponse(state: string): Promise<Web5ConnectResponse | undefined>;
|
|
59
|
+
/**
|
|
60
|
+
* Stops the TTL cache cleanup timer. Must be called during shutdown to
|
|
61
|
+
* prevent leaked timers.
|
|
62
|
+
*/
|
|
63
|
+
close(): void;
|
|
57
64
|
}
|
|
58
65
|
//# sourceMappingURL=web5-connect-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web5-connect-server.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/web5-connect-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web5-connect-server.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/web5-connect-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAMpD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,gBAAuB,YAAY,OAAO;IAE1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAc;IAE3B;;;;;;OAMG;WACiB,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;QAClD,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS9B,OAAO;IAMP;;;OAGG;IACU,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAcrG;;OAEG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAc9F;;OAEG;IACU,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAI/F;;OAEG;IACU,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAc5F;;;OAGG;IACI,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { CryptoUtils } from '@enbox/crypto';
|
|
2
|
-
import { getDialectFromUrl } from '../storage.js';
|
|
3
2
|
import { SqlTtlCache } from './sql-ttl-cache.js';
|
|
4
3
|
/**
|
|
5
4
|
* The Web5 Connect Server is responsible for handling the Web5 Connect flow.
|
|
@@ -12,12 +11,12 @@ export class Web5ConnectServer {
|
|
|
12
11
|
* Creates a new instance of the Web5 Connect Server.
|
|
13
12
|
* @param params.baseUrl The the base URL of the connect server including the port.
|
|
14
13
|
* This is given to the Identity Provider (wallet) to fetch the Web5 Connect Request object.
|
|
15
|
-
* @param params.
|
|
14
|
+
* @param params.sqlDialect The SQL dialect to use for the TTL cache. Must point to a database
|
|
15
|
+
* where server migrations have already been run.
|
|
16
16
|
*/
|
|
17
|
-
static async create({ baseUrl,
|
|
17
|
+
static async create({ baseUrl, sqlDialect }) {
|
|
18
18
|
const web5ConnectServer = new Web5ConnectServer({ baseUrl });
|
|
19
19
|
// Initialize TTL cache.
|
|
20
|
-
const sqlDialect = getDialectFromUrl(new URL(sqlTtlCacheUrl));
|
|
21
20
|
web5ConnectServer.cache = await SqlTtlCache.create(sqlDialect);
|
|
22
21
|
return web5ConnectServer;
|
|
23
22
|
}
|
|
@@ -73,5 +72,12 @@ export class Web5ConnectServer {
|
|
|
73
72
|
}
|
|
74
73
|
return response;
|
|
75
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Stops the TTL cache cleanup timer. Must be called during shutdown to
|
|
77
|
+
* prevent leaked timers.
|
|
78
|
+
*/
|
|
79
|
+
close() {
|
|
80
|
+
this.cache.close();
|
|
81
|
+
}
|
|
76
82
|
}
|
|
77
83
|
//# sourceMappingURL=web5-connect-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web5-connect-server.js","sourceRoot":"","sources":["../../../../src/web5-connect/web5-connect-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web5-connect-server.js","sourceRoot":"","sources":["../../../../src/web5-connect/web5-connect-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2BjD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACrB,MAAM,CAAU,YAAY,GAAG,GAAG,CAAC;IAElC,OAAO,CAAS;IAChB,KAAK,CAAc;IAE3B;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAG/C;QACC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAE7D,wBAAwB;QACxB,iBAAiB,CAAC,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/D,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,YAAoB,EAAE,OAAO,EAE5B;QACC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,qBAAqB,CAAC,OAA2B;QAC5D,yBAAyB;QACzB,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,OAAO,sBAAsB,SAAS,MAAM,CAAC;QAEzE,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,SAAS,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEnF,OAAO;YACL,WAAW;YACX,UAAU,EAAE,iBAAiB,CAAC,YAAY;SAC3C,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;QAE7D,mEAAmE;QACnE,yFAAyF;QACzF,wFAAwF;QACxF,mEAAmE;QACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,sBAAsB,CAAC,KAAa,EAAE,QAA6B;QAC9E,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,EAAE,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,sBAAsB,CAAC,KAAa;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QAE3D,wEAAwE;QACxE,yFAAyF;QACzF,wFAAwF;QACxF,mEAAmE;QACnE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,KAAK;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enbox/dwn-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.8",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -33,11 +33,12 @@
|
|
|
33
33
|
"@enbox/common": "0.0.6",
|
|
34
34
|
"@enbox/crypto": "0.0.7",
|
|
35
35
|
"@enbox/dids": "0.0.8",
|
|
36
|
-
"@enbox/dwn-clients": "0.0.
|
|
36
|
+
"@enbox/dwn-clients": "0.0.9",
|
|
37
37
|
"@enbox/dwn-sdk-js": "0.1.1",
|
|
38
38
|
"@enbox/dwn-sql-store": "0.0.10",
|
|
39
39
|
"@nats-io/jetstream": "^3.3.1",
|
|
40
40
|
"@nats-io/transport-node": "^3.3.1",
|
|
41
|
+
"@simplewebauthn/server": "^13.2.3",
|
|
41
42
|
"bytes": "3.1.2",
|
|
42
43
|
"jose": "^6.1.3",
|
|
43
44
|
"kysely": "^0.26.3",
|