@verdant-web/server 3.3.10 → 4.0.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/bin/server.mjs +110 -107
- package/dist/esm/TokenVerifier.d.ts +1 -0
- package/dist/esm/TokenVerifier.js +3 -0
- package/dist/esm/TokenVerifier.js.map +1 -1
- package/dist/esm/adapters/node/errorHandler.d.ts +2 -0
- package/dist/esm/adapters/node/errorHandler.js +12 -0
- package/dist/esm/adapters/node/errorHandler.js.map +1 -0
- package/dist/esm/adapters/node/getRequestToken.d.ts +1 -0
- package/dist/esm/adapters/node/getRequestToken.js +25 -0
- package/dist/esm/adapters/node/getRequestToken.js.map +1 -0
- package/dist/esm/adapters/node/httpRouter.d.ts +47 -0
- package/dist/esm/adapters/node/httpRouter.js +88 -0
- package/dist/esm/adapters/node/httpRouter.js.map +1 -0
- package/dist/esm/adapters/node/index.d.ts +5 -0
- package/dist/esm/adapters/node/index.js +6 -0
- package/dist/esm/adapters/node/index.js.map +1 -0
- package/dist/esm/adapters/node/tokenMiddleware.d.ts +7 -0
- package/dist/esm/adapters/node/tokenMiddleware.js +22 -0
- package/dist/esm/adapters/node/tokenMiddleware.js.map +1 -0
- package/dist/esm/adapters/node/websocketHandler.d.ts +4 -0
- package/dist/esm/adapters/node/websocketHandler.js +54 -0
- package/dist/esm/adapters/node/websocketHandler.js.map +1 -0
- package/dist/esm/connections/ClientConnection.d.ts +25 -0
- package/dist/esm/{ClientConnection.js → connections/ClientConnection.js} +47 -38
- package/dist/esm/connections/ClientConnection.js.map +1 -0
- package/dist/esm/connections/MessageSender.d.ts +5 -0
- package/dist/esm/connections/MessageSender.js.map +1 -0
- package/dist/esm/connections/Presence.d.ts +23 -0
- package/dist/esm/connections/Presence.js +65 -0
- package/dist/esm/connections/Presence.js.map +1 -0
- package/dist/esm/core.d.ts +15 -0
- package/dist/esm/core.js +15 -0
- package/dist/esm/core.js.map +1 -0
- package/dist/esm/defaults.d.ts +2 -0
- package/dist/esm/defaults.js +3 -0
- package/dist/esm/defaults.js.map +1 -0
- package/dist/esm/files/FileStorage.d.ts +12 -3
- package/dist/esm/files/FileStorage.js +20 -0
- package/dist/esm/files/FileStorage.js.map +1 -1
- package/dist/esm/index.d.ts +7 -7
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internals.d.ts +14 -0
- package/dist/esm/internals.js +12 -0
- package/dist/esm/internals.js.map +1 -0
- package/dist/esm/libraries/Library.d.ts +78 -0
- package/dist/esm/{ServerLibrary.js → libraries/Library.js} +153 -144
- package/dist/esm/libraries/Library.js.map +1 -0
- package/dist/esm/{ServerLibrary.test.js → libraries/Library.test.js} +42 -33
- package/dist/esm/libraries/Library.test.js.map +1 -0
- package/dist/esm/libraries/generic.d.ts +8 -0
- package/dist/esm/libraries/generic.js +2 -0
- package/dist/esm/libraries/generic.js.map +1 -0
- package/dist/esm/libraries/singleNode.d.ts +53 -0
- package/dist/esm/libraries/singleNode.js +88 -0
- package/dist/esm/libraries/singleNode.js.map +1 -0
- package/dist/esm/logger.d.ts +1 -0
- package/dist/esm/logger.js +2 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/storage/Storage.d.ts +39 -38
- package/dist/esm/storage/StorageManager.d.ts +11 -0
- package/dist/esm/storage/StorageManager.js +32 -0
- package/dist/esm/storage/StorageManager.js.map +1 -0
- package/dist/esm/storage/index.d.ts +1 -2
- package/dist/esm/storage/index.js +1 -2
- package/dist/esm/storage/index.js.map +1 -1
- package/dist/esm/storage/sqlShard/Databases.d.ts +5 -3
- package/dist/esm/storage/sqlShard/Databases.js +11 -7
- package/dist/esm/storage/sqlShard/Databases.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlBaselines.d.ts +16 -17
- package/dist/esm/storage/sqlShard/SqlBaselines.js +55 -59
- package/dist/esm/storage/sqlShard/SqlBaselines.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlFileMetadata.d.ts +13 -13
- package/dist/esm/storage/sqlShard/SqlFileMetadata.js +44 -57
- package/dist/esm/storage/sqlShard/SqlFileMetadata.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlOperations.d.ts +12 -12
- package/dist/esm/storage/sqlShard/SqlOperations.js +38 -73
- package/dist/esm/storage/sqlShard/SqlOperations.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlReplicas.d.ts +18 -17
- package/dist/esm/storage/sqlShard/SqlReplicas.js +63 -100
- package/dist/esm/storage/sqlShard/SqlReplicas.js.map +1 -1
- package/dist/esm/storage/sqlShard/database.d.ts +25 -5
- package/dist/esm/storage/sqlShard/database.js +47 -15
- package/dist/esm/storage/sqlShard/database.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations/v1.d.ts +2 -3
- package/dist/esm/storage/sqlShard/migrations/v1.js +42 -47
- package/dist/esm/storage/sqlShard/migrations/v1.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations/v2.d.ts +2 -3
- package/dist/esm/storage/sqlShard/migrations/v2.js +5 -15
- package/dist/esm/storage/sqlShard/migrations/v2.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations.d.ts +5 -7
- package/dist/esm/storage/sqlShard/migrations.js +48 -1
- package/dist/esm/storage/sqlShard/migrations.js.map +1 -1
- package/dist/esm/storage/sqlShard/sqlShardStorage.d.ts +25 -4
- package/dist/esm/storage/sqlShard/sqlShardStorage.js +43 -40
- package/dist/esm/storage/sqlShard/sqlShardStorage.js.map +1 -1
- package/dist/esm/storage/sqlShard/tables.d.ts +9 -6
- package/dist/esm/types.d.ts +1 -2
- package/package.json +24 -13
- package/src/TokenVerifier.ts +4 -0
- package/src/adapters/node/errorHandler.ts +18 -0
- package/src/adapters/node/getRequestToken.ts +34 -0
- package/src/adapters/node/httpRouter.ts +139 -0
- package/src/adapters/node/index.ts +5 -0
- package/src/adapters/node/tokenMiddleware.ts +32 -0
- package/src/adapters/node/websocketHandler.ts +79 -0
- package/src/{ClientConnection.ts → connections/ClientConnection.ts} +64 -57
- package/src/connections/MessageSender.ts +6 -0
- package/src/connections/Presence.ts +95 -0
- package/src/core.ts +36 -0
- package/src/defaults.ts +2 -0
- package/src/files/FileStorage.ts +36 -3
- package/src/index.ts +7 -7
- package/src/internals.ts +14 -0
- package/src/{ServerLibrary.test.ts → libraries/Library.test.ts} +51 -49
- package/src/{ServerLibrary.ts → libraries/Library.ts} +203 -206
- package/src/libraries/generic.ts +9 -0
- package/src/libraries/singleNode.ts +145 -0
- package/src/logger.ts +4 -0
- package/src/storage/Storage.ts +37 -66
- package/src/storage/StorageManager.ts +39 -0
- package/src/storage/index.ts +1 -2
- package/src/storage/sqlShard/Databases.ts +26 -13
- package/src/storage/sqlShard/SqlBaselines.ts +58 -67
- package/src/storage/sqlShard/SqlFileMetadata.ts +51 -72
- package/src/storage/sqlShard/SqlOperations.ts +57 -81
- package/src/storage/sqlShard/SqlReplicas.ts +80 -121
- package/src/storage/sqlShard/database.ts +82 -18
- package/src/storage/sqlShard/migrations/v1.ts +42 -52
- package/src/storage/sqlShard/migrations/v2.ts +5 -19
- package/src/storage/sqlShard/migrations.ts +66 -1
- package/src/storage/sqlShard/sqlShardStorage.ts +56 -55
- package/src/storage/sqlShard/tables.ts +6 -6
- package/src/types.ts +1 -2
- package/dist/esm/ClientConnection.d.ts +0 -19
- package/dist/esm/ClientConnection.js.map +0 -1
- package/dist/esm/MessageSender.d.ts +0 -5
- package/dist/esm/MessageSender.js.map +0 -1
- package/dist/esm/Presence.d.ts +0 -18
- package/dist/esm/Presence.js +0 -65
- package/dist/esm/Presence.js.map +0 -1
- package/dist/esm/ReplicaKeepaliveTimers.d.ts +0 -17
- package/dist/esm/ReplicaKeepaliveTimers.js +0 -27
- package/dist/esm/ReplicaKeepaliveTimers.js.map +0 -1
- package/dist/esm/Server.d.ts +0 -166
- package/dist/esm/Server.js +0 -572
- package/dist/esm/Server.js.map +0 -1
- package/dist/esm/ServerLibrary.d.ts +0 -64
- package/dist/esm/ServerLibrary.js.map +0 -1
- package/dist/esm/ServerLibrary.test.js.map +0 -1
- package/dist/esm/storage/sql/SqlBaselines.d.ts +0 -22
- package/dist/esm/storage/sql/SqlBaselines.js +0 -107
- package/dist/esm/storage/sql/SqlBaselines.js.map +0 -1
- package/dist/esm/storage/sql/SqlFileMetadata.d.ts +0 -18
- package/dist/esm/storage/sql/SqlFileMetadata.js +0 -69
- package/dist/esm/storage/sql/SqlFileMetadata.js.map +0 -1
- package/dist/esm/storage/sql/SqlOperations.d.ts +0 -19
- package/dist/esm/storage/sql/SqlOperations.js +0 -122
- package/dist/esm/storage/sql/SqlOperations.js.map +0 -1
- package/dist/esm/storage/sql/SqlReplicas.d.ts +0 -32
- package/dist/esm/storage/sql/SqlReplicas.js +0 -163
- package/dist/esm/storage/sql/SqlReplicas.js.map +0 -1
- package/dist/esm/storage/sql/database.d.ts +0 -9
- package/dist/esm/storage/sql/database.js +0 -24
- package/dist/esm/storage/sql/database.js.map +0 -1
- package/dist/esm/storage/sql/migrations/v1.d.ts +0 -3
- package/dist/esm/storage/sql/migrations/v1.js +0 -59
- package/dist/esm/storage/sql/migrations/v1.js.map +0 -1
- package/dist/esm/storage/sql/migrations/v2.d.ts +0 -3
- package/dist/esm/storage/sql/migrations/v2.js +0 -16
- package/dist/esm/storage/sql/migrations/v2.js.map +0 -1
- package/dist/esm/storage/sql/migrations.d.ts +0 -7
- package/dist/esm/storage/sql/migrations.js +0 -4
- package/dist/esm/storage/sql/migrations.js.map +0 -1
- package/dist/esm/storage/sql/sqlStorage.d.ts +0 -6
- package/dist/esm/storage/sql/sqlStorage.js +0 -35
- package/dist/esm/storage/sql/sqlStorage.js.map +0 -1
- package/dist/esm/storage/sql/tables.d.ts +0 -44
- package/dist/esm/storage/sql/tables.js +0 -2
- package/dist/esm/storage/sql/tables.js.map +0 -1
- package/dist/esm/storage/sqlShard/transfer.d.ts +0 -7
- package/dist/esm/storage/sqlShard/transfer.js +0 -90
- package/dist/esm/storage/sqlShard/transfer.js.map +0 -1
- package/dist/esm/storage/sqlShard/transfer.test.d.ts +0 -1
- package/dist/esm/storage/sqlShard/transfer.test.js +0 -109
- package/dist/esm/storage/sqlShard/transfer.test.js.map +0 -1
- package/src/MessageSender.ts +0 -10
- package/src/Presence.ts +0 -86
- package/src/ReplicaKeepaliveTimers.ts +0 -34
- package/src/Server.ts +0 -859
- package/src/storage/sql/SqlBaselines.ts +0 -147
- package/src/storage/sql/SqlFileMetadata.ts +0 -94
- package/src/storage/sql/SqlOperations.ts +0 -160
- package/src/storage/sql/SqlReplicas.ts +0 -234
- package/src/storage/sql/database.ts +0 -32
- package/src/storage/sql/migrations/v1.ts +0 -64
- package/src/storage/sql/migrations/v2.ts +0 -20
- package/src/storage/sql/migrations.ts +0 -4
- package/src/storage/sql/sqlStorage.ts +0 -57
- package/src/storage/sql/tables.ts +0 -51
- package/src/storage/sqlShard/transfer.test.ts +0 -149
- package/src/storage/sqlShard/transfer.ts +0 -123
- /package/dist/esm/{MessageSender.js → connections/MessageSender.js} +0 -0
- /package/dist/esm/{ServerLibrary.test.d.ts → libraries/Library.test.d.ts} +0 -0
|
@@ -1,48 +1,43 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
await db.schema.dropTable('DocumentBaseline').execute();
|
|
44
|
-
await db.schema.dropTable('OperationHistory').execute();
|
|
45
|
-
await db.schema.dropTable('ReplicaInfo').execute();
|
|
46
|
-
await db.schema.dropTable('FileMetadata').execute();
|
|
47
|
-
}
|
|
1
|
+
export const version = 1;
|
|
2
|
+
export const up = [
|
|
3
|
+
`
|
|
4
|
+
CREATE TABLE IF NOT EXISTS "_Migrations" (
|
|
5
|
+
"id" INTEGER PRIMARY KEY,
|
|
6
|
+
"appliedAt" TEXT NOT NULL
|
|
7
|
+
);`,
|
|
8
|
+
`
|
|
9
|
+
CREATE TABLE IF NOT EXISTS "DocumentBaseline" (
|
|
10
|
+
"oid" TEXT PRIMARY KEY,
|
|
11
|
+
"snapshot" TEXT,
|
|
12
|
+
"timestamp" TEXT NOT NULL
|
|
13
|
+
);
|
|
14
|
+
`,
|
|
15
|
+
`
|
|
16
|
+
CREATE TABLE IF NOT EXISTS "OperationHistory" (
|
|
17
|
+
"oid" TEXT NOT NULL,
|
|
18
|
+
"timestamp" TEXT NOT NULL,
|
|
19
|
+
"data" TEXT NOT NULL,
|
|
20
|
+
"serverOrder" INTEGER NOT NULL DEFAULT 0,
|
|
21
|
+
"replicaId" TEXT NOT NULL,
|
|
22
|
+
PRIMARY KEY ("replicaId", "oid", "timestamp")
|
|
23
|
+
);
|
|
24
|
+
`,
|
|
25
|
+
`
|
|
26
|
+
CREATE TABLE IF NOT EXISTS "ReplicaInfo" (
|
|
27
|
+
"id" TEXT PRIMARY KEY,
|
|
28
|
+
"clientId" TEXT NOT NULL,
|
|
29
|
+
"lastSeenWallClockTime" INTEGER,
|
|
30
|
+
"ackedLogicalTime" TEXT,
|
|
31
|
+
"type" INTEGER NOT NULL DEFAULT 0,
|
|
32
|
+
"ackedServerOrder" INTEGER NOT NULL DEFAULT 0
|
|
33
|
+
);`,
|
|
34
|
+
`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS "FileMetadata" (
|
|
36
|
+
"fileId" TEXT PRIMARY KEY,
|
|
37
|
+
"name" TEXT NOT NULL,
|
|
38
|
+
"type" TEXT NOT NULL,
|
|
39
|
+
"pendingDeleteAt" INTEGER
|
|
40
|
+
);
|
|
41
|
+
`,
|
|
42
|
+
];
|
|
48
43
|
//# sourceMappingURL=v1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v1.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v1.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"v1.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v1.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAEzB,MAAM,CAAC,MAAM,EAAE,GAAG;IACjB;;;;GAIE;IACF;;;;;;CAMA;IACA;;;;;;;;;CASA;IACA;;;;;;;;GAQE;IACF;;;;;;;CAOA;CACA,CAAC"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare
|
|
3
|
-
export declare function down(db: Kysely<any>): Promise<void>;
|
|
1
|
+
export declare const version = 2;
|
|
2
|
+
export declare const up: string[];
|
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
.execute();
|
|
7
|
-
await db.schema
|
|
8
|
-
.alterTable('DocumentBaseline')
|
|
9
|
-
.addColumn('authz', 'text', (cb) => cb.defaultTo(null))
|
|
10
|
-
.execute();
|
|
11
|
-
}
|
|
12
|
-
export async function down(db) {
|
|
13
|
-
await db.schema.alterTable('OperationHistory').dropColumn('authz').execute();
|
|
14
|
-
await db.schema.alterTable('DocumentBaseline').dropColumn('authz').execute();
|
|
15
|
-
}
|
|
1
|
+
export const version = 2;
|
|
2
|
+
export const up = [
|
|
3
|
+
`ALTER TABLE "OperationHistory" ADD COLUMN "authz" TEXT DEFAULT NULL;`,
|
|
4
|
+
`ALTER TABLE "DocumentBaseline" ADD COLUMN "authz" TEXT DEFAULT NULL;`,
|
|
5
|
+
];
|
|
16
6
|
//# sourceMappingURL=v2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v2.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAEzB,MAAM,CAAC,MAAM,EAAE,GAAG;IACjB,sEAAsE;IACtE,sEAAsE;CACtE,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
declare
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
export default _default;
|
|
1
|
+
import { Logger } from '../../logger.js';
|
|
2
|
+
import { SqliteExecutor } from './database.js';
|
|
3
|
+
export declare function getMigrationVersion(run: SqliteExecutor['query']): any;
|
|
4
|
+
export declare function updateMigrationVersion(run: SqliteExecutor['exec'], version: number): void;
|
|
5
|
+
export declare function migrateToLatest(e: Pick<SqliteExecutor, 'exec' | 'query' | 'migrated'>, log: Logger): void;
|
|
@@ -1,4 +1,51 @@
|
|
|
1
1
|
import * as v1 from './migrations/v1.js';
|
|
2
2
|
import * as v2 from './migrations/v2.js';
|
|
3
|
-
export
|
|
3
|
+
export function getMigrationVersion(run) {
|
|
4
|
+
var _a, _b;
|
|
5
|
+
try {
|
|
6
|
+
const result = run(`SELECT id FROM _Migrations
|
|
7
|
+
ORDER BY id DESC
|
|
8
|
+
LIMIT 1;`);
|
|
9
|
+
const value = (_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 0;
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
if (e instanceof Error &&
|
|
14
|
+
e.message.includes('no such table: _Migrations')) {
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
throw e;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function updateMigrationVersion(run, version) {
|
|
21
|
+
run(`INSERT INTO _Migrations (id, appliedAt) VALUES (?, ?)`, [
|
|
22
|
+
version,
|
|
23
|
+
Date.now(),
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
export function migrateToLatest(e, log) {
|
|
27
|
+
const allMigrations = [v1, v2];
|
|
28
|
+
const currentVersion = getMigrationVersion(e.query);
|
|
29
|
+
const pendingMigrations = allMigrations.slice(currentVersion);
|
|
30
|
+
if (pendingMigrations.length === 0) {
|
|
31
|
+
e.migrated = true;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
log('info', `Applying ${pendingMigrations.length} pending migrations...`);
|
|
35
|
+
for (const migration of pendingMigrations) {
|
|
36
|
+
for (const step of migration.up) {
|
|
37
|
+
try {
|
|
38
|
+
e.exec(step);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
log('error', `Error applying migration v${migration.version}:`, err);
|
|
42
|
+
log('error', `SQL:`, step);
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
log('info', `Applied migration v${migration.version}`);
|
|
47
|
+
}
|
|
48
|
+
updateMigrationVersion(e.exec, allMigrations[allMigrations.length - 1].version);
|
|
49
|
+
e.migrated = true;
|
|
50
|
+
}
|
|
4
51
|
//# sourceMappingURL=migrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/migrations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,GAA4B;;IAC/D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,GAAG,CACjB;;YAES,CACT,CAAC;QACF,MAAM,KAAK,GAAG,MAAA,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,EAAE,mCAAI,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IACC,CAAC,YAAY,KAAK;YAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAC/C,CAAC;YACF,OAAO,CAAC,CAAC;QACV,CAAC;QACD,MAAM,CAAC,CAAC;IACT,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,GAA2B,EAC3B,OAAe;IAEf,GAAG,CAAC,uDAAuD,EAAE;QAC5D,OAAO;QACP,IAAI,CAAC,GAAG,EAAE;KACV,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,CAAsD,EACtD,GAAW;IAEX,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/B,MAAM,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,iBAAiB,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QAClB,OAAO;IACR,CAAC;IACD,GAAG,CAAC,MAAM,EAAE,YAAY,iBAAiB,CAAC,MAAM,wBAAwB,CAAC,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC;gBACJ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,OAAO,EAAE,6BAA6B,SAAS,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;gBACrE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,sBAAsB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,sBAAsB,CACrB,CAAC,CAAC,IAAI,EACN,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAC/C,CAAC;IAEF,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AACnB,CAAC"}
|
|
@@ -1,7 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Logger } from '../../logger.js';
|
|
2
|
+
import { Storage, StorageFactory, StorageOptions } from '../Storage.js';
|
|
3
|
+
import { Databases } from './Databases.js';
|
|
4
|
+
import { SqlBaselines } from './SqlBaselines.js';
|
|
5
|
+
import { SqlFileMetadata } from './SqlFileMetadata.js';
|
|
6
|
+
import { SqlOperations } from './SqlOperations.js';
|
|
7
|
+
import { SqlReplicas } from './SqlReplicas.js';
|
|
8
|
+
import { SqliteExecutor } from './database.js';
|
|
9
|
+
export declare const sqlShardStorage: ({ databasesDirectory, disableWal, closeTimeout, fileDeleteExpirationDays, replicaTruancyMinutes, log, }: {
|
|
3
10
|
databasesDirectory: string;
|
|
4
|
-
transferFromUnifiedDatabaseFile?: string;
|
|
5
11
|
disableWal?: boolean;
|
|
6
12
|
closeTimeout?: number;
|
|
7
|
-
|
|
13
|
+
databases?: Databases;
|
|
14
|
+
log?: Logger;
|
|
15
|
+
} & StorageOptions) => StorageFactory;
|
|
16
|
+
export declare class SqlShardStorage implements Storage {
|
|
17
|
+
#private;
|
|
18
|
+
private db;
|
|
19
|
+
baselines: SqlBaselines;
|
|
20
|
+
operations: SqlOperations;
|
|
21
|
+
replicas: SqlReplicas;
|
|
22
|
+
fileMetadata: SqlFileMetadata;
|
|
23
|
+
get open(): boolean;
|
|
24
|
+
constructor(db: SqliteExecutor, options: Required<StorageOptions> & {
|
|
25
|
+
libraryId: string;
|
|
26
|
+
});
|
|
27
|
+
close: () => Promise<void>;
|
|
28
|
+
}
|
|
@@ -1,55 +1,58 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
7
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
|
+
};
|
|
12
|
+
var _SqlShardStorage_open;
|
|
13
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
14
|
+
import { defaultFileExpirationDays, defaultReplicaTruancyMinutes, } from '../../defaults.js';
|
|
15
|
+
import { Databases } from './Databases.js';
|
|
1
16
|
import { SqlBaselines } from './SqlBaselines.js';
|
|
17
|
+
import { SqlFileMetadata } from './SqlFileMetadata.js';
|
|
2
18
|
import { SqlOperations } from './SqlOperations.js';
|
|
3
19
|
import { SqlReplicas } from './SqlReplicas.js';
|
|
4
|
-
|
|
5
|
-
import { Databases } from './Databases.js';
|
|
6
|
-
import { transferToShards } from './transfer.js';
|
|
7
|
-
import { existsSync, mkdirSync, readdirSync } from 'fs';
|
|
8
|
-
export const sqlShardStorage = ({ databasesDirectory, transferFromUnifiedDatabaseFile, disableWal, closeTimeout, }) => {
|
|
9
|
-
let ready = Promise.resolve(undefined);
|
|
20
|
+
export const sqlShardStorage = ({ databasesDirectory, disableWal, closeTimeout, fileDeleteExpirationDays = defaultFileExpirationDays, replicaTruancyMinutes = defaultReplicaTruancyMinutes, log, }) => {
|
|
10
21
|
if (databasesDirectory !== ':memory:' && !existsSync(databasesDirectory)) {
|
|
11
22
|
mkdirSync(databasesDirectory);
|
|
12
23
|
console.info(`Created databases directory: ${databasesDirectory}`);
|
|
13
24
|
}
|
|
14
|
-
if (transferFromUnifiedDatabaseFile) {
|
|
15
|
-
// check if directory is empty
|
|
16
|
-
const files = databasesDirectory === ':memory:' ? [] : readdirSync(databasesDirectory);
|
|
17
|
-
if (files.length > 0) {
|
|
18
|
-
console.error(`Cannot transfer from unified database to non-empty directory: ${databasesDirectory}. This might mean the transfer has already happened and you're free to turn off the transferFromUnifiedDatabaseFile option.`);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
ready = transferToShards({
|
|
22
|
-
file: transferFromUnifiedDatabaseFile,
|
|
23
|
-
directory: databasesDirectory,
|
|
24
|
-
}).then();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
25
|
const dbs = new Databases({
|
|
28
26
|
directory: databasesDirectory,
|
|
29
27
|
disableWal,
|
|
30
28
|
closeTimeout,
|
|
29
|
+
log,
|
|
31
30
|
});
|
|
32
|
-
return (
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
await dbs.destroy();
|
|
40
|
-
};
|
|
41
|
-
const storage = {
|
|
42
|
-
baselines,
|
|
43
|
-
operations,
|
|
44
|
-
replicas,
|
|
45
|
-
fileMetadata,
|
|
46
|
-
close,
|
|
47
|
-
open: false,
|
|
48
|
-
ready: ready.then(() => {
|
|
49
|
-
storage.open = true;
|
|
50
|
-
}),
|
|
51
|
-
};
|
|
52
|
-
return storage;
|
|
31
|
+
return async (libraryId) => {
|
|
32
|
+
const db = await dbs.get(libraryId);
|
|
33
|
+
return new SqlShardStorage(db, {
|
|
34
|
+
fileDeleteExpirationDays,
|
|
35
|
+
replicaTruancyMinutes,
|
|
36
|
+
libraryId,
|
|
37
|
+
});
|
|
53
38
|
};
|
|
54
39
|
};
|
|
40
|
+
export class SqlShardStorage {
|
|
41
|
+
get open() {
|
|
42
|
+
return __classPrivateFieldGet(this, _SqlShardStorage_open, "f");
|
|
43
|
+
}
|
|
44
|
+
constructor(db, options) {
|
|
45
|
+
this.db = db;
|
|
46
|
+
_SqlShardStorage_open.set(this, true);
|
|
47
|
+
this.close = async () => {
|
|
48
|
+
__classPrivateFieldSet(this, _SqlShardStorage_open, false, "f");
|
|
49
|
+
await this.db.close();
|
|
50
|
+
};
|
|
51
|
+
this.baselines = new SqlBaselines(db, options.libraryId);
|
|
52
|
+
this.operations = new SqlOperations(db, options.libraryId);
|
|
53
|
+
this.replicas = new SqlReplicas(db, options.libraryId, options.replicaTruancyMinutes);
|
|
54
|
+
this.fileMetadata = new SqlFileMetadata(db, options.libraryId, options.fileDeleteExpirationDays);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
_SqlShardStorage_open = new WeakMap();
|
|
55
58
|
//# sourceMappingURL=sqlShardStorage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlShardStorage.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/sqlShardStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqlShardStorage.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/sqlShardStorage.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EACN,yBAAyB,EACzB,4BAA4B,GAC5B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC/B,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,wBAAwB,GAAG,yBAAyB,EACpD,qBAAqB,GAAG,4BAA4B,EACpD,GAAG,GAOc,EAAkB,EAAE;IACrC,IAAI,kBAAkB,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1E,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,gCAAgC,kBAAkB,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;QACzB,SAAS,EAAE,kBAAkB;QAC7B,UAAU;QACV,YAAY;QACZ,GAAG;KACH,CAAC,CAAC;IACH,OAAO,KAAK,EAAE,SAAS,EAAE,EAAE;QAC1B,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE;YAC9B,wBAAwB;YACxB,qBAAqB;YACrB,SAAS;SACT,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,eAAe;IAO3B,IAAI,IAAI;QACP,OAAO,uBAAA,IAAI,6BAAM,CAAC;IACnB,CAAC;IAED,YACS,EAAkB,EAC1B,OAAyD;QADjD,OAAE,GAAF,EAAE,CAAgB;QAN3B,gCAAQ,IAAI,EAAC;QAuBb,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,uBAAA,IAAI,yBAAS,KAAK,MAAA,CAAC;YACnB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC;QAjBD,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAC9B,EAAE,EACF,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,qBAAqB,CAC7B,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CACtC,EAAE,EACF,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,wBAAwB,CAChC,CAAC;IACH,CAAC;CAMD"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { ReplicaType } from '@verdant-web/common';
|
|
2
|
-
import { Generated, Selectable } from 'kysely';
|
|
3
2
|
export interface Database {
|
|
4
3
|
OperationHistory: OperationHistoryTable;
|
|
5
4
|
DocumentBaseline: DocumentBaselineTable;
|
|
6
5
|
ReplicaInfo: ReplicaInfoTable;
|
|
7
6
|
FileMetadata: FileMetadataTable;
|
|
7
|
+
_Migrations: {
|
|
8
|
+
id: number;
|
|
9
|
+
appliedAt: string;
|
|
10
|
+
};
|
|
8
11
|
}
|
|
9
12
|
export interface OperationHistoryTable {
|
|
10
13
|
oid: string;
|
|
@@ -14,27 +17,27 @@ export interface OperationHistoryTable {
|
|
|
14
17
|
replicaId: string;
|
|
15
18
|
authz: string | null;
|
|
16
19
|
}
|
|
17
|
-
export type OperationHistoryRow =
|
|
20
|
+
export type OperationHistoryRow = OperationHistoryTable;
|
|
18
21
|
export interface DocumentBaselineTable {
|
|
19
22
|
oid: string;
|
|
20
23
|
snapshot: string;
|
|
21
24
|
timestamp: string;
|
|
22
25
|
authz: string | null;
|
|
23
26
|
}
|
|
24
|
-
export type DocumentBaselineRow =
|
|
27
|
+
export type DocumentBaselineRow = DocumentBaselineTable;
|
|
25
28
|
export interface ReplicaInfoTable {
|
|
26
29
|
id: string;
|
|
27
30
|
clientId: string;
|
|
28
31
|
lastSeenWallClockTime: number | null;
|
|
29
32
|
ackedLogicalTime: string | null;
|
|
30
33
|
type: ReplicaType;
|
|
31
|
-
ackedServerOrder:
|
|
34
|
+
ackedServerOrder: number;
|
|
32
35
|
}
|
|
33
|
-
export type ReplicaInfoRow =
|
|
36
|
+
export type ReplicaInfoRow = ReplicaInfoTable;
|
|
34
37
|
export interface FileMetadataTable {
|
|
35
38
|
fileId: string;
|
|
36
39
|
name: string;
|
|
37
40
|
type: string;
|
|
38
41
|
pendingDeleteAt: number | null;
|
|
39
42
|
}
|
|
40
|
-
export type FileMetadataRow =
|
|
43
|
+
export type FileMetadataRow = FileMetadataTable;
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface StoredReplicaInfo extends ReplicaInfo {
|
|
|
17
17
|
type: ReplicaType;
|
|
18
18
|
ackedServerOrder: number;
|
|
19
19
|
}
|
|
20
|
-
export type LibraryInfo
|
|
20
|
+
export type LibraryInfo = {
|
|
21
21
|
id: string;
|
|
22
22
|
replicas: {
|
|
23
23
|
id: string;
|
|
@@ -25,7 +25,6 @@ export type LibraryInfo<Profile = unknown> = {
|
|
|
25
25
|
ackedServerOrder: number;
|
|
26
26
|
type: ReplicaType;
|
|
27
27
|
truant: boolean;
|
|
28
|
-
profile: Profile;
|
|
29
28
|
}[];
|
|
30
29
|
latestServerOrder: number;
|
|
31
30
|
operationsCount: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdant-web/server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"access": "public",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
"./storage": {
|
|
15
15
|
"import": "./dist/esm/storage/index.js",
|
|
16
16
|
"types": "./dist/esm/storage/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./internals": {
|
|
19
|
+
"import": "./dist/esm/internals.js",
|
|
20
|
+
"types": "./dist/esm/internals.d.ts"
|
|
17
21
|
}
|
|
18
22
|
},
|
|
19
23
|
"publishConfig": {
|
|
@@ -24,29 +28,36 @@
|
|
|
24
28
|
"src/",
|
|
25
29
|
"bin/"
|
|
26
30
|
],
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"hono": "^4.7.2",
|
|
33
|
+
"@hono/node-server": "^1.13.8"
|
|
34
|
+
},
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"hono": {
|
|
37
|
+
"optional": true
|
|
38
|
+
},
|
|
39
|
+
"@hono/node-server": {
|
|
40
|
+
"optional": true
|
|
41
|
+
}
|
|
42
|
+
},
|
|
27
43
|
"dependencies": {
|
|
28
|
-
"@
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"better-sqlite3": "^11.8.1",
|
|
32
|
-
"busboy": "^1.6.0",
|
|
44
|
+
"@hono/node-server": "^1.19.5",
|
|
45
|
+
"better-sqlite3": "^11.10.0",
|
|
46
|
+
"hono": "^4.9.9",
|
|
33
47
|
"jsonwebtoken": "^8.5.1",
|
|
34
|
-
"kysely": "0.27.5",
|
|
35
|
-
"kysely-plugin-serialize": "^0.5.7",
|
|
36
48
|
"minimist": "^1.2.8",
|
|
37
49
|
"ws": "^8.9.0",
|
|
38
|
-
"@verdant-web/common": "
|
|
50
|
+
"@verdant-web/common": "3.0.0"
|
|
39
51
|
},
|
|
40
52
|
"devDependencies": {
|
|
41
53
|
"@types/async-lock": "^1.3.0",
|
|
42
54
|
"@types/better-sqlite3": "^7.6.12",
|
|
43
|
-
"@types/busboy": "^1.5.0",
|
|
44
55
|
"@types/jsonwebtoken": "^8.5.9",
|
|
45
|
-
"@types/node": "
|
|
56
|
+
"@types/node": "24.6.1",
|
|
46
57
|
"@types/ws": "^8.5.3",
|
|
47
58
|
"cross-env": "7.0.3",
|
|
48
|
-
"typescript": "
|
|
49
|
-
"vitest": "
|
|
59
|
+
"typescript": "5.9.3",
|
|
60
|
+
"vitest": "3.2.4"
|
|
50
61
|
},
|
|
51
62
|
"scripts": {
|
|
52
63
|
"build": "tsc",
|
package/src/TokenVerifier.ts
CHANGED
|
@@ -4,6 +4,10 @@ import jwt, { JwtPayload } from 'jsonwebtoken';
|
|
|
4
4
|
export class TokenVerifier {
|
|
5
5
|
constructor(private config: { secret: string }) {}
|
|
6
6
|
|
|
7
|
+
get secret() {
|
|
8
|
+
return this.config.secret;
|
|
9
|
+
}
|
|
10
|
+
|
|
7
11
|
verifyToken = (token: string): TokenInfo => {
|
|
8
12
|
try {
|
|
9
13
|
const decoded = jwt.verify(token, this.config.secret, {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VerdantError } from '@verdant-web/common';
|
|
2
|
+
import { ErrorHandler } from 'hono';
|
|
3
|
+
import { ContentfulStatusCode } from 'hono/utils/http-status';
|
|
4
|
+
|
|
5
|
+
export const errorHandler: ErrorHandler = (err, ctx) => {
|
|
6
|
+
if (err instanceof VerdantError) {
|
|
7
|
+
if (err.code > VerdantError.Code.Unexpected) {
|
|
8
|
+
console.error('Verdant error:', err);
|
|
9
|
+
}
|
|
10
|
+
return ctx.json(err.toResponse(), err.httpStatus as ContentfulStatusCode);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
console.error('Unexpected error:', err);
|
|
14
|
+
return ctx.json(
|
|
15
|
+
new VerdantError(VerdantError.Code.Unexpected).toResponse(),
|
|
16
|
+
500,
|
|
17
|
+
);
|
|
18
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { VerdantError } from '@verdant-web/common';
|
|
2
|
+
|
|
3
|
+
export function getRequestToken(req: Request) {
|
|
4
|
+
if (req.method === 'OPTIONS') {
|
|
5
|
+
// preflight request, np
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
// websocket compat - we only receive one header...
|
|
9
|
+
const protocolHeader = req.headers.get('Sec-WebSocket-Protocol');
|
|
10
|
+
if (protocolHeader) {
|
|
11
|
+
const [type, token] = protocolHeader.split(',');
|
|
12
|
+
if (type === 'Bearer') {
|
|
13
|
+
return token.trim();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const authHeader = req.headers.get('Authorization');
|
|
18
|
+
if (!authHeader) {
|
|
19
|
+
throw new VerdantError(
|
|
20
|
+
VerdantError.Code.NoToken,
|
|
21
|
+
undefined,
|
|
22
|
+
'Authorization header is required',
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
const [type, token] = authHeader.split(' ');
|
|
26
|
+
if (type !== 'Bearer') {
|
|
27
|
+
throw new VerdantError(
|
|
28
|
+
VerdantError.Code.InvalidToken,
|
|
29
|
+
undefined,
|
|
30
|
+
'Authorization type must be Bearer',
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return token;
|
|
34
|
+
}
|