@opendatalabs/personal-server-ts-server 0.0.1-canary.0d0705b
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/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +2 -0
- package/dist/api.js.map +1 -0
- package/dist/app.d.ts +31 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +94 -0
- package/dist/app.js.map +1 -0
- package/dist/bootstrap.d.ts +29 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +159 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/dev-token.d.ts +6 -0
- package/dist/dev-token.d.ts.map +1 -0
- package/dist/dev-token.js +9 -0
- package/dist/dev-token.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/access-log.d.ts +8 -0
- package/dist/middleware/access-log.d.ts.map +1 -0
- package/dist/middleware/access-log.js +38 -0
- package/dist/middleware/access-log.js.map +1 -0
- package/dist/middleware/body-limit.d.ts +10 -0
- package/dist/middleware/body-limit.d.ts.map +1 -0
- package/dist/middleware/body-limit.js +20 -0
- package/dist/middleware/body-limit.js.map +1 -0
- package/dist/middleware/builder-check.d.ts +8 -0
- package/dist/middleware/builder-check.d.ts.map +1 -0
- package/dist/middleware/builder-check.js +29 -0
- package/dist/middleware/builder-check.js.map +1 -0
- package/dist/middleware/grant-check.d.ts +12 -0
- package/dist/middleware/grant-check.d.ts.map +1 -0
- package/dist/middleware/grant-check.js +90 -0
- package/dist/middleware/grant-check.js.map +1 -0
- package/dist/middleware/owner-check.d.ts +9 -0
- package/dist/middleware/owner-check.d.ts.map +1 -0
- package/dist/middleware/owner-check.js +37 -0
- package/dist/middleware/owner-check.js.map +1 -0
- package/dist/middleware/web3-auth.d.ts +16 -0
- package/dist/middleware/web3-auth.d.ts.map +1 -0
- package/dist/middleware/web3-auth.js +56 -0
- package/dist/middleware/web3-auth.js.map +1 -0
- package/dist/routes/access-logs.d.ts +16 -0
- package/dist/routes/access-logs.d.ts.map +1 -0
- package/dist/routes/access-logs.js +30 -0
- package/dist/routes/access-logs.js.map +1 -0
- package/dist/routes/data.d.ts +20 -0
- package/dist/routes/data.d.ts.map +1 -0
- package/dist/routes/data.js +213 -0
- package/dist/routes/data.js.map +1 -0
- package/dist/routes/grants.d.ts +16 -0
- package/dist/routes/grants.d.ts.map +1 -0
- package/dist/routes/grants.js +122 -0
- package/dist/routes/grants.js.map +1 -0
- package/dist/routes/health.d.ts +14 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +35 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/sync.d.ts +16 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +52 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/routes/ui-config.d.ts +7 -0
- package/dist/routes/ui-config.d.ts.map +1 -0
- package/dist/routes/ui-config.js +89 -0
- package/dist/routes/ui-config.js.map +1 -0
- package/dist/routes/ui.d.ts +6 -0
- package/dist/routes/ui.d.ts.map +1 -0
- package/dist/routes/ui.js +36 -0
- package/dist/routes/ui.js.map +1 -0
- package/package.json +45 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC"}
|
package/dist/api.js
ADDED
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAGb,MAAM,gBAAgB,CAAC"}
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
3
|
+
import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
|
|
4
|
+
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
5
|
+
import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
6
|
+
import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
|
|
7
|
+
import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
|
|
8
|
+
import type { Logger } from "pino";
|
|
9
|
+
export interface IdentityInfo {
|
|
10
|
+
address: `0x${string}`;
|
|
11
|
+
publicKey: `0x${string}`;
|
|
12
|
+
serverId: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface AppDeps {
|
|
15
|
+
logger: Logger;
|
|
16
|
+
version: string;
|
|
17
|
+
startedAt: Date;
|
|
18
|
+
indexManager: IndexManager;
|
|
19
|
+
hierarchyOptions: HierarchyManagerOptions;
|
|
20
|
+
serverOrigin: string;
|
|
21
|
+
serverOwner?: `0x${string}`;
|
|
22
|
+
identity?: IdentityInfo;
|
|
23
|
+
gateway: GatewayClient;
|
|
24
|
+
accessLogWriter: AccessLogWriter;
|
|
25
|
+
accessLogReader: AccessLogReader;
|
|
26
|
+
devToken?: string;
|
|
27
|
+
configPath?: string;
|
|
28
|
+
syncManager?: SyncManager | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function createApp(deps: AppDeps): Hono;
|
|
31
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAQnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAsH7C"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { ProtocolError } from "@opendatalabs/personal-server-ts-core/errors";
|
|
3
|
+
import { healthRoute } from "./routes/health.js";
|
|
4
|
+
import { dataRoutes } from "./routes/data.js";
|
|
5
|
+
import { grantsRoutes } from "./routes/grants.js";
|
|
6
|
+
import { accessLogsRoutes } from "./routes/access-logs.js";
|
|
7
|
+
import { syncRoutes } from "./routes/sync.js";
|
|
8
|
+
import { uiConfigRoutes } from "./routes/ui-config.js";
|
|
9
|
+
import { uiRoute } from "./routes/ui.js";
|
|
10
|
+
export function createApp(deps) {
|
|
11
|
+
const app = new Hono();
|
|
12
|
+
// Mount health route
|
|
13
|
+
app.route("/", healthRoute({
|
|
14
|
+
version: deps.version,
|
|
15
|
+
startedAt: deps.startedAt,
|
|
16
|
+
serverOwner: deps.serverOwner,
|
|
17
|
+
identity: deps.identity,
|
|
18
|
+
gateway: deps.gateway,
|
|
19
|
+
logger: deps.logger,
|
|
20
|
+
}));
|
|
21
|
+
// Mount data routes (ingest + read + delete)
|
|
22
|
+
app.route("/v1/data", dataRoutes({
|
|
23
|
+
indexManager: deps.indexManager,
|
|
24
|
+
hierarchyOptions: deps.hierarchyOptions,
|
|
25
|
+
logger: deps.logger,
|
|
26
|
+
serverOrigin: deps.serverOrigin,
|
|
27
|
+
serverOwner: deps.serverOwner,
|
|
28
|
+
gateway: deps.gateway,
|
|
29
|
+
accessLogWriter: deps.accessLogWriter,
|
|
30
|
+
devToken: deps.devToken,
|
|
31
|
+
syncManager: deps.syncManager ?? null,
|
|
32
|
+
}));
|
|
33
|
+
// Mount grants routes (POST /verify is public, GET / needs owner auth)
|
|
34
|
+
app.route("/v1/grants", grantsRoutes({
|
|
35
|
+
logger: deps.logger,
|
|
36
|
+
gateway: deps.gateway,
|
|
37
|
+
serverOwner: deps.serverOwner,
|
|
38
|
+
serverOrigin: deps.serverOrigin,
|
|
39
|
+
devToken: deps.devToken,
|
|
40
|
+
}));
|
|
41
|
+
// Mount access-logs routes (all owner auth)
|
|
42
|
+
app.route("/v1/access-logs", accessLogsRoutes({
|
|
43
|
+
logger: deps.logger,
|
|
44
|
+
accessLogReader: deps.accessLogReader,
|
|
45
|
+
serverOrigin: deps.serverOrigin,
|
|
46
|
+
serverOwner: deps.serverOwner,
|
|
47
|
+
devToken: deps.devToken,
|
|
48
|
+
}));
|
|
49
|
+
// Mount sync routes (all owner auth)
|
|
50
|
+
app.route("/v1/sync", syncRoutes({
|
|
51
|
+
logger: deps.logger,
|
|
52
|
+
serverOrigin: deps.serverOrigin,
|
|
53
|
+
serverOwner: deps.serverOwner,
|
|
54
|
+
devToken: deps.devToken,
|
|
55
|
+
syncManager: deps.syncManager ?? null,
|
|
56
|
+
}));
|
|
57
|
+
// Mount dev UI routes when dev token is available
|
|
58
|
+
if (deps.devToken) {
|
|
59
|
+
app.route("/ui", uiRoute({ devToken: deps.devToken }));
|
|
60
|
+
if (deps.configPath) {
|
|
61
|
+
app.route("/ui/api", uiConfigRoutes({
|
|
62
|
+
devToken: deps.devToken,
|
|
63
|
+
configPath: deps.configPath,
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Global error handler
|
|
68
|
+
app.onError((err, c) => {
|
|
69
|
+
if (err instanceof ProtocolError) {
|
|
70
|
+
deps.logger.warn({ err }, err.message);
|
|
71
|
+
return c.json(err.toJSON(), err.code);
|
|
72
|
+
}
|
|
73
|
+
deps.logger.error({ err }, "Unhandled error");
|
|
74
|
+
return c.json({
|
|
75
|
+
error: {
|
|
76
|
+
code: 500,
|
|
77
|
+
errorCode: "INTERNAL_ERROR",
|
|
78
|
+
message: "Internal server error",
|
|
79
|
+
},
|
|
80
|
+
}, 500);
|
|
81
|
+
});
|
|
82
|
+
// 404 fallback
|
|
83
|
+
app.notFound((c) => {
|
|
84
|
+
return c.json({
|
|
85
|
+
error: {
|
|
86
|
+
code: 404,
|
|
87
|
+
errorCode: "NOT_FOUND",
|
|
88
|
+
message: "Not found",
|
|
89
|
+
},
|
|
90
|
+
}, 404);
|
|
91
|
+
});
|
|
92
|
+
return app;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ServerConfig } from "@opendatalabs/personal-server-ts-core/schemas";
|
|
2
|
+
import { type Logger } from "@opendatalabs/personal-server-ts-core/logger";
|
|
3
|
+
import { type IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
4
|
+
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
5
|
+
import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
|
|
6
|
+
import type { ServerAccount } from "@opendatalabs/personal-server-ts-core/keys";
|
|
7
|
+
import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
|
|
8
|
+
import { type SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
|
|
9
|
+
import type { Hono } from "hono";
|
|
10
|
+
export interface ServerContext {
|
|
11
|
+
app: Hono;
|
|
12
|
+
logger: Logger;
|
|
13
|
+
config: ServerConfig;
|
|
14
|
+
startedAt: Date;
|
|
15
|
+
indexManager: IndexManager;
|
|
16
|
+
gatewayClient: GatewayClient;
|
|
17
|
+
accessLogReader: AccessLogReader;
|
|
18
|
+
serverAccount?: ServerAccount;
|
|
19
|
+
serverSigner?: ServerSigner;
|
|
20
|
+
syncManager: SyncManager | null;
|
|
21
|
+
devToken?: string;
|
|
22
|
+
cleanup: () => void;
|
|
23
|
+
}
|
|
24
|
+
export interface CreateServerOptions {
|
|
25
|
+
serverDir?: string;
|
|
26
|
+
dataDir?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function createServer(config: ServerConfig, options?: CreateServerOptions): Promise<ServerContext>;
|
|
29
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAKlF,OAAO,EAEL,KAAK,MAAM,EACZ,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,qDAAqD,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAMnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAKhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAkLxB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { DEFAULT_SERVER_DIR, DEFAULT_DATA_DIR, } from "@opendatalabs/personal-server-ts-core/config";
|
|
3
|
+
import { createLogger, } from "@opendatalabs/personal-server-ts-core/logger";
|
|
4
|
+
import { initializeDatabase, createIndexManager, } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
5
|
+
import { createGatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
6
|
+
import { createAccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
7
|
+
import { createAccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
|
|
8
|
+
import { deriveMasterKey, recoverServerOwner, loadOrCreateServerAccount, } from "@opendatalabs/personal-server-ts-core/keys";
|
|
9
|
+
import { createServerSigner, createRequestSigner, } from "@opendatalabs/personal-server-ts-core/signing";
|
|
10
|
+
import { createSyncCursor, createSyncManager, } from "@opendatalabs/personal-server-ts-core/sync";
|
|
11
|
+
import { createVanaStorageAdapter } from "@opendatalabs/personal-server-ts-core/storage/adapters";
|
|
12
|
+
import { createApp } from "./app.js";
|
|
13
|
+
import { generateDevToken } from "./dev-token.js";
|
|
14
|
+
export async function createServer(config, options) {
|
|
15
|
+
const logger = createLogger(config.logging);
|
|
16
|
+
const startedAt = new Date();
|
|
17
|
+
const serverDir = options?.serverDir ?? DEFAULT_SERVER_DIR;
|
|
18
|
+
const dataDir = options?.dataDir ?? DEFAULT_DATA_DIR;
|
|
19
|
+
const indexPath = join(serverDir, "index.db");
|
|
20
|
+
const configPath = join(serverDir, "config.json");
|
|
21
|
+
const db = initializeDatabase(indexPath);
|
|
22
|
+
const indexManager = createIndexManager(db);
|
|
23
|
+
const hierarchyOptions = { dataDir };
|
|
24
|
+
const gatewayClient = createGatewayClient(config.gateway.url);
|
|
25
|
+
const serverOrigin = config.server.origin;
|
|
26
|
+
// Derive server owner from VANA_MASTER_KEY_SIGNATURE env var
|
|
27
|
+
const masterKeySignature = process.env.VANA_MASTER_KEY_SIGNATURE;
|
|
28
|
+
let serverOwner;
|
|
29
|
+
let serverAccount;
|
|
30
|
+
let serverSigner;
|
|
31
|
+
let identity;
|
|
32
|
+
if (masterKeySignature) {
|
|
33
|
+
serverOwner = await recoverServerOwner(masterKeySignature);
|
|
34
|
+
deriveMasterKey(masterKeySignature); // validate signature format
|
|
35
|
+
logger.info({ owner: serverOwner }, "Server owner derived from master key");
|
|
36
|
+
// Load or create server keypair from disk
|
|
37
|
+
const keyPath = join(serverDir, "key.json");
|
|
38
|
+
serverAccount = loadOrCreateServerAccount(keyPath);
|
|
39
|
+
logger.info({ owner: serverOwner, serverAddress: serverAccount.address }, "Server signing account loaded");
|
|
40
|
+
serverSigner = createServerSigner(serverAccount, {
|
|
41
|
+
chainId: config.gateway.chainId,
|
|
42
|
+
contracts: config.gateway.contracts,
|
|
43
|
+
});
|
|
44
|
+
// Check registration (Data Connect handles actual registration)
|
|
45
|
+
let serverId = null;
|
|
46
|
+
try {
|
|
47
|
+
const serverInfo = await gatewayClient.getServer(serverAccount.address);
|
|
48
|
+
serverId = serverInfo?.id ?? null;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Gateway unreachable — assume not registered
|
|
52
|
+
}
|
|
53
|
+
if (serverId) {
|
|
54
|
+
logger.info("Server registered with gateway — signing delegation active");
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
logger.warn({
|
|
58
|
+
serverAddress: serverAccount.address,
|
|
59
|
+
publicKey: serverAccount.publicKey,
|
|
60
|
+
}, "Server not registered. Register personal server with the gateway to enable delegation.");
|
|
61
|
+
}
|
|
62
|
+
identity = {
|
|
63
|
+
address: serverAccount.address,
|
|
64
|
+
publicKey: serverAccount.publicKey,
|
|
65
|
+
serverId,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
logger.warn("VANA_MASTER_KEY_SIGNATURE not set — owner-restricted endpoints will return 500");
|
|
70
|
+
}
|
|
71
|
+
// --- Sync engine setup ---
|
|
72
|
+
let syncManager = null;
|
|
73
|
+
if (config.sync.enabled &&
|
|
74
|
+
masterKeySignature &&
|
|
75
|
+
serverOwner &&
|
|
76
|
+
serverAccount &&
|
|
77
|
+
serverSigner) {
|
|
78
|
+
const masterKey = deriveMasterKey(masterKeySignature);
|
|
79
|
+
const vanaConfig = config.storage.config.vana ?? {
|
|
80
|
+
apiUrl: "https://storage.vana.com",
|
|
81
|
+
};
|
|
82
|
+
const requestSigner = createRequestSigner(serverAccount);
|
|
83
|
+
const storageAdapter = createVanaStorageAdapter({
|
|
84
|
+
apiUrl: vanaConfig.apiUrl,
|
|
85
|
+
ownerAddress: serverOwner,
|
|
86
|
+
signer: requestSigner,
|
|
87
|
+
});
|
|
88
|
+
const configPath_ = join(serverDir, "server.json");
|
|
89
|
+
const cursor = createSyncCursor(configPath_);
|
|
90
|
+
const uploadDeps = {
|
|
91
|
+
indexManager,
|
|
92
|
+
hierarchyOptions,
|
|
93
|
+
storageAdapter,
|
|
94
|
+
gateway: gatewayClient,
|
|
95
|
+
signer: serverSigner,
|
|
96
|
+
masterKey,
|
|
97
|
+
serverOwner,
|
|
98
|
+
logger,
|
|
99
|
+
};
|
|
100
|
+
const downloadDeps = {
|
|
101
|
+
indexManager,
|
|
102
|
+
hierarchyOptions,
|
|
103
|
+
storageAdapter,
|
|
104
|
+
gateway: gatewayClient,
|
|
105
|
+
cursor,
|
|
106
|
+
masterKey,
|
|
107
|
+
serverOwner,
|
|
108
|
+
logger,
|
|
109
|
+
};
|
|
110
|
+
syncManager = createSyncManager(uploadDeps, downloadDeps);
|
|
111
|
+
syncManager.start();
|
|
112
|
+
logger.info("Sync engine started");
|
|
113
|
+
}
|
|
114
|
+
else if (config.sync.enabled) {
|
|
115
|
+
logger.warn("Sync enabled in config but VANA_MASTER_KEY_SIGNATURE not set — sync disabled");
|
|
116
|
+
}
|
|
117
|
+
const logsDir = join(serverDir, "logs");
|
|
118
|
+
const accessLogWriter = createAccessLogWriter(logsDir);
|
|
119
|
+
const accessLogReader = createAccessLogReader(logsDir);
|
|
120
|
+
// Generate ephemeral dev token when devUi is enabled
|
|
121
|
+
const devToken = config.devUi.enabled ? generateDevToken() : undefined;
|
|
122
|
+
const app = createApp({
|
|
123
|
+
logger,
|
|
124
|
+
version: "0.0.1",
|
|
125
|
+
startedAt,
|
|
126
|
+
indexManager,
|
|
127
|
+
hierarchyOptions,
|
|
128
|
+
serverOrigin,
|
|
129
|
+
serverOwner,
|
|
130
|
+
identity,
|
|
131
|
+
gateway: gatewayClient,
|
|
132
|
+
accessLogWriter,
|
|
133
|
+
accessLogReader,
|
|
134
|
+
devToken,
|
|
135
|
+
configPath,
|
|
136
|
+
syncManager,
|
|
137
|
+
});
|
|
138
|
+
const cleanup = () => {
|
|
139
|
+
if (syncManager) {
|
|
140
|
+
syncManager.stop();
|
|
141
|
+
}
|
|
142
|
+
indexManager.close();
|
|
143
|
+
};
|
|
144
|
+
return {
|
|
145
|
+
app,
|
|
146
|
+
logger,
|
|
147
|
+
config,
|
|
148
|
+
startedAt,
|
|
149
|
+
indexManager,
|
|
150
|
+
gatewayClient,
|
|
151
|
+
accessLogReader,
|
|
152
|
+
serverAccount,
|
|
153
|
+
serverSigner,
|
|
154
|
+
syncManager,
|
|
155
|
+
devToken,
|
|
156
|
+
cleanup,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-token.d.ts","sourceRoot":"","sources":["../src/dev-token.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Generates a random 32-byte hex string for use as an ephemeral dev token.
|
|
4
|
+
* This token is generated once at startup and lives only in memory.
|
|
5
|
+
*/
|
|
6
|
+
export function generateDevToken() {
|
|
7
|
+
return randomBytes(32).toString("hex");
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=dev-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-token.js","sourceRoot":"","sources":["../src/dev-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { serve } from "@hono/node-server";
|
|
2
|
+
import { loadConfig } from "@opendatalabs/personal-server-ts-core/config";
|
|
3
|
+
import { createServer } from "./bootstrap.js";
|
|
4
|
+
const DRAIN_TIMEOUT_MS = 5_000;
|
|
5
|
+
async function main() {
|
|
6
|
+
const config = await loadConfig();
|
|
7
|
+
const { app, logger, devToken } = await createServer(config);
|
|
8
|
+
const server = serve({ fetch: app.fetch, port: config.server.port }, (info) => {
|
|
9
|
+
logger.info({ port: info.port, version: "0.0.1" }, "Server started");
|
|
10
|
+
if (devToken) {
|
|
11
|
+
logger.info({ url: `http://localhost:${info.port}/ui` }, "Dev UI available");
|
|
12
|
+
logger.info({ devToken }, "Dev token (ephemeral)");
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
function shutdown(signal) {
|
|
16
|
+
logger.info({ signal }, "Shutdown signal received, draining connections");
|
|
17
|
+
server.close(() => {
|
|
18
|
+
logger.info("Server stopped");
|
|
19
|
+
process.exit(0);
|
|
20
|
+
});
|
|
21
|
+
// Force exit after drain timeout
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
logger.warn("Drain timeout exceeded, forcing exit");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}, DRAIN_TIMEOUT_MS).unref();
|
|
26
|
+
}
|
|
27
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
28
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
29
|
+
}
|
|
30
|
+
main().catch((err) => {
|
|
31
|
+
console.error("Failed to start server:", err);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,KAAK,CAClB,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAC9C,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAErE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,oBAAoB,IAAI,CAAC,IAAI,KAAK,EAAE,EAC3C,kBAAkB,CACnB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,SAAS,QAAQ,CAAC,MAAc;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,gDAAgD,CAAC,CAAC;QAE1E,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
|
|
3
|
+
/**
|
|
4
|
+
* Logs builder data access AFTER successful response (2xx).
|
|
5
|
+
* Fire-and-forget: write failures don't affect response.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createAccessLogMiddleware(writer: AccessLogWriter): MiddlewareHandler;
|
|
8
|
+
//# sourceMappingURL=access-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAIhG;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CAoCnB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Logs builder data access AFTER successful response (2xx).
|
|
4
|
+
* Fire-and-forget: write failures don't affect response.
|
|
5
|
+
*/
|
|
6
|
+
export function createAccessLogMiddleware(writer) {
|
|
7
|
+
return async (c, next) => {
|
|
8
|
+
await next();
|
|
9
|
+
// Only log on 2xx responses
|
|
10
|
+
if (c.res.status < 200 || c.res.status >= 300) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const auth = c.get("auth");
|
|
14
|
+
const grant = c.get("grant");
|
|
15
|
+
if (!auth || !grant) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const scope = c.req.param("scope") ?? "unknown";
|
|
19
|
+
try {
|
|
20
|
+
await writer.write({
|
|
21
|
+
logId: randomUUID(),
|
|
22
|
+
grantId: grant.id,
|
|
23
|
+
builder: auth.signer,
|
|
24
|
+
action: "read",
|
|
25
|
+
scope,
|
|
26
|
+
timestamp: new Date().toISOString(),
|
|
27
|
+
ipAddress: c.req.header("x-forwarded-for") ??
|
|
28
|
+
c.req.header("x-real-ip") ??
|
|
29
|
+
"unknown",
|
|
30
|
+
userAgent: c.req.header("user-agent") ?? "unknown",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Fire-and-forget: write failures don't affect response
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=access-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-log.js","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAuB;IAEvB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,EAAE,CAAC;QAEb,4BAA4B;QAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;QACvD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAqC,CAAC;QAEjE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC;gBACjB,KAAK,EAAE,UAAU,EAAE;gBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EACP,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBAC/B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;oBACzB,SAAS;gBACX,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
/** 50 MB — max body size for data ingest routes */
|
|
3
|
+
export declare const DATA_INGEST_MAX_SIZE: number;
|
|
4
|
+
/** 1 MB — default max body size for general routes */
|
|
5
|
+
export declare const DEFAULT_MAX_SIZE: number;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a Hono body-limit middleware that returns 413 JSON on overflow.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createBodyLimit(maxSize: number): MiddlewareHandler;
|
|
10
|
+
//# sourceMappingURL=body-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/body-limit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAErD,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,QAAkB,CAAC;AAEhD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAalE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { bodyLimit } from "hono/body-limit";
|
|
2
|
+
/** 50 MB — max body size for data ingest routes */
|
|
3
|
+
export const DATA_INGEST_MAX_SIZE = 50 * 1024 * 1024;
|
|
4
|
+
/** 1 MB — default max body size for general routes */
|
|
5
|
+
export const DEFAULT_MAX_SIZE = 1 * 1024 * 1024;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a Hono body-limit middleware that returns 413 JSON on overflow.
|
|
8
|
+
*/
|
|
9
|
+
export function createBodyLimit(maxSize) {
|
|
10
|
+
return bodyLimit({
|
|
11
|
+
maxSize,
|
|
12
|
+
onError: (c) => {
|
|
13
|
+
return c.json({
|
|
14
|
+
error: "CONTENT_TOO_LARGE",
|
|
15
|
+
message: `Request body exceeds maximum size of ${maxSize} bytes`,
|
|
16
|
+
}, 413);
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=body-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-limit.js","sourceRoot":"","sources":["../../src/middleware/body-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,mDAAmD;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAErD,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,SAAS,CAAC;QACf,OAAO;QACP,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE,mBAAmB;gBAC1B,OAAO,EAAE,wCAAwC,OAAO,QAAQ;aACjE,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
3
|
+
/**
|
|
4
|
+
* Verifies authenticated signer is a registered builder via Gateway.
|
|
5
|
+
* Must run AFTER web3-auth middleware.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createBuilderCheckMiddleware(gateway: GatewayClient): MiddlewareHandler;
|
|
8
|
+
//# sourceMappingURL=builder-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-check.d.ts","sourceRoot":"","sources":["../../src/middleware/builder-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAInF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAyBnB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { UnregisteredBuilderError } from "@opendatalabs/personal-server-ts-core/errors";
|
|
2
|
+
/**
|
|
3
|
+
* Verifies authenticated signer is a registered builder via Gateway.
|
|
4
|
+
* Must run AFTER web3-auth middleware.
|
|
5
|
+
*/
|
|
6
|
+
export function createBuilderCheckMiddleware(gateway) {
|
|
7
|
+
return async (c, next) => {
|
|
8
|
+
if (c.get("devBypass")) {
|
|
9
|
+
await next();
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const auth = c.get("auth");
|
|
13
|
+
try {
|
|
14
|
+
const registered = await gateway.isRegisteredBuilder(auth.signer);
|
|
15
|
+
if (!registered) {
|
|
16
|
+
const err = new UnregisteredBuilderError();
|
|
17
|
+
return c.json(err.toJSON(), 401);
|
|
18
|
+
}
|
|
19
|
+
await next();
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err instanceof UnregisteredBuilderError) {
|
|
23
|
+
return c.json(err.toJSON(), 401);
|
|
24
|
+
}
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=builder-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-check.js","sourceRoot":"","sources":["../../src/middleware/builder-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AAExF;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAsB;IAEtB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAiB,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,IAAI,wBAAwB,EAAE,CAAC;gBAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;gBAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
|
|
3
|
+
/**
|
|
4
|
+
* Enforces grant for data reads. Must run AFTER web3-auth middleware.
|
|
5
|
+
* Fetches grant from Gateway, checks revocation/expiry/scope/grantee.
|
|
6
|
+
* Sets c.set('grant', grantResponse).
|
|
7
|
+
*/
|
|
8
|
+
export declare function createGrantCheckMiddleware(params: {
|
|
9
|
+
gateway: GatewayClient;
|
|
10
|
+
serverOwner?: `0x${string}`;
|
|
11
|
+
}): MiddlewareHandler;
|
|
12
|
+
//# sourceMappingURL=grant-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant-check.d.ts","sourceRoot":"","sources":["../../src/middleware/grant-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAmCnF;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CAC7B,GAAG,iBAAiB,CAyEpB"}
|