@opendatalabs/connect 0.5.0 → 0.6.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/README.md +149 -49
- package/dist/core/constants.d.ts +28 -2
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +23 -2
- package/dist/core/constants.js.map +1 -1
- package/dist/core/errors.d.ts +43 -2
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +39 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/grants.d.ts +19 -0
- package/dist/core/grants.d.ts.map +1 -0
- package/dist/core/grants.js +31 -0
- package/dist/core/grants.js.map +1 -0
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/types.d.ts +61 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/react/ConnectButton.d.ts +15 -0
- package/dist/react/ConnectButton.d.ts.map +1 -1
- package/dist/react/ConnectButton.js +8 -1
- package/dist/react/ConnectButton.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/useVanaConnect.d.ts +33 -0
- package/dist/react/useVanaConnect.d.ts.map +1 -1
- package/dist/react/useVanaConnect.js +29 -3
- package/dist/react/useVanaConnect.js.map +1 -1
- package/dist/react/useVanaData.d.ts +67 -0
- package/dist/react/useVanaData.d.ts.map +1 -0
- package/dist/react/useVanaData.js +125 -0
- package/dist/react/useVanaData.js.map +1 -0
- package/dist/server/config.d.ts +36 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +44 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/connect.d.ts +40 -1
- package/dist/server/connect.d.ts.map +1 -1
- package/dist/server/connect.js +46 -5
- package/dist/server/connect.js.map +1 -1
- package/dist/server/data-client.d.ts +17 -0
- package/dist/server/data-client.d.ts.map +1 -1
- package/dist/server/data-client.js +24 -7
- package/dist/server/data-client.js.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/manifest-signer.d.ts +22 -0
- package/dist/server/manifest-signer.d.ts.map +1 -1
- package/dist/server/manifest-signer.js +22 -0
- package/dist/server/manifest-signer.js.map +1 -1
- package/dist/server/request-signer.d.ts +18 -0
- package/dist/server/request-signer.d.ts.map +1 -1
- package/dist/server/request-signer.js +6 -0
- package/dist/server/request-signer.js.map +1 -1
- package/dist/server/session-relay.d.ts +22 -0
- package/dist/server/session-relay.d.ts.map +1 -1
- package/dist/server/session-relay.js +12 -4
- package/dist/server/session-relay.js.map +1 -1
- package/dist/server/webhook.d.ts +11 -0
- package/dist/server/webhook.d.ts.map +1 -0
- package/dist/server/webhook.js +18 -0
- package/dist/server/webhook.js.map +1 -0
- package/package.json +2 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAKhC;IACC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CACpB,qDAAqD,EACrD,gBAAgB,CAAC,cAAc,CAChC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,YAAY,CACpB,gCAAgC,EAChC,gBAAgB,CAAC,cAAc,CAChC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,YAAY,CACpB,0DAA0D,EAC1D,gBAAgB,CAAC,cAAc,CAChC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,YAAY,CACpB,2DAA2D,EAC3D,gBAAgB,CAAC,cAAc,CAChC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC"}
|
package/dist/server/connect.d.ts
CHANGED
|
@@ -1,4 +1,43 @@
|
|
|
1
1
|
import type { ConnectConfig, GetDataConfig, SessionInitResult } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a session on the Session Relay and returns the session ID and deep link URL.
|
|
4
|
+
*
|
|
5
|
+
* This is the entry point for the Vana Connect flow. The returned `deepLinkUrl`
|
|
6
|
+
* should be presented to the user to open the Vana Desktop App.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Connection configuration including private key and scopes.
|
|
9
|
+
* @returns Session ID, deep link URL, and expiration timestamp.
|
|
10
|
+
* @throws {@link ConnectError} with code `SESSION_INIT_FAILED` if the relay rejects the request.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const session = await connect({
|
|
15
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
16
|
+
* scopes: ["chatgpt.conversations"],
|
|
17
|
+
* });
|
|
18
|
+
* // session.sessionId, session.deepLinkUrl, session.expiresAt
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
2
21
|
export declare function connect(config: ConnectConfig): Promise<SessionInitResult>;
|
|
3
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Fetches user data from their Personal Server using a signed grant.
|
|
24
|
+
*
|
|
25
|
+
* Resolves the server URL via the Data Portability Gateway, then fetches
|
|
26
|
+
* data for each scope in the grant concurrently.
|
|
27
|
+
*
|
|
28
|
+
* @param config - Data fetch configuration including private key and grant.
|
|
29
|
+
* @returns A `Record` keyed by scope name with the fetched data as values.
|
|
30
|
+
* @throws {@link ConnectError} with code `SERVER_NOT_FOUND` if no server is registered.
|
|
31
|
+
* @throws {@link ConnectError} with code `DATA_FETCH_FAILED` if a scope fetch fails.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const data = await getData({
|
|
36
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
37
|
+
* grant,
|
|
38
|
+
* });
|
|
39
|
+
* const conversations = data["chatgpt.conversations"];
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function getData(config: GetDataConfig): Promise<Record<string, unknown>>;
|
|
4
43
|
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/server/connect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAK1B,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/server/connect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAK1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAgB5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8BlC"}
|
package/dist/server/connect.js
CHANGED
|
@@ -1,14 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getEnvConfig } from "../core/constants.js";
|
|
2
2
|
import { createRequestSigner } from "./request-signer.js";
|
|
3
3
|
import { createSessionRelay } from "./session-relay.js";
|
|
4
4
|
import { createDataClient } from "./data-client.js";
|
|
5
|
+
/**
|
|
6
|
+
* Creates a session on the Session Relay and returns the session ID and deep link URL.
|
|
7
|
+
*
|
|
8
|
+
* This is the entry point for the Vana Connect flow. The returned `deepLinkUrl`
|
|
9
|
+
* should be presented to the user to open the Vana Desktop App.
|
|
10
|
+
*
|
|
11
|
+
* @param config - Connection configuration including private key and scopes.
|
|
12
|
+
* @returns Session ID, deep link URL, and expiration timestamp.
|
|
13
|
+
* @throws {@link ConnectError} with code `SESSION_INIT_FAILED` if the relay rejects the request.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const session = await connect({
|
|
18
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
19
|
+
* scopes: ["chatgpt.conversations"],
|
|
20
|
+
* });
|
|
21
|
+
* // session.sessionId, session.deepLinkUrl, session.expiresAt
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
5
24
|
export async function connect(config) {
|
|
25
|
+
const { sessionRelayUrl } = getEnvConfig(config.environment);
|
|
6
26
|
const signer = createRequestSigner({ privateKey: config.privateKey });
|
|
7
27
|
const granteeAddress = signer.address;
|
|
8
28
|
const relay = createSessionRelay({
|
|
9
29
|
privateKey: config.privateKey,
|
|
10
30
|
granteeAddress,
|
|
11
|
-
sessionRelayUrl
|
|
31
|
+
sessionRelayUrl,
|
|
12
32
|
});
|
|
13
33
|
return relay.initSession({
|
|
14
34
|
scopes: config.scopes,
|
|
@@ -16,11 +36,32 @@ export async function connect(config) {
|
|
|
16
36
|
appUserId: config.appUserId,
|
|
17
37
|
});
|
|
18
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Fetches user data from their Personal Server using a signed grant.
|
|
41
|
+
*
|
|
42
|
+
* Resolves the server URL via the Data Portability Gateway, then fetches
|
|
43
|
+
* data for each scope in the grant concurrently.
|
|
44
|
+
*
|
|
45
|
+
* @param config - Data fetch configuration including private key and grant.
|
|
46
|
+
* @returns A `Record` keyed by scope name with the fetched data as values.
|
|
47
|
+
* @throws {@link ConnectError} with code `SERVER_NOT_FOUND` if no server is registered.
|
|
48
|
+
* @throws {@link ConnectError} with code `DATA_FETCH_FAILED` if a scope fetch fails.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const data = await getData({
|
|
53
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
54
|
+
* grant,
|
|
55
|
+
* });
|
|
56
|
+
* const conversations = data["chatgpt.conversations"];
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
19
59
|
export async function getData(config) {
|
|
60
|
+
const { gatewayUrl } = getEnvConfig(config.environment);
|
|
20
61
|
const { grant } = config;
|
|
21
62
|
const dataClient = createDataClient({
|
|
22
63
|
privateKey: config.privateKey,
|
|
23
|
-
gatewayUrl
|
|
64
|
+
gatewayUrl,
|
|
24
65
|
});
|
|
25
66
|
const serverUrl = await dataClient.resolveServerUrl(grant.serverAddress ?? grant.userAddress);
|
|
26
67
|
const results = await Promise.all(grant.scopes.map(async (scope) => {
|
|
@@ -31,9 +72,9 @@ export async function getData(config) {
|
|
|
31
72
|
});
|
|
32
73
|
return [scope, result];
|
|
33
74
|
}));
|
|
34
|
-
const data =
|
|
75
|
+
const data = {};
|
|
35
76
|
for (const [scope, result] of results) {
|
|
36
|
-
data
|
|
77
|
+
data[scope] = result;
|
|
37
78
|
}
|
|
38
79
|
return data;
|
|
39
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/server/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/server/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAqB;IAErB,MAAM,EAAE,eAAe,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC;IAEtC,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc;QACd,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,WAAW,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEzB,MAAM,UAAU,GAAG,gBAAgB,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,gBAAgB,CACjD,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW,CACzC,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC;YACxC,SAAS;YACT,KAAK;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;IAClC,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import type { DataClientConfig, DataFetchParams } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Low-level client for the Data Portability Gateway and Personal Servers.
|
|
4
|
+
*
|
|
5
|
+
* @see {@link createDataClient} to create an instance.
|
|
6
|
+
*/
|
|
2
7
|
export interface DataClient {
|
|
8
|
+
/** Resolves a user's Personal Server URL via the gateway. */
|
|
3
9
|
resolveServerUrl(userAddress: string): Promise<string>;
|
|
10
|
+
/** Fetches data for a single scope from a Personal Server. */
|
|
4
11
|
fetchData(params: DataFetchParams): Promise<unknown>;
|
|
12
|
+
/** Lists available scopes on a Personal Server. */
|
|
5
13
|
listScopes(params: {
|
|
6
14
|
serverUrl: string;
|
|
7
15
|
}): Promise<unknown>;
|
|
16
|
+
/** Lists available versions for a scope on a Personal Server. */
|
|
8
17
|
listVersions(params: {
|
|
9
18
|
serverUrl: string;
|
|
10
19
|
scope: string;
|
|
11
20
|
}): Promise<unknown>;
|
|
12
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates a low-level Data Gateway / Personal Server client.
|
|
24
|
+
*
|
|
25
|
+
* Prefer the high-level {@link getData} function for most use cases.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Data client configuration.
|
|
28
|
+
* @returns A {@link DataClient} instance.
|
|
29
|
+
*/
|
|
13
30
|
export declare function createDataClient(config: DataClientConfig): DataClient;
|
|
14
31
|
//# sourceMappingURL=data-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-client.d.ts","sourceRoot":"","sources":["../../src/server/data-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG1E,MAAM,WAAW,UAAU;IACzB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,UAAU,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,YAAY,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"data-client.d.ts","sourceRoot":"","sources":["../../src/server/data-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG1E;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,8DAA8D;IAC9D,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,mDAAmD;IACnD,UAAU,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,iEAAiE;IACjE,YAAY,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA0HrE"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import { ConnectError } from "../core/errors.js";
|
|
1
|
+
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
2
|
import { createRequestSigner } from "./request-signer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a low-level Data Gateway / Personal Server client.
|
|
5
|
+
*
|
|
6
|
+
* Prefer the high-level {@link getData} function for most use cases.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Data client configuration.
|
|
9
|
+
* @returns A {@link DataClient} instance.
|
|
10
|
+
*/
|
|
3
11
|
export function createDataClient(config) {
|
|
4
12
|
const gatewayBase = config.gatewayUrl.replace(/\/+$/, "");
|
|
5
13
|
const signer = createRequestSigner({ privateKey: config.privateKey });
|
|
@@ -7,10 +15,10 @@ export function createDataClient(config) {
|
|
|
7
15
|
async resolveServerUrl(userAddress) {
|
|
8
16
|
const res = await fetch(`${gatewayBase}/v1/servers/${userAddress}`);
|
|
9
17
|
if (res.status === 404) {
|
|
10
|
-
throw new ConnectError(`No server registered for ${userAddress}`,
|
|
18
|
+
throw new ConnectError(`No server registered for ${userAddress}`, ConnectErrorCode.SERVER_NOT_FOUND, 404);
|
|
11
19
|
}
|
|
12
20
|
if (!res.ok) {
|
|
13
|
-
throw new ConnectError(`Gateway error: ${res.status}`,
|
|
21
|
+
throw new ConnectError(`Gateway error: ${res.status}`, ConnectErrorCode.GATEWAY_ERROR, res.status);
|
|
14
22
|
}
|
|
15
23
|
const envelope = (await res.json());
|
|
16
24
|
return envelope.data.serverUrl;
|
|
@@ -30,11 +38,20 @@ export function createDataClient(config) {
|
|
|
30
38
|
uri,
|
|
31
39
|
grantId: params.grantId,
|
|
32
40
|
});
|
|
33
|
-
const
|
|
41
|
+
const url = `${base}${uri}`;
|
|
42
|
+
const res = await fetch(url, {
|
|
34
43
|
headers: { Authorization: authHeader },
|
|
35
44
|
});
|
|
36
45
|
if (!res.ok) {
|
|
37
|
-
|
|
46
|
+
const body = await res.text().catch(() => "(unreadable)");
|
|
47
|
+
console.error("[data-client] fetchData failed", {
|
|
48
|
+
status: res.status,
|
|
49
|
+
url,
|
|
50
|
+
scope: params.scope,
|
|
51
|
+
grantId: params.grantId,
|
|
52
|
+
body,
|
|
53
|
+
});
|
|
54
|
+
throw new ConnectError(`Data fetch failed: ${res.status}`, ConnectErrorCode.DATA_FETCH_FAILED, res.status);
|
|
38
55
|
}
|
|
39
56
|
return res.json();
|
|
40
57
|
},
|
|
@@ -50,7 +67,7 @@ export function createDataClient(config) {
|
|
|
50
67
|
headers: { Authorization: authHeader },
|
|
51
68
|
});
|
|
52
69
|
if (!res.ok) {
|
|
53
|
-
throw new ConnectError(`List scopes failed: ${res.status}`,
|
|
70
|
+
throw new ConnectError(`List scopes failed: ${res.status}`, ConnectErrorCode.LIST_SCOPES_FAILED, res.status);
|
|
54
71
|
}
|
|
55
72
|
return res.json();
|
|
56
73
|
},
|
|
@@ -66,7 +83,7 @@ export function createDataClient(config) {
|
|
|
66
83
|
headers: { Authorization: authHeader },
|
|
67
84
|
});
|
|
68
85
|
if (!res.ok) {
|
|
69
|
-
throw new ConnectError(`List versions failed: ${res.status}`,
|
|
86
|
+
throw new ConnectError(`List versions failed: ${res.status}`, ConnectErrorCode.LIST_VERSIONS_FAILED, res.status);
|
|
70
87
|
}
|
|
71
88
|
return res.json();
|
|
72
89
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-client.js","sourceRoot":"","sources":["../../src/server/data-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-client.js","sourceRoot":"","sources":["../../src/server/data-client.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -3,4 +3,6 @@ export { createSessionRelay, type SessionRelay } from "./session-relay.js";
|
|
|
3
3
|
export { createDataClient, type DataClient } from "./data-client.js";
|
|
4
4
|
export { connect, getData } from "./connect.js";
|
|
5
5
|
export { signVanaManifest } from "./manifest-signer.js";
|
|
6
|
+
export { createVanaConfig, type VanaConfig } from "./config.js";
|
|
7
|
+
export { verifyWebhook } from "./webhook.js";
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -3,4 +3,6 @@ export { createSessionRelay } from "./session-relay.js";
|
|
|
3
3
|
export { createDataClient } from "./data-client.js";
|
|
4
4
|
export { connect, getData } from "./connect.js";
|
|
5
5
|
export { signVanaManifest } from "./manifest-signer.js";
|
|
6
|
+
export { createVanaConfig } from "./config.js";
|
|
7
|
+
export { verifyWebhook } from "./webhook.js";
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAmB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAmB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
1
|
import type { VanaManifestConfig, VanaManifestBlock } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Signs a web app manifest block for Vana Desktop App identity verification.
|
|
4
|
+
*
|
|
5
|
+
* Include the returned block under the `vana` key in your web app manifest JSON,
|
|
6
|
+
* and make sure your HTML has `<link rel="manifest" href="/manifest.json">`.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Manifest configuration including private key and app URLs.
|
|
9
|
+
* @returns A signed {@link VanaManifestBlock}.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const vanaBlock = await signVanaManifest({
|
|
14
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
15
|
+
* appUrl: "https://yourapp.com",
|
|
16
|
+
* privacyPolicyUrl: "https://yourapp.com/privacy",
|
|
17
|
+
* termsUrl: "https://yourapp.com/terms",
|
|
18
|
+
* supportUrl: "https://yourapp.com/support",
|
|
19
|
+
* webhookUrl: "https://yourapp.com/api/webhook",
|
|
20
|
+
* });
|
|
21
|
+
* const manifest = { name: "Your App", vana: vanaBlock };
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
2
24
|
export declare function signVanaManifest(config: VanaManifestConfig): Promise<VanaManifestBlock>;
|
|
3
25
|
//# sourceMappingURL=manifest-signer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-signer.d.ts","sourceRoot":"","sources":["../../src/server/manifest-signer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAa9E,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
|
|
1
|
+
{"version":3,"file":"manifest-signer.d.ts","sourceRoot":"","sources":["../../src/server/manifest-signer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAa9E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
|
|
@@ -12,6 +12,28 @@ function canonicalizeJson(obj) {
|
|
|
12
12
|
}
|
|
13
13
|
return sorted;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Signs a web app manifest block for Vana Desktop App identity verification.
|
|
17
|
+
*
|
|
18
|
+
* Include the returned block under the `vana` key in your web app manifest JSON,
|
|
19
|
+
* and make sure your HTML has `<link rel="manifest" href="/manifest.json">`.
|
|
20
|
+
*
|
|
21
|
+
* @param config - Manifest configuration including private key and app URLs.
|
|
22
|
+
* @returns A signed {@link VanaManifestBlock}.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const vanaBlock = await signVanaManifest({
|
|
27
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
28
|
+
* appUrl: "https://yourapp.com",
|
|
29
|
+
* privacyPolicyUrl: "https://yourapp.com/privacy",
|
|
30
|
+
* termsUrl: "https://yourapp.com/terms",
|
|
31
|
+
* supportUrl: "https://yourapp.com/support",
|
|
32
|
+
* webhookUrl: "https://yourapp.com/api/webhook",
|
|
33
|
+
* });
|
|
34
|
+
* const manifest = { name: "Your App", vana: vanaBlock };
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
15
37
|
export async function signVanaManifest(config) {
|
|
16
38
|
const account = privateKeyToAccount(config.privateKey);
|
|
17
39
|
const block = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-signer.js","sourceRoot":"","sources":["../../src/server/manifest-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,IAAI,GAAG,KAAK,WAAW;YAAE,SAAS;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAA0B;IAE1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;IAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"manifest-signer.js","sourceRoot":"","sources":["../../src/server/manifest-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,IAAI,GAAG,KAAK,WAAW;YAAE,SAAS;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAA0B;IAE1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;IAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import type { RequestSignerConfig } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Generates `Web3Signed` authorization headers for protocol requests.
|
|
4
|
+
*
|
|
5
|
+
* @see {@link createRequestSigner} to create an instance.
|
|
6
|
+
*/
|
|
2
7
|
export interface RequestSigner {
|
|
8
|
+
/**
|
|
9
|
+
* Signs a request and returns the `Authorization` header value.
|
|
10
|
+
*
|
|
11
|
+
* @param params - Request metadata (audience, method, URI, optional body and grantId).
|
|
12
|
+
* @returns A `Web3Signed <payload>.<signature>` header string.
|
|
13
|
+
*/
|
|
3
14
|
signRequest(params: {
|
|
4
15
|
aud: string;
|
|
5
16
|
method: string;
|
|
@@ -7,7 +18,14 @@ export interface RequestSigner {
|
|
|
7
18
|
body?: string;
|
|
8
19
|
grantId?: string;
|
|
9
20
|
}): Promise<string>;
|
|
21
|
+
/** The wallet address derived from the private key. */
|
|
10
22
|
readonly address: `0x${string}`;
|
|
11
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Creates a request signer that generates `Web3Signed` authorization headers.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Configuration containing the builder's private key.
|
|
28
|
+
* @returns A {@link RequestSigner} instance.
|
|
29
|
+
*/
|
|
12
30
|
export declare function createRequestSigner(config: RequestSignerConfig): RequestSigner;
|
|
13
31
|
//# sourceMappingURL=request-signer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-signer.d.ts","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA+B5D,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,MAAM,EAAE;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;CACjC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAC1B,aAAa,CAsCf"}
|
|
1
|
+
{"version":3,"file":"request-signer.d.ts","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA+B5D;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAC1B,aAAa,CAsCf"}
|
|
@@ -29,6 +29,12 @@ function computeBodyHash(body) {
|
|
|
29
29
|
const canonicalStr = JSON.stringify(canonical);
|
|
30
30
|
return createHash("sha256").update(canonicalStr).digest("hex");
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Creates a request signer that generates `Web3Signed` authorization headers.
|
|
34
|
+
*
|
|
35
|
+
* @param config - Configuration containing the builder's private key.
|
|
36
|
+
* @returns A {@link RequestSigner} instance.
|
|
37
|
+
*/
|
|
32
38
|
export function createRequestSigner(config) {
|
|
33
39
|
const account = privateKeyToAccount(config.privateKey);
|
|
34
40
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-signer.js","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;SAC/B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,IAAI,GAAG,KAAK,WAAW;YAAE,SAAS;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;
|
|
1
|
+
{"version":3,"file":"request-signer.js","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
import type { SessionRelayConfig, SessionInitParams, SessionInitResult, SessionPollResult } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Low-level client for the Session Relay service.
|
|
4
|
+
*
|
|
5
|
+
* @see {@link createSessionRelay} to create an instance.
|
|
6
|
+
*/
|
|
2
7
|
export interface SessionRelay {
|
|
8
|
+
/** Creates a new session and returns the session ID and deep link URL. */
|
|
3
9
|
initSession(params: SessionInitParams): Promise<SessionInitResult>;
|
|
10
|
+
/** Polls the session status once. */
|
|
4
11
|
pollSession(sessionId: string): Promise<SessionPollResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Polls until the session reaches a terminal state (`approved`, `denied`, or `expired`).
|
|
14
|
+
*
|
|
15
|
+
* @param sessionId - The session to poll.
|
|
16
|
+
* @param opts - Optional polling interval (default 2 s) and timeout (default 15 min).
|
|
17
|
+
* @throws {@link ConnectError} with code `POLL_TIMEOUT` if the timeout is exceeded.
|
|
18
|
+
*/
|
|
5
19
|
pollUntilComplete(sessionId: string, opts?: {
|
|
6
20
|
interval?: number;
|
|
7
21
|
timeout?: number;
|
|
8
22
|
}): Promise<SessionPollResult>;
|
|
9
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Creates a low-level Session Relay client.
|
|
26
|
+
*
|
|
27
|
+
* Prefer the high-level {@link connect} function for most use cases.
|
|
28
|
+
*
|
|
29
|
+
* @param config - Session Relay configuration.
|
|
30
|
+
* @returns A {@link SessionRelay} instance.
|
|
31
|
+
*/
|
|
10
32
|
export declare function createSessionRelay(config: SessionRelayConfig): SessionRelay;
|
|
11
33
|
//# sourceMappingURL=session-relay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-relay.d.ts","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3D,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"session-relay.d.ts","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAG1B;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnE,qCAAqC;IACrC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3D;;;;;;OAMG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CA4F3E"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import { ConnectError } from "../core/errors.js";
|
|
1
|
+
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
2
|
import { createRequestSigner } from "./request-signer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a low-level Session Relay client.
|
|
5
|
+
*
|
|
6
|
+
* Prefer the high-level {@link connect} function for most use cases.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Session Relay configuration.
|
|
9
|
+
* @returns A {@link SessionRelay} instance.
|
|
10
|
+
*/
|
|
3
11
|
export function createSessionRelay(config) {
|
|
4
12
|
const baseUrl = config.sessionRelayUrl.replace(/\/+$/, "");
|
|
5
13
|
const signer = createRequestSigner({ privateKey: config.privateKey });
|
|
@@ -33,7 +41,7 @@ export function createSessionRelay(config) {
|
|
|
33
41
|
.message
|
|
34
42
|
: `Session init failed: ${res.status}`;
|
|
35
43
|
throw new ConnectError(errorMsg, errorBody.error
|
|
36
|
-
?.errorCode ??
|
|
44
|
+
?.errorCode ?? ConnectErrorCode.SESSION_INIT_FAILED, res.status);
|
|
37
45
|
}
|
|
38
46
|
return (await res.json());
|
|
39
47
|
},
|
|
@@ -42,7 +50,7 @@ export function createSessionRelay(config) {
|
|
|
42
50
|
if (!res.ok) {
|
|
43
51
|
const errorBody = await res.json().catch(() => ({}));
|
|
44
52
|
throw new ConnectError(`Poll failed: ${res.status}`, errorBody.error
|
|
45
|
-
?.errorCode ??
|
|
53
|
+
?.errorCode ?? ConnectErrorCode.POLL_FAILED, res.status);
|
|
46
54
|
}
|
|
47
55
|
return (await res.json());
|
|
48
56
|
},
|
|
@@ -59,7 +67,7 @@ export function createSessionRelay(config) {
|
|
|
59
67
|
}
|
|
60
68
|
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
61
69
|
}
|
|
62
|
-
throw new ConnectError("Polling timed out",
|
|
70
|
+
throw new ConnectError("Polling timed out", ConnectErrorCode.POLL_TIMEOUT);
|
|
63
71
|
},
|
|
64
72
|
};
|
|
65
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifies a webhook payload signature.
|
|
3
|
+
*
|
|
4
|
+
* @param payload - The raw request body as a string or Buffer.
|
|
5
|
+
* @param signature - The signature from the webhook request header.
|
|
6
|
+
* @param secret - The shared secret used to verify the signature.
|
|
7
|
+
* @returns The verified payload.
|
|
8
|
+
* @throws {@link ConnectError} with code `WEBHOOK_INVALID` — this function is not yet implemented.
|
|
9
|
+
*/
|
|
10
|
+
export declare function verifyWebhook(payload: string | Buffer, signature: string, secret: string): unknown;
|
|
11
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/server/webhook.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAUT"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Verifies a webhook payload signature.
|
|
4
|
+
*
|
|
5
|
+
* @param payload - The raw request body as a string or Buffer.
|
|
6
|
+
* @param signature - The signature from the webhook request header.
|
|
7
|
+
* @param secret - The shared secret used to verify the signature.
|
|
8
|
+
* @returns The verified payload.
|
|
9
|
+
* @throws {@link ConnectError} with code `WEBHOOK_INVALID` — this function is not yet implemented.
|
|
10
|
+
*/
|
|
11
|
+
export function verifyWebhook(payload, signature, secret) {
|
|
12
|
+
void payload;
|
|
13
|
+
void signature;
|
|
14
|
+
void secret;
|
|
15
|
+
// TODO: Implement when Data Portability Protocol webhook signing spec is available
|
|
16
|
+
throw new ConnectError("verifyWebhook() is not yet implemented. Webhook signing scheme is pending protocol specification.", ConnectErrorCode.WEBHOOK_INVALID);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/server/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAwB,EACxB,SAAiB,EACjB,MAAc;IAEd,KAAK,OAAO,CAAC;IACb,KAAK,SAAS,CAAC;IACf,KAAK,MAAM,CAAC;IAEZ,mFAAmF;IACnF,MAAM,IAAI,YAAY,CACpB,mGAAmG,EACnG,gBAAgB,CAAC,eAAe,CACjC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendatalabs/connect",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "SDK for integrating Vana Data Portability 'Connect data' flows",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"url": "https://github.com/vana-com/vana-connect/issues"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
|
+
"sideEffects": false,
|
|
15
16
|
"publishConfig": {
|
|
16
17
|
"access": "public"
|
|
17
18
|
},
|
|
@@ -69,9 +70,6 @@
|
|
|
69
70
|
"peerDependenciesMeta": {
|
|
70
71
|
"react": {
|
|
71
72
|
"optional": true
|
|
72
|
-
},
|
|
73
|
-
"viem": {
|
|
74
|
-
"optional": true
|
|
75
73
|
}
|
|
76
74
|
},
|
|
77
75
|
"devDependencies": {
|