@opendatalabs/personal-server-ts-core 0.0.1-canary.0078f25
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/auth/web3-signed.d.ts +48 -0
- package/dist/auth/web3-signed.d.ts.map +1 -0
- package/dist/auth/web3-signed.js +110 -0
- package/dist/auth/web3-signed.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +14 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +38 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +22 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/errors/catalog.d.ts +41 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +79 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/gateway/client.d.ts +98 -0
- package/dist/gateway/client.d.ts.map +1 -0
- package/dist/gateway/client.js +171 -0
- package/dist/gateway/client.js.map +1 -0
- package/dist/grants/eip712.d.ts +28 -0
- package/dist/grants/eip712.d.ts.map +1 -0
- package/dist/grants/eip712.js +30 -0
- package/dist/grants/eip712.js.map +1 -0
- package/dist/grants/index.d.ts +5 -0
- package/dist/grants/index.d.ts.map +1 -0
- package/dist/grants/index.js +3 -0
- package/dist/grants/index.js.map +1 -0
- package/dist/grants/types.d.ts +29 -0
- package/dist/grants/types.d.ts.map +1 -0
- package/dist/grants/types.js +6 -0
- package/dist/grants/types.js.map +1 -0
- package/dist/grants/verify.d.ts +24 -0
- package/dist/grants/verify.d.ts.map +1 -0
- package/dist/grants/verify.js +71 -0
- package/dist/grants/verify.js.map +1 -0
- package/dist/keys/derive.d.ts +18 -0
- package/dist/keys/derive.d.ts.map +1 -0
- package/dist/keys/derive.js +43 -0
- package/dist/keys/derive.js.map +1 -0
- package/dist/keys/index.d.ts +3 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +3 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/keys/server-account.d.ts +28 -0
- package/dist/keys/server-account.d.ts.map +1 -0
- package/dist/keys/server-account.js +48 -0
- package/dist/keys/server-account.js.map +1 -0
- package/dist/logger/index.d.ts +5 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +9 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logging/access-log.d.ts +15 -0
- package/dist/logging/access-log.d.ts.map +1 -0
- package/dist/logging/access-log.js +25 -0
- package/dist/logging/access-log.js.map +1 -0
- package/dist/logging/access-reader.d.ts +19 -0
- package/dist/logging/access-reader.d.ts.map +1 -0
- package/dist/logging/access-reader.js +50 -0
- package/dist/logging/access-reader.js.map +1 -0
- package/dist/schemas/data-file.d.ts +20 -0
- package/dist/schemas/data-file.d.ts.map +1 -0
- package/dist/schemas/data-file.js +23 -0
- package/dist/schemas/data-file.js.map +1 -0
- package/dist/schemas/server-config.d.ts +116 -0
- package/dist/schemas/server-config.d.ts.map +1 -0
- package/dist/schemas/server-config.js +131 -0
- package/dist/schemas/server-config.js.map +1 -0
- package/dist/scopes/index.d.ts +3 -0
- package/dist/scopes/index.d.ts.map +1 -0
- package/dist/scopes/index.js +3 -0
- package/dist/scopes/index.js.map +1 -0
- package/dist/scopes/match.d.ts +13 -0
- package/dist/scopes/match.d.ts.map +1 -0
- package/dist/scopes/match.js +23 -0
- package/dist/scopes/match.js.map +1 -0
- package/dist/scopes/parse.d.ts +12 -0
- package/dist/scopes/parse.d.ts.map +1 -0
- package/dist/scopes/parse.js +29 -0
- package/dist/scopes/parse.js.map +1 -0
- package/dist/signing/eip712.d.ts +69 -0
- package/dist/signing/eip712.d.ts.map +1 -0
- package/dist/signing/eip712.js +68 -0
- package/dist/signing/eip712.js.map +1 -0
- package/dist/signing/index.d.ts +4 -0
- package/dist/signing/index.d.ts.map +1 -0
- package/dist/signing/index.js +4 -0
- package/dist/signing/index.js.map +1 -0
- package/dist/signing/request-signer.d.ts +12 -0
- package/dist/signing/request-signer.d.ts.map +1 -0
- package/dist/signing/request-signer.js +48 -0
- package/dist/signing/request-signer.js.map +1 -0
- package/dist/signing/signer.d.ts +14 -0
- package/dist/signing/signer.d.ts.map +1 -0
- package/dist/signing/signer.js +37 -0
- package/dist/signing/signer.js.map +1 -0
- package/dist/storage/adapters/index.d.ts +3 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +2 -0
- package/dist/storage/adapters/index.js.map +1 -0
- package/dist/storage/adapters/interface.d.ts +47 -0
- package/dist/storage/adapters/interface.d.ts.map +1 -0
- package/dist/storage/adapters/interface.js +2 -0
- package/dist/storage/adapters/interface.js.map +1 -0
- package/dist/storage/adapters/vana.d.ts +32 -0
- package/dist/storage/adapters/vana.d.ts.map +1 -0
- package/dist/storage/adapters/vana.js +96 -0
- package/dist/storage/adapters/vana.js.map +1 -0
- package/dist/storage/encryption/decrypt.d.ts +10 -0
- package/dist/storage/encryption/decrypt.d.ts.map +1 -0
- package/dist/storage/encryption/decrypt.js +19 -0
- package/dist/storage/encryption/decrypt.js.map +1 -0
- package/dist/storage/encryption/encrypt.d.ts +10 -0
- package/dist/storage/encryption/encrypt.d.ts.map +1 -0
- package/dist/storage/encryption/encrypt.js +19 -0
- package/dist/storage/encryption/encrypt.js.map +1 -0
- package/dist/storage/encryption/index.d.ts +3 -0
- package/dist/storage/encryption/index.d.ts.map +1 -0
- package/dist/storage/encryption/index.js +3 -0
- package/dist/storage/encryption/index.js.map +1 -0
- package/dist/storage/hierarchy/index.d.ts +4 -0
- package/dist/storage/hierarchy/index.d.ts.map +1 -0
- package/dist/storage/hierarchy/index.js +3 -0
- package/dist/storage/hierarchy/index.js.map +1 -0
- package/dist/storage/hierarchy/manager.d.ts +23 -0
- package/dist/storage/hierarchy/manager.d.ts.map +1 -0
- package/dist/storage/hierarchy/manager.js +60 -0
- package/dist/storage/hierarchy/manager.js.map +1 -0
- package/dist/storage/hierarchy/paths.d.ts +11 -0
- package/dist/storage/hierarchy/paths.d.ts.map +1 -0
- package/dist/storage/hierarchy/paths.js +36 -0
- package/dist/storage/hierarchy/paths.js.map +1 -0
- package/dist/storage/index/index.d.ts +4 -0
- package/dist/storage/index/index.d.ts.map +1 -0
- package/dist/storage/index/index.js +3 -0
- package/dist/storage/index/index.js.map +1 -0
- package/dist/storage/index/manager.d.ts +37 -0
- package/dist/storage/index/manager.d.ts.map +1 -0
- package/dist/storage/index/manager.js +132 -0
- package/dist/storage/index/manager.js.map +1 -0
- package/dist/storage/index/schema.d.ts +4 -0
- package/dist/storage/index/schema.d.ts.map +1 -0
- package/dist/storage/index/schema.js +27 -0
- package/dist/storage/index/schema.js.map +1 -0
- package/dist/storage/index/types.d.ts +20 -0
- package/dist/storage/index/types.d.ts.map +1 -0
- package/dist/storage/index/types.js +2 -0
- package/dist/storage/index/types.js.map +1 -0
- package/dist/sync/cursor.d.ts +12 -0
- package/dist/sync/cursor.d.ts.map +1 -0
- package/dist/sync/cursor.js +19 -0
- package/dist/sync/cursor.js.map +1 -0
- package/dist/sync/engine/sync-manager.d.ts +25 -0
- package/dist/sync/engine/sync-manager.d.ts.map +1 -0
- package/dist/sync/engine/sync-manager.js +136 -0
- package/dist/sync/engine/sync-manager.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/types.d.ts +40 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/workers/download.d.ts +41 -0
- package/dist/sync/workers/download.d.ts.map +1 -0
- package/dist/sync/workers/download.js +90 -0
- package/dist/sync/workers/download.js.map +1 -0
- package/dist/sync/workers/upload.d.ts +43 -0
- package/dist/sync/workers/upload.d.ts.map +1 -0
- package/dist/sync/workers/upload.js +75 -0
- package/dist/sync/workers/upload.js.map +1 -0
- package/dist/test-utils/index.d.ts +2 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +2 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/wallet.d.ts +40 -0
- package/dist/test-utils/wallet.d.ts.map +1 -0
- package/dist/test-utils/wallet.js +74 -0
- package/dist/test-utils/wallet.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web3Signed Authorization header parsing and verification.
|
|
3
|
+
*
|
|
4
|
+
* Header format: "Web3Signed {base64url(payload)}.{signature}"
|
|
5
|
+
* Payload is JSON with fields: aud, method, uri, bodyHash, iat, exp, grantId?
|
|
6
|
+
* Signature is EIP-191 over the base64url-encoded payload string.
|
|
7
|
+
*/
|
|
8
|
+
export interface Web3SignedPayload {
|
|
9
|
+
aud: string;
|
|
10
|
+
method: string;
|
|
11
|
+
uri: string;
|
|
12
|
+
bodyHash: string;
|
|
13
|
+
iat: number;
|
|
14
|
+
exp: number;
|
|
15
|
+
grantId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface VerifiedAuth {
|
|
18
|
+
signer: `0x${string}`;
|
|
19
|
+
payload: Web3SignedPayload;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse "Web3Signed <base64url>.<signature>" header value.
|
|
23
|
+
* Throws MissingAuthError if header is missing/empty.
|
|
24
|
+
* Throws InvalidSignatureError if format is invalid.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseWeb3SignedHeader(headerValue: string | undefined): {
|
|
27
|
+
payloadBase64: string;
|
|
28
|
+
payload: Web3SignedPayload;
|
|
29
|
+
signature: `0x${string}`;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Full verification: parse header, recover signer via EIP-191, check claims.
|
|
33
|
+
*
|
|
34
|
+
* Steps:
|
|
35
|
+
* 1. Parse header -> base64url + signature
|
|
36
|
+
* 2. Recover signer via recoverMessageAddress (EIP-191) over the base64url string
|
|
37
|
+
* 3. Check aud === expectedOrigin, method === expectedMethod, uri === expectedPath
|
|
38
|
+
* 4. Check iat/exp within clock skew (60s)
|
|
39
|
+
* 5. Return { signer, payload }
|
|
40
|
+
*/
|
|
41
|
+
export declare function verifyWeb3Signed(params: {
|
|
42
|
+
headerValue: string | undefined;
|
|
43
|
+
expectedOrigin: string;
|
|
44
|
+
expectedMethod: string;
|
|
45
|
+
expectedPath: string;
|
|
46
|
+
now?: number;
|
|
47
|
+
}): Promise<VerifiedAuth>;
|
|
48
|
+
//# sourceMappingURL=web3-signed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web3-signed.d.ts","sourceRoot":"","sources":["../../src/auth/web3-signed.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAaD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;CAC1B,CAmCA;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,YAAY,CAAC,CAqDxB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web3Signed Authorization header parsing and verification.
|
|
3
|
+
*
|
|
4
|
+
* Header format: "Web3Signed {base64url(payload)}.{signature}"
|
|
5
|
+
* Payload is JSON with fields: aud, method, uri, bodyHash, iat, exp, grantId?
|
|
6
|
+
* Signature is EIP-191 over the base64url-encoded payload string.
|
|
7
|
+
*/
|
|
8
|
+
import { recoverMessageAddress } from "viem";
|
|
9
|
+
import { MissingAuthError, InvalidSignatureError, ExpiredTokenError, } from "../errors/catalog.js";
|
|
10
|
+
const WEB3_SIGNED_PREFIX = "Web3Signed ";
|
|
11
|
+
const CLOCK_SKEW_SECONDS = 60;
|
|
12
|
+
/** Decode a base64url string (no padding) to UTF-8. */
|
|
13
|
+
function base64urlDecode(input) {
|
|
14
|
+
let base64 = input.replace(/-/g, "+").replace(/_/g, "/");
|
|
15
|
+
const padLength = (4 - (base64.length % 4)) % 4;
|
|
16
|
+
base64 += "=".repeat(padLength);
|
|
17
|
+
return Buffer.from(base64, "base64").toString("utf-8");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse "Web3Signed <base64url>.<signature>" header value.
|
|
21
|
+
* Throws MissingAuthError if header is missing/empty.
|
|
22
|
+
* Throws InvalidSignatureError if format is invalid.
|
|
23
|
+
*/
|
|
24
|
+
export function parseWeb3SignedHeader(headerValue) {
|
|
25
|
+
if (!headerValue) {
|
|
26
|
+
throw new MissingAuthError();
|
|
27
|
+
}
|
|
28
|
+
if (!headerValue.startsWith(WEB3_SIGNED_PREFIX)) {
|
|
29
|
+
throw new InvalidSignatureError({ reason: "Missing Web3Signed prefix" });
|
|
30
|
+
}
|
|
31
|
+
const value = headerValue.slice(WEB3_SIGNED_PREFIX.length);
|
|
32
|
+
const dotIndex = value.indexOf(".");
|
|
33
|
+
if (dotIndex === -1 || dotIndex === 0 || dotIndex === value.length - 1) {
|
|
34
|
+
throw new InvalidSignatureError({ reason: "Invalid header format" });
|
|
35
|
+
}
|
|
36
|
+
const payloadBase64 = value.slice(0, dotIndex);
|
|
37
|
+
const signatureStr = value.slice(dotIndex + 1);
|
|
38
|
+
if (!signatureStr.startsWith("0x")) {
|
|
39
|
+
throw new InvalidSignatureError({ reason: "Invalid signature format" });
|
|
40
|
+
}
|
|
41
|
+
let payload;
|
|
42
|
+
try {
|
|
43
|
+
const decoded = base64urlDecode(payloadBase64);
|
|
44
|
+
payload = JSON.parse(decoded);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new InvalidSignatureError({ reason: "Invalid payload encoding" });
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
payloadBase64,
|
|
51
|
+
payload,
|
|
52
|
+
signature: signatureStr,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Full verification: parse header, recover signer via EIP-191, check claims.
|
|
57
|
+
*
|
|
58
|
+
* Steps:
|
|
59
|
+
* 1. Parse header -> base64url + signature
|
|
60
|
+
* 2. Recover signer via recoverMessageAddress (EIP-191) over the base64url string
|
|
61
|
+
* 3. Check aud === expectedOrigin, method === expectedMethod, uri === expectedPath
|
|
62
|
+
* 4. Check iat/exp within clock skew (60s)
|
|
63
|
+
* 5. Return { signer, payload }
|
|
64
|
+
*/
|
|
65
|
+
export async function verifyWeb3Signed(params) {
|
|
66
|
+
const { payloadBase64, payload, signature } = parseWeb3SignedHeader(params.headerValue);
|
|
67
|
+
// Recover signer from EIP-191 signature over the base64url payload string
|
|
68
|
+
let signer;
|
|
69
|
+
try {
|
|
70
|
+
signer = await recoverMessageAddress({
|
|
71
|
+
message: payloadBase64,
|
|
72
|
+
signature,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new InvalidSignatureError({ reason: "Signature recovery failed" });
|
|
77
|
+
}
|
|
78
|
+
// Verify claims
|
|
79
|
+
if (payload.aud !== params.expectedOrigin) {
|
|
80
|
+
throw new InvalidSignatureError({
|
|
81
|
+
reason: "Audience mismatch",
|
|
82
|
+
expected: params.expectedOrigin,
|
|
83
|
+
actual: payload.aud,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (payload.method !== params.expectedMethod) {
|
|
87
|
+
throw new InvalidSignatureError({
|
|
88
|
+
reason: "Method mismatch",
|
|
89
|
+
expected: params.expectedMethod,
|
|
90
|
+
actual: payload.method,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (payload.uri !== params.expectedPath) {
|
|
94
|
+
throw new InvalidSignatureError({
|
|
95
|
+
reason: "URI mismatch",
|
|
96
|
+
expected: params.expectedPath,
|
|
97
|
+
actual: payload.uri,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Time checks
|
|
101
|
+
const now = params.now ?? Math.floor(Date.now() / 1000);
|
|
102
|
+
if (payload.exp < now - CLOCK_SKEW_SECONDS) {
|
|
103
|
+
throw new ExpiredTokenError({ reason: "Token expired" });
|
|
104
|
+
}
|
|
105
|
+
if (payload.iat > now + CLOCK_SKEW_SECONDS) {
|
|
106
|
+
throw new ExpiredTokenError({ reason: "Token issued in the future" });
|
|
107
|
+
}
|
|
108
|
+
return { signer, payload };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=web3-signed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web3-signed.js","sourceRoot":"","sources":["../../src/auth/web3-signed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const DEFAULT_ROOT_PATH: string;
|
|
2
|
+
export declare const DEFAULT_DATA_DIR: string;
|
|
3
|
+
export declare const DEFAULT_CONFIG_PATH: string;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Use DEFAULT_ROOT_PATH instead.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_VANA_DIR: string;
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated Use DEFAULT_ROOT_PATH instead.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_SERVER_DIR: string;
|
|
12
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,QAAqC,CAAC;AACpE,eAAO,MAAM,gBAAgB,QAAkC,CAAC;AAChE,eAAO,MAAM,mBAAmB,QAAyC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAoB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAoB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
export const DEFAULT_ROOT_PATH = join(homedir(), "personal-server");
|
|
4
|
+
export const DEFAULT_DATA_DIR = join(DEFAULT_ROOT_PATH, "data");
|
|
5
|
+
export const DEFAULT_CONFIG_PATH = join(DEFAULT_ROOT_PATH, "config.json");
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated Use DEFAULT_ROOT_PATH instead.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_VANA_DIR = DEFAULT_ROOT_PATH;
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated Use DEFAULT_ROOT_PATH instead.
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_SERVER_DIR = DEFAULT_ROOT_PATH;
|
|
14
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { DEFAULT_ROOT_PATH, DEFAULT_VANA_DIR, DEFAULT_SERVER_DIR, DEFAULT_DATA_DIR, DEFAULT_CONFIG_PATH, } from "./defaults.js";
|
|
2
|
+
export { loadConfig, saveConfig, type LoadConfigOptions } from "./loader.js";
|
|
3
|
+
export { expandHomePath, resolveRootPath } from "./paths.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { DEFAULT_ROOT_PATH, DEFAULT_VANA_DIR, DEFAULT_SERVER_DIR, DEFAULT_DATA_DIR, DEFAULT_CONFIG_PATH, } from "./defaults.js";
|
|
2
|
+
export { loadConfig, saveConfig } from "./loader.js";
|
|
3
|
+
export { expandHomePath, resolveRootPath } from "./paths.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,UAAU,EAA0B,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ServerConfig } from "../schemas/server-config.js";
|
|
2
|
+
export interface LoadConfigOptions {
|
|
3
|
+
configPath?: string;
|
|
4
|
+
rootPath?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function loadConfig(options?: LoadConfigOptions): Promise<ServerConfig>;
|
|
7
|
+
export declare function saveConfig(config: ServerConfig, options?: LoadConfigOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { ServerConfigSchema, } from "../schemas/server-config.js";
|
|
4
|
+
import { resolveRootPath } from "./paths.js";
|
|
5
|
+
export async function loadConfig(options) {
|
|
6
|
+
const configPath = options?.configPath ??
|
|
7
|
+
join(resolveRootPath(options?.rootPath), "config.json");
|
|
8
|
+
let raw;
|
|
9
|
+
try {
|
|
10
|
+
raw = await readFile(configPath, "utf-8");
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
if (err instanceof Error &&
|
|
14
|
+
"code" in err &&
|
|
15
|
+
err.code === "ENOENT") {
|
|
16
|
+
// File doesn't exist — will use empty object for defaults
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const parsed = raw !== undefined ? JSON.parse(raw) : {};
|
|
23
|
+
const config = ServerConfigSchema.parse(parsed);
|
|
24
|
+
// Write back so that defaults are visible and editable in config.json
|
|
25
|
+
const serialized = JSON.stringify(config, null, 2) + "\n";
|
|
26
|
+
if (serialized !== raw) {
|
|
27
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
28
|
+
await writeFile(configPath, serialized);
|
|
29
|
+
}
|
|
30
|
+
return config;
|
|
31
|
+
}
|
|
32
|
+
export async function saveConfig(config, options) {
|
|
33
|
+
const configPath = options?.configPath ??
|
|
34
|
+
join(resolveRootPath(options?.rootPath), "config.json");
|
|
35
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
36
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO7C,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA2B;IAE3B,MAAM,UAAU,GACd,OAAO,EAAE,UAAU;QACnB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;IAE1D,IAAI,GAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IACE,GAAG,YAAY,KAAK;YACpB,MAAM,IAAI,GAAG;YACZ,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAChD,CAAC;YACD,0DAA0D;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEhD,sEAAsE;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAoB,EACpB,OAA2B;IAE3B,MAAM,UAAU,GACd,OAAO,EAAE,UAAU;QACnB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;IAC1D,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expands a leading "~" to the current user's home directory.
|
|
3
|
+
*/
|
|
4
|
+
export declare function expandHomePath(input: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the configured root path (or default) to an absolute path.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveRootPath(input?: string): string;
|
|
9
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { DEFAULT_ROOT_PATH } from "./defaults.js";
|
|
4
|
+
/**
|
|
5
|
+
* Expands a leading "~" to the current user's home directory.
|
|
6
|
+
*/
|
|
7
|
+
export function expandHomePath(input) {
|
|
8
|
+
if (input === "~") {
|
|
9
|
+
return homedir();
|
|
10
|
+
}
|
|
11
|
+
if (input.startsWith("~/")) {
|
|
12
|
+
return resolve(homedir(), input.slice(2));
|
|
13
|
+
}
|
|
14
|
+
return input;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the configured root path (or default) to an absolute path.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveRootPath(input) {
|
|
20
|
+
return resolve(expandHomePath(input ?? DEFAULT_ROOT_PATH));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error catalog mapping to Vana Data Portability Protocol spec §8.2.
|
|
3
|
+
*/
|
|
4
|
+
export declare class ProtocolError extends Error {
|
|
5
|
+
readonly code: number;
|
|
6
|
+
readonly errorCode: string;
|
|
7
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
8
|
+
constructor(code: number, errorCode: string, message: string, details?: Record<string, unknown> | undefined);
|
|
9
|
+
toJSON(): Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export declare class MissingAuthError extends ProtocolError {
|
|
12
|
+
constructor(details?: Record<string, unknown>);
|
|
13
|
+
}
|
|
14
|
+
export declare class InvalidSignatureError extends ProtocolError {
|
|
15
|
+
constructor(details?: Record<string, unknown>);
|
|
16
|
+
}
|
|
17
|
+
export declare class UnregisteredBuilderError extends ProtocolError {
|
|
18
|
+
constructor(details?: Record<string, unknown>);
|
|
19
|
+
}
|
|
20
|
+
export declare class NotOwnerError extends ProtocolError {
|
|
21
|
+
constructor(details?: Record<string, unknown>);
|
|
22
|
+
}
|
|
23
|
+
export declare class ExpiredTokenError extends ProtocolError {
|
|
24
|
+
constructor(details?: Record<string, unknown>);
|
|
25
|
+
}
|
|
26
|
+
export declare class GrantRequiredError extends ProtocolError {
|
|
27
|
+
constructor(details?: Record<string, unknown>);
|
|
28
|
+
}
|
|
29
|
+
export declare class GrantExpiredError extends ProtocolError {
|
|
30
|
+
constructor(details?: Record<string, unknown>);
|
|
31
|
+
}
|
|
32
|
+
export declare class GrantRevokedError extends ProtocolError {
|
|
33
|
+
constructor(details?: Record<string, unknown>);
|
|
34
|
+
}
|
|
35
|
+
export declare class ScopeMismatchError extends ProtocolError {
|
|
36
|
+
constructor(details?: Record<string, unknown>);
|
|
37
|
+
}
|
|
38
|
+
export declare class ContentTooLargeError extends ProtocolError {
|
|
39
|
+
constructor(details?: Record<string, unknown>);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/errors/catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,aAAc,SAAQ,KAAK;aAEpB,IAAI,EAAE,MAAM;aACZ,SAAS,EAAE,MAAM;aAEjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAHjC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;IAMnD,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAUlC;AAID,qBAAa,gBAAiB,SAAQ,aAAa;gBACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,wBAAyB,SAAQ,aAAa;gBAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAID,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAID,qBAAa,oBAAqB,SAAQ,aAAa;gBACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error catalog mapping to Vana Data Portability Protocol spec §8.2.
|
|
3
|
+
*/
|
|
4
|
+
export class ProtocolError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
errorCode;
|
|
7
|
+
details;
|
|
8
|
+
constructor(code, errorCode, message, details) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.errorCode = errorCode;
|
|
12
|
+
this.details = details;
|
|
13
|
+
this.name = this.constructor.name;
|
|
14
|
+
}
|
|
15
|
+
toJSON() {
|
|
16
|
+
return {
|
|
17
|
+
error: {
|
|
18
|
+
code: this.code,
|
|
19
|
+
errorCode: this.errorCode,
|
|
20
|
+
message: this.message,
|
|
21
|
+
...(this.details !== undefined && { details: this.details }),
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// 401 — Authentication errors
|
|
27
|
+
export class MissingAuthError extends ProtocolError {
|
|
28
|
+
constructor(details) {
|
|
29
|
+
super(401, "MISSING_AUTH", "Missing authentication", details);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class InvalidSignatureError extends ProtocolError {
|
|
33
|
+
constructor(details) {
|
|
34
|
+
super(401, "INVALID_SIGNATURE", "Invalid signature", details);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class UnregisteredBuilderError extends ProtocolError {
|
|
38
|
+
constructor(details) {
|
|
39
|
+
super(401, "UNREGISTERED_BUILDER", "Unregistered builder", details);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class NotOwnerError extends ProtocolError {
|
|
43
|
+
constructor(details) {
|
|
44
|
+
super(401, "NOT_OWNER", "Not the owner", details);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class ExpiredTokenError extends ProtocolError {
|
|
48
|
+
constructor(details) {
|
|
49
|
+
super(401, "EXPIRED_TOKEN", "Token has expired", details);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 403 — Authorization/grant errors
|
|
53
|
+
export class GrantRequiredError extends ProtocolError {
|
|
54
|
+
constructor(details) {
|
|
55
|
+
super(403, "GRANT_REQUIRED", "Grant required", details);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class GrantExpiredError extends ProtocolError {
|
|
59
|
+
constructor(details) {
|
|
60
|
+
super(403, "GRANT_EXPIRED", "Grant has expired", details);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class GrantRevokedError extends ProtocolError {
|
|
64
|
+
constructor(details) {
|
|
65
|
+
super(403, "GRANT_REVOKED", "Grant has been revoked", details);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class ScopeMismatchError extends ProtocolError {
|
|
69
|
+
constructor(details) {
|
|
70
|
+
super(403, "SCOPE_MISMATCH", "Scope not granted", details);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 413 — Payload errors
|
|
74
|
+
export class ContentTooLargeError extends ProtocolError {
|
|
75
|
+
constructor(details) {
|
|
76
|
+
super(413, "CONTENT_TOO_LARGE", "Content too large", details);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/errors/catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAEpB;IACA;IAEA;IAJlB,YACkB,IAAY,EACZ,SAAiB,EACjC,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,SAAI,GAAJ,IAAI,CAAQ;QACZ,cAAS,GAAT,SAAS,CAAQ;QAEjB,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;aAC7D;SACF,CAAC;IACJ,CAAC;CACF;AAED,8BAA8B;AAE9B,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IACjD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IACzD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,mCAAmC;AAEnC,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,uBAAuB;AAEvB,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IACrD,YAAY,OAAiC;QAC3C,KAAK,CAAC,GAAG,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway client for communicating with the Vana Gateway API.
|
|
3
|
+
* Provides builder registration checks and grant lookups.
|
|
4
|
+
*
|
|
5
|
+
* All Gateway GET endpoints return responses wrapped in:
|
|
6
|
+
* { data: T, proof: GatewayProof }
|
|
7
|
+
* This client unwraps the envelope and returns just the data.
|
|
8
|
+
*/
|
|
9
|
+
import type { GatewayGrantResponse } from "../grants/types.js";
|
|
10
|
+
import type { FileRecord, FileListResult } from "../sync/types.js";
|
|
11
|
+
/** Gateway response envelope wrapping all GET responses */
|
|
12
|
+
export interface GatewayEnvelope<T> {
|
|
13
|
+
data: T;
|
|
14
|
+
proof: GatewayProof;
|
|
15
|
+
}
|
|
16
|
+
export interface GatewayProof {
|
|
17
|
+
signature: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
gatewayAddress: string;
|
|
20
|
+
requestHash: string;
|
|
21
|
+
responseHash: string;
|
|
22
|
+
userSignature: string;
|
|
23
|
+
status: string;
|
|
24
|
+
chainBlockHeight: number;
|
|
25
|
+
}
|
|
26
|
+
export interface Builder {
|
|
27
|
+
id: string;
|
|
28
|
+
ownerAddress: string;
|
|
29
|
+
granteeAddress: string;
|
|
30
|
+
publicKey: string;
|
|
31
|
+
appUrl: string;
|
|
32
|
+
addedAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface Schema {
|
|
35
|
+
id: string;
|
|
36
|
+
ownerAddress: string;
|
|
37
|
+
name: string;
|
|
38
|
+
definitionUrl: string;
|
|
39
|
+
scope: string;
|
|
40
|
+
addedAt: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ServerInfo {
|
|
43
|
+
id: string;
|
|
44
|
+
ownerAddress: string;
|
|
45
|
+
serverAddress: string;
|
|
46
|
+
publicKey: string;
|
|
47
|
+
serverUrl: string;
|
|
48
|
+
addedAt: string;
|
|
49
|
+
}
|
|
50
|
+
export interface GrantListItem {
|
|
51
|
+
id: string;
|
|
52
|
+
grantorAddress: string;
|
|
53
|
+
granteeId: string;
|
|
54
|
+
grant: string;
|
|
55
|
+
fileIds: string[];
|
|
56
|
+
status: "pending" | "confirmed";
|
|
57
|
+
addedAt: string;
|
|
58
|
+
revokedAt: string | null;
|
|
59
|
+
revocationSignature: string | null;
|
|
60
|
+
}
|
|
61
|
+
export interface RegisterFileParams {
|
|
62
|
+
ownerAddress: string;
|
|
63
|
+
url: string;
|
|
64
|
+
schemaId: string;
|
|
65
|
+
signature: string;
|
|
66
|
+
}
|
|
67
|
+
export interface CreateGrantParams {
|
|
68
|
+
grantorAddress: string;
|
|
69
|
+
granteeId: string;
|
|
70
|
+
grant: string;
|
|
71
|
+
fileIds: string[];
|
|
72
|
+
signature: string;
|
|
73
|
+
}
|
|
74
|
+
export interface RevokeGrantParams {
|
|
75
|
+
grantId: string;
|
|
76
|
+
grantorAddress: string;
|
|
77
|
+
signature: string;
|
|
78
|
+
}
|
|
79
|
+
export interface GatewayClient {
|
|
80
|
+
isRegisteredBuilder(address: string): Promise<boolean>;
|
|
81
|
+
getBuilder(address: string): Promise<Builder | null>;
|
|
82
|
+
getGrant(grantId: string): Promise<GatewayGrantResponse | null>;
|
|
83
|
+
listGrantsByUser(userAddress: string): Promise<GrantListItem[]>;
|
|
84
|
+
getSchemaForScope(scope: string): Promise<Schema | null>;
|
|
85
|
+
getServer(address: string): Promise<ServerInfo | null>;
|
|
86
|
+
getFile(fileId: string): Promise<FileRecord | null>;
|
|
87
|
+
listFilesSince(owner: string, cursor: string | null): Promise<FileListResult>;
|
|
88
|
+
getSchema(schemaId: string): Promise<Schema | null>;
|
|
89
|
+
registerFile(params: RegisterFileParams): Promise<{
|
|
90
|
+
fileId?: string;
|
|
91
|
+
}>;
|
|
92
|
+
createGrant(params: CreateGrantParams): Promise<{
|
|
93
|
+
grantId?: string;
|
|
94
|
+
}>;
|
|
95
|
+
revokeGrant(params: RevokeGrantParams): Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
export declare function createGatewayClient(baseUrl: string): GatewayClient;
|
|
98
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/gateway/client.ts"],"names":[],"mappings":"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"}
|