@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
package/dist/core/types.d.ts
CHANGED
|
@@ -1,70 +1,131 @@
|
|
|
1
|
+
/** Possible states of a Vana Connect session from the client's perspective. */
|
|
1
2
|
export type ConnectionStatus = "idle" | "connecting" | "waiting" | "approved" | "denied" | "expired" | "error";
|
|
3
|
+
/** Parameters for creating a new session on the Session Relay. */
|
|
2
4
|
export interface SessionInitParams {
|
|
5
|
+
/** Data scopes to request (e.g. `["chatgpt.conversations"]`). */
|
|
3
6
|
scopes: string[];
|
|
7
|
+
/** Public HTTPS URL for grant event notifications. Localhost is rejected. */
|
|
4
8
|
webhookUrl?: string;
|
|
9
|
+
/** Your app's user ID for correlation. */
|
|
5
10
|
appUserId?: string;
|
|
6
11
|
}
|
|
12
|
+
/** Result returned by {@link SessionRelay.initSession}. */
|
|
7
13
|
export interface SessionInitResult {
|
|
14
|
+
/** Unique session identifier used for polling. */
|
|
8
15
|
sessionId: string;
|
|
16
|
+
/** Deep link URL that opens the Vana Desktop App. */
|
|
9
17
|
deepLinkUrl: string;
|
|
18
|
+
/** ISO 8601 expiration timestamp for the session. */
|
|
10
19
|
expiresAt: string;
|
|
11
20
|
}
|
|
21
|
+
/** Result returned by {@link SessionRelay.pollSession}. */
|
|
12
22
|
export interface SessionPollResult {
|
|
23
|
+
/** Current session status. */
|
|
13
24
|
status: "pending" | "claimed" | "approved" | "denied" | "expired";
|
|
25
|
+
/** Grant payload, present when status is `"approved"`. */
|
|
14
26
|
grant?: GrantPayload;
|
|
27
|
+
/** Reason for denial, present when status is `"denied"`. */
|
|
15
28
|
reason?: string;
|
|
16
29
|
}
|
|
30
|
+
/** Payload describing a user's approved data grant. */
|
|
17
31
|
export interface GrantPayload {
|
|
32
|
+
/** On-chain permission ID. */
|
|
18
33
|
grantId: string;
|
|
34
|
+
/** User's wallet address. */
|
|
19
35
|
userAddress: string;
|
|
36
|
+
/** Builder's registered wallet address. */
|
|
20
37
|
builderAddress: string;
|
|
38
|
+
/** Approved data scopes. */
|
|
21
39
|
scopes: string[];
|
|
40
|
+
/** User's Personal Server address, if known. */
|
|
22
41
|
serverAddress?: string;
|
|
42
|
+
/** Your app's user ID, if provided during session init. */
|
|
23
43
|
appUserId?: string;
|
|
24
44
|
}
|
|
45
|
+
/** Parameters for fetching data from a Personal Server. */
|
|
25
46
|
export interface DataFetchParams {
|
|
47
|
+
/** Base URL of the user's Personal Server. */
|
|
26
48
|
serverUrl: string;
|
|
49
|
+
/** Data scope to fetch (e.g. `"instagram.profile"`). */
|
|
27
50
|
scope: string;
|
|
51
|
+
/** Grant ID authorizing the data access. */
|
|
28
52
|
grantId: string;
|
|
53
|
+
/** Optional file ID for a specific file within the scope. */
|
|
29
54
|
fileId?: string;
|
|
55
|
+
/** Optional ISO 8601 timestamp to fetch data at a specific point in time. */
|
|
30
56
|
at?: string;
|
|
31
57
|
}
|
|
58
|
+
/** Configuration for {@link createRequestSigner}. */
|
|
32
59
|
export interface RequestSignerConfig {
|
|
60
|
+
/** Builder private key in hex format. */
|
|
33
61
|
privateKey: `0x${string}`;
|
|
34
62
|
}
|
|
63
|
+
/** Configuration for {@link createSessionRelay}. */
|
|
35
64
|
export interface SessionRelayConfig {
|
|
65
|
+
/** Builder private key in hex format. */
|
|
36
66
|
privateKey: `0x${string}`;
|
|
67
|
+
/** Builder's wallet address derived from the private key. */
|
|
37
68
|
granteeAddress: `0x${string}`;
|
|
69
|
+
/** Base URL of the Session Relay service. */
|
|
38
70
|
sessionRelayUrl: string;
|
|
39
71
|
}
|
|
72
|
+
/** Configuration for {@link createDataClient}. */
|
|
40
73
|
export interface DataClientConfig {
|
|
74
|
+
/** Builder private key in hex format. */
|
|
41
75
|
privateKey: `0x${string}`;
|
|
76
|
+
/** Base URL of the Data Portability Gateway. */
|
|
42
77
|
gatewayUrl: string;
|
|
43
78
|
}
|
|
79
|
+
/** Configuration for the high-level {@link connect} function. */
|
|
44
80
|
export interface ConnectConfig {
|
|
81
|
+
/** Builder private key in hex format. */
|
|
45
82
|
privateKey: `0x${string}`;
|
|
83
|
+
/** Data scopes to request. */
|
|
46
84
|
scopes: string[];
|
|
85
|
+
/** Public HTTPS URL for grant event notifications. */
|
|
47
86
|
webhookUrl?: string;
|
|
87
|
+
/** Your app's user ID for correlation. */
|
|
48
88
|
appUserId?: string;
|
|
89
|
+
/** SDK environment (`"dev"` or `"prod"`). Defaults to `"prod"`. */
|
|
90
|
+
environment?: "dev" | "prod";
|
|
49
91
|
}
|
|
92
|
+
/** Configuration for the high-level {@link getData} function. */
|
|
50
93
|
export interface GetDataConfig {
|
|
94
|
+
/** Builder private key in hex format. */
|
|
51
95
|
privateKey: `0x${string}`;
|
|
96
|
+
/** Grant from the approval step. */
|
|
52
97
|
grant: GrantPayload;
|
|
98
|
+
/** SDK environment (`"dev"` or `"prod"`). Defaults to `"prod"`. */
|
|
99
|
+
environment?: "dev" | "prod";
|
|
53
100
|
}
|
|
101
|
+
/** Configuration for {@link signVanaManifest}. */
|
|
54
102
|
export interface VanaManifestConfig {
|
|
103
|
+
/** Builder private key in hex format. */
|
|
55
104
|
privateKey: `0x${string}`;
|
|
105
|
+
/** Canonical URL of your application. */
|
|
56
106
|
appUrl: string;
|
|
107
|
+
/** URL to your privacy policy. */
|
|
57
108
|
privacyPolicyUrl: string;
|
|
109
|
+
/** URL to your terms of service. */
|
|
58
110
|
termsUrl: string;
|
|
111
|
+
/** URL for user support. */
|
|
59
112
|
supportUrl: string;
|
|
113
|
+
/** Public webhook URL for grant notifications. */
|
|
60
114
|
webhookUrl: string;
|
|
61
115
|
}
|
|
116
|
+
/** Signed manifest block included in your web app manifest under the `vana` key. */
|
|
62
117
|
export interface VanaManifestBlock {
|
|
118
|
+
/** Canonical URL of your application. */
|
|
63
119
|
appUrl: string;
|
|
120
|
+
/** URL to your privacy policy. */
|
|
64
121
|
privacyPolicyUrl: string;
|
|
122
|
+
/** URL to your terms of service. */
|
|
65
123
|
termsUrl: string;
|
|
124
|
+
/** URL for user support. */
|
|
66
125
|
supportUrl: string;
|
|
126
|
+
/** Public webhook URL for grant notifications. */
|
|
67
127
|
webhookUrl: string;
|
|
128
|
+
/** Cryptographic signature of the manifest block. */
|
|
68
129
|
signature: string;
|
|
69
130
|
}
|
|
70
131
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,YAAY,GACZ,SAAS,GACT,UAAU,GACV,QAAQ,GACR,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClE,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import type { GrantPayload } from "../core/types.js";
|
|
2
|
+
/** Props for the {@link ConnectButton} component. */
|
|
2
3
|
export interface ConnectButtonProps {
|
|
4
|
+
/** Session ID from the server-side `connect()` call. */
|
|
3
5
|
sessionId: string;
|
|
6
|
+
/** Optional deep link URL override. */
|
|
4
7
|
deepLinkUrl?: string;
|
|
8
|
+
/** Called when the user approves the grant. */
|
|
5
9
|
onComplete?: (grant: GrantPayload) => void;
|
|
10
|
+
/** Called on polling errors. */
|
|
6
11
|
onError?: (error: string) => void;
|
|
12
|
+
/** Called when the user denies the request. */
|
|
7
13
|
onDenied?: (reason: string) => void;
|
|
14
|
+
/** CSS class name for the wrapper element. */
|
|
8
15
|
className?: string;
|
|
16
|
+
/** Label for the deep link anchor (default: `"Open Vana Desktop App"`). */
|
|
9
17
|
label?: string;
|
|
10
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Pre-built React component that displays connection status and a deep link.
|
|
21
|
+
*
|
|
22
|
+
* For full control over the UI, use {@link useVanaConnect} or {@link useVanaData} directly.
|
|
23
|
+
*
|
|
24
|
+
* @param props - Component props.
|
|
25
|
+
*/
|
|
11
26
|
export declare function ConnectButton(props: ConnectButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
12
27
|
//# sourceMappingURL=ConnectButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectButton.d.ts","sourceRoot":"","sources":["../../src/react/ConnectButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CA+CtD"}
|
|
1
|
+
{"version":3,"file":"ConnectButton.d.ts","sourceRoot":"","sources":["../../src/react/ConnectButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CA+CtD"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect } from "react";
|
|
3
3
|
import { useVanaConnect } from "./useVanaConnect.js";
|
|
4
|
+
/**
|
|
5
|
+
* Pre-built React component that displays connection status and a deep link.
|
|
6
|
+
*
|
|
7
|
+
* For full control over the UI, use {@link useVanaConnect} or {@link useVanaData} directly.
|
|
8
|
+
*
|
|
9
|
+
* @param props - Component props.
|
|
10
|
+
*/
|
|
4
11
|
export function ConnectButton(props) {
|
|
5
12
|
const { sessionId, deepLinkUrl: deepLinkUrlProp, onComplete, onError, onDenied, className, label, } = props;
|
|
6
13
|
const { connect, status, grant, error, deepLinkUrl } = useVanaConnect();
|
|
@@ -27,6 +34,6 @@ export function ConnectButton(props) {
|
|
|
27
34
|
expired: "Session expired",
|
|
28
35
|
error: "Connection error",
|
|
29
36
|
};
|
|
30
|
-
return (_jsxs("div", { className: className, children: [_jsx("p", { children: statusText[status] ?? status }), deepLinkUrl && status === "waiting" && (_jsx("a", { href: deepLinkUrl, children: label ?? "Open
|
|
37
|
+
return (_jsxs("div", { className: className, children: [_jsx("p", { children: statusText[status] ?? status }), deepLinkUrl && status === "waiting" && (_jsx("a", { href: deepLinkUrl, children: label ?? "Open dataConnect Desktop App" }))] }));
|
|
31
38
|
}
|
|
32
39
|
//# sourceMappingURL=ConnectButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectButton.js","sourceRoot":"","sources":["../../src/react/ConnectButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ConnectButton.js","sourceRoot":"","sources":["../../src/react/ConnectButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAoBrD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EACJ,SAAS,EACT,WAAW,EAAE,eAAe,EAC5B,UAAU,EACV,OAAO,EACP,QAAQ,EACR,SAAS,EACT,KAAK,GACN,GAAG,KAAK,CAAC;IAEV,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;IAExE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,UAAU,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;YACjD,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACpC,QAAQ,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1D,MAAM,UAAU,GAA2B;QACzC,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE,kBAAkB;KAC1B,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,aACvB,sBAAI,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,GAAK,EACpC,WAAW,IAAI,MAAM,KAAK,SAAS,IAAI,CACtC,YAAG,IAAI,EAAE,WAAW,YAAG,KAAK,IAAI,8BAA8B,GAAK,CACpE,IACG,CACP,CAAC;AACJ,CAAC"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { useVanaConnect, type UseVanaConnectConfig, type UseVanaConnectResult, } from "./useVanaConnect.js";
|
|
2
2
|
export { ConnectButton, type ConnectButtonProps } from "./ConnectButton.js";
|
|
3
|
+
export { useVanaData, type UseVanaDataConfig, type UseVanaDataResult, } from "./useVanaData.js";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC"}
|
package/dist/react/index.js
CHANGED
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,WAAW,GAGZ,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,17 +1,50 @@
|
|
|
1
1
|
import type { ConnectionStatus, GrantPayload } from "../core/types.js";
|
|
2
|
+
/** Configuration for the {@link useVanaConnect} hook. */
|
|
2
3
|
export interface UseVanaConnectConfig {
|
|
4
|
+
/** Polling interval in milliseconds (default: 2000). */
|
|
3
5
|
pollingInterval?: number;
|
|
6
|
+
/** SDK environment (`"dev"` or `"prod"`). Defaults to `"prod"`. */
|
|
7
|
+
environment?: "dev" | "prod";
|
|
4
8
|
}
|
|
9
|
+
/** Return value of the {@link useVanaConnect} hook. */
|
|
5
10
|
export interface UseVanaConnectResult {
|
|
11
|
+
/** Starts polling the Session Relay for the given session. */
|
|
6
12
|
connect: (params: {
|
|
7
13
|
sessionId: string;
|
|
8
14
|
deepLinkUrl?: string;
|
|
9
15
|
}) => void;
|
|
16
|
+
/** Current connection status. */
|
|
10
17
|
status: ConnectionStatus;
|
|
18
|
+
/** Grant payload after user approval, or `null`. */
|
|
11
19
|
grant: GrantPayload | null;
|
|
20
|
+
/** Error message, or `null`. */
|
|
12
21
|
error: string | null;
|
|
22
|
+
/** Deep link URL to open the Vana Desktop App, or `null`. */
|
|
13
23
|
deepLinkUrl: string | null;
|
|
24
|
+
/** Resets all state back to idle and stops polling. */
|
|
14
25
|
reset: () => void;
|
|
15
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* React hook that polls the Session Relay and manages connection state.
|
|
29
|
+
*
|
|
30
|
+
* Call `connect()` with a session ID (from your server's `/api/connect` route)
|
|
31
|
+
* to begin polling. The hook will update `status` through the lifecycle:
|
|
32
|
+
* `idle` -> `connecting` -> `waiting` -> `approved` | `denied` | `expired` | `error`.
|
|
33
|
+
*
|
|
34
|
+
* @param config - Optional configuration for polling interval and environment.
|
|
35
|
+
* @returns A {@link UseVanaConnectResult} with state and actions.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* const { connect, status, grant, deepLinkUrl } = useVanaConnect();
|
|
40
|
+
*
|
|
41
|
+
* useEffect(() => {
|
|
42
|
+
* connect({ sessionId: "sess-123" });
|
|
43
|
+
* }, []);
|
|
44
|
+
*
|
|
45
|
+
* if (status === "waiting") return <a href={deepLinkUrl!}>Open Vana</a>;
|
|
46
|
+
* if (status === "approved") return <p>Connected! Grant: {grant!.grantId}</p>;
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
16
49
|
export declare function useVanaConnect(config?: UseVanaConnectConfig): UseVanaConnectResult;
|
|
17
50
|
//# sourceMappingURL=useVanaConnect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVanaConnect.d.ts","sourceRoot":"","sources":["../../src/react/useVanaConnect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useVanaConnect.d.ts","sourceRoot":"","sources":["../../src/react/useVanaConnect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,yDAAyD;AACzD,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC9B;AAED,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACvE,iCAAiC;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,oDAAoD;IACpD,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,gCAAgC;IAChC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uDAAuD;IACvD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,oBAAoB,GAC5B,oBAAoB,CAwGtB"}
|
|
@@ -1,7 +1,30 @@
|
|
|
1
1
|
import { useState, useCallback, useRef, useEffect } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { getEnvConfig } from "../core/constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* React hook that polls the Session Relay and manages connection state.
|
|
5
|
+
*
|
|
6
|
+
* Call `connect()` with a session ID (from your server's `/api/connect` route)
|
|
7
|
+
* to begin polling. The hook will update `status` through the lifecycle:
|
|
8
|
+
* `idle` -> `connecting` -> `waiting` -> `approved` | `denied` | `expired` | `error`.
|
|
9
|
+
*
|
|
10
|
+
* @param config - Optional configuration for polling interval and environment.
|
|
11
|
+
* @returns A {@link UseVanaConnectResult} with state and actions.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const { connect, status, grant, deepLinkUrl } = useVanaConnect();
|
|
16
|
+
*
|
|
17
|
+
* useEffect(() => {
|
|
18
|
+
* connect({ sessionId: "sess-123" });
|
|
19
|
+
* }, []);
|
|
20
|
+
*
|
|
21
|
+
* if (status === "waiting") return <a href={deepLinkUrl!}>Open Vana</a>;
|
|
22
|
+
* if (status === "approved") return <p>Connected! Grant: {grant!.grantId}</p>;
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
3
25
|
export function useVanaConnect(config) {
|
|
4
|
-
const
|
|
26
|
+
const { sessionRelayUrl } = getEnvConfig(config?.environment);
|
|
27
|
+
const baseUrl = sessionRelayUrl;
|
|
5
28
|
const interval = config?.pollingInterval ?? 2000;
|
|
6
29
|
const [status, setStatus] = useState("idle");
|
|
7
30
|
const [grant, setGrant] = useState(null);
|
|
@@ -34,7 +57,10 @@ export function useVanaConnect(config) {
|
|
|
34
57
|
if (!res.ok) {
|
|
35
58
|
// Try to extract structured error from response body
|
|
36
59
|
const body = await res.json().catch(() => null);
|
|
37
|
-
const errorCode = body
|
|
60
|
+
const errorCode = body && typeof body === "object"
|
|
61
|
+
? body.error
|
|
62
|
+
?.errorCode
|
|
63
|
+
: undefined;
|
|
38
64
|
if (res.status === 410 || errorCode === "SESSION_EXPIRED") {
|
|
39
65
|
setStatus("expired");
|
|
40
66
|
setError("Session expired");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVanaConnect.js","sourceRoot":"","sources":["../../src/react/useVanaConnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useVanaConnect.js","sourceRoot":"","sources":["../../src/react/useVanaConnect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { GrantPayload, ConnectionStatus } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for the {@link useVanaData} hook.
|
|
4
|
+
*/
|
|
5
|
+
export interface UseVanaDataConfig {
|
|
6
|
+
/** URL of the connect API route (default: `"/api/connect"`). */
|
|
7
|
+
connectUrl?: string;
|
|
8
|
+
/** URL of the data API route (default: `"/api/data"`). */
|
|
9
|
+
dataUrl?: string;
|
|
10
|
+
/** Polling interval in ms passed to {@link useVanaConnect} (default: 2000). */
|
|
11
|
+
pollingInterval?: number;
|
|
12
|
+
/** SDK environment passed through to {@link useVanaConnect}. */
|
|
13
|
+
environment?: "dev" | "prod";
|
|
14
|
+
/** When true, automatically fetches data after grant approval (default: `true`). */
|
|
15
|
+
autoFetch?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Return value of the {@link useVanaData} hook.
|
|
19
|
+
*/
|
|
20
|
+
export interface UseVanaDataResult {
|
|
21
|
+
/** Current connection status. */
|
|
22
|
+
status: ConnectionStatus;
|
|
23
|
+
/** Grant payload after user approval, or `null`. */
|
|
24
|
+
grant: GrantPayload | null;
|
|
25
|
+
/** Fetched data after calling the data route, or `null`. */
|
|
26
|
+
data: unknown;
|
|
27
|
+
/** Error message, or `null`. */
|
|
28
|
+
error: string | null;
|
|
29
|
+
/** Deep link URL to open the Vana Desktop App, or `null`. */
|
|
30
|
+
deepLinkUrl: string | null;
|
|
31
|
+
/** Starts the connect flow by calling the connect API route. */
|
|
32
|
+
initConnect: () => Promise<void>;
|
|
33
|
+
/** Manually fetches data using the current grant. */
|
|
34
|
+
fetchData: () => Promise<void>;
|
|
35
|
+
/** Resets all state back to idle. */
|
|
36
|
+
reset: () => void;
|
|
37
|
+
/** `true` while any async operation is in progress. */
|
|
38
|
+
isLoading: boolean;
|
|
39
|
+
/** `true` when status is `"approved"`. */
|
|
40
|
+
isConnected: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Full-flow hook that orchestrates the entire Vana Connect lifecycle:
|
|
44
|
+
* session init, polling, and data fetching.
|
|
45
|
+
*
|
|
46
|
+
* Composes {@link useVanaConnect} internally and adds automatic
|
|
47
|
+
* calls to your app's `/api/connect` and `/api/data` routes.
|
|
48
|
+
*
|
|
49
|
+
* @param config - Optional configuration.
|
|
50
|
+
* @returns A {@link UseVanaDataResult} with state and actions.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* import { useVanaData } from "@opendatalabs/connect/react";
|
|
55
|
+
*
|
|
56
|
+
* function MyComponent() {
|
|
57
|
+
* const { status, data, deepLinkUrl, initConnect, isLoading } = useVanaData();
|
|
58
|
+
*
|
|
59
|
+
* if (status === "idle") return <button onClick={initConnect}>Connect</button>;
|
|
60
|
+
* if (status === "waiting") return <a href={deepLinkUrl!}>Open Vana</a>;
|
|
61
|
+
* if (data) return <pre>{JSON.stringify(data, null, 2)}</pre>;
|
|
62
|
+
* return <p>{isLoading ? "Loading..." : status}</p>;
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function useVanaData(config?: UseVanaDataConfig): UseVanaDataResult;
|
|
67
|
+
//# sourceMappingURL=useVanaData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVanaData.d.ts","sourceRoot":"","sources":["../../src/react/useVanaData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGvE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,oDAAoD;IACpD,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,4DAA4D;IAC5D,IAAI,EAAE,OAAO,CAAC;IACd,gCAAgC;IAChC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,qDAAqD;IACrD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,qCAAqC;IACrC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,uDAAuD;IACvD,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,CAqHzE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { useState, useCallback, useRef, useEffect } from "react";
|
|
2
|
+
import { useVanaConnect } from "./useVanaConnect.js";
|
|
3
|
+
/**
|
|
4
|
+
* Full-flow hook that orchestrates the entire Vana Connect lifecycle:
|
|
5
|
+
* session init, polling, and data fetching.
|
|
6
|
+
*
|
|
7
|
+
* Composes {@link useVanaConnect} internally and adds automatic
|
|
8
|
+
* calls to your app's `/api/connect` and `/api/data` routes.
|
|
9
|
+
*
|
|
10
|
+
* @param config - Optional configuration.
|
|
11
|
+
* @returns A {@link UseVanaDataResult} with state and actions.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { useVanaData } from "@opendatalabs/connect/react";
|
|
16
|
+
*
|
|
17
|
+
* function MyComponent() {
|
|
18
|
+
* const { status, data, deepLinkUrl, initConnect, isLoading } = useVanaData();
|
|
19
|
+
*
|
|
20
|
+
* if (status === "idle") return <button onClick={initConnect}>Connect</button>;
|
|
21
|
+
* if (status === "waiting") return <a href={deepLinkUrl!}>Open Vana</a>;
|
|
22
|
+
* if (data) return <pre>{JSON.stringify(data, null, 2)}</pre>;
|
|
23
|
+
* return <p>{isLoading ? "Loading..." : status}</p>;
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function useVanaData(config) {
|
|
28
|
+
const connectUrl = config?.connectUrl ?? "/api/connect";
|
|
29
|
+
const dataUrl = config?.dataUrl ?? "/api/data";
|
|
30
|
+
const autoFetch = config?.autoFetch ?? true;
|
|
31
|
+
const { connect, status: pollStatus, grant: pollGrant, error: pollError, deepLinkUrl, reset: resetPoll, } = useVanaConnect({
|
|
32
|
+
pollingInterval: config?.pollingInterval,
|
|
33
|
+
environment: config?.environment,
|
|
34
|
+
});
|
|
35
|
+
const [data, setData] = useState(null);
|
|
36
|
+
const [fetchError, setFetchError] = useState(null);
|
|
37
|
+
const [fetching, setFetching] = useState(false);
|
|
38
|
+
const [initLoading, setInitLoading] = useState(false);
|
|
39
|
+
const autoFetchedRef = useRef(false);
|
|
40
|
+
const fetchData = useCallback(async () => {
|
|
41
|
+
if (!pollGrant)
|
|
42
|
+
return;
|
|
43
|
+
setFetching(true);
|
|
44
|
+
setFetchError(null);
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch(dataUrl, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: { "Content-Type": "application/json" },
|
|
49
|
+
body: JSON.stringify({ grant: pollGrant }),
|
|
50
|
+
});
|
|
51
|
+
const json = await res.json();
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
setFetchError(json.error
|
|
54
|
+
? String(json.error)
|
|
55
|
+
: `Data fetch failed: ${res.status}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
setData(json);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
setFetchError(err instanceof Error ? err.message : "Unknown data fetch error");
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
setFetching(false);
|
|
65
|
+
}
|
|
66
|
+
}, [pollGrant, dataUrl]);
|
|
67
|
+
// Auto-fetch on approval
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (pollStatus === "approved" &&
|
|
70
|
+
pollGrant &&
|
|
71
|
+
autoFetch &&
|
|
72
|
+
!autoFetchedRef.current) {
|
|
73
|
+
autoFetchedRef.current = true;
|
|
74
|
+
void fetchData();
|
|
75
|
+
}
|
|
76
|
+
}, [pollStatus, pollGrant, autoFetch, fetchData]);
|
|
77
|
+
const initConnect = useCallback(async () => {
|
|
78
|
+
setData(null);
|
|
79
|
+
setFetchError(null);
|
|
80
|
+
autoFetchedRef.current = false;
|
|
81
|
+
setInitLoading(true);
|
|
82
|
+
try {
|
|
83
|
+
const res = await fetch(connectUrl, { method: "POST" });
|
|
84
|
+
const json = (await res.json());
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
setFetchError(json.error ? String(json.error) : `Connect failed: ${res.status}`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
connect({
|
|
90
|
+
sessionId: json.sessionId,
|
|
91
|
+
deepLinkUrl: json.deepLinkUrl,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
setFetchError(err instanceof Error ? err.message : "Unknown connect error");
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
setInitLoading(false);
|
|
99
|
+
}
|
|
100
|
+
}, [connectUrl, connect]);
|
|
101
|
+
const reset = useCallback(() => {
|
|
102
|
+
resetPoll();
|
|
103
|
+
setData(null);
|
|
104
|
+
setFetchError(null);
|
|
105
|
+
setFetching(false);
|
|
106
|
+
setInitLoading(false);
|
|
107
|
+
autoFetchedRef.current = false;
|
|
108
|
+
}, [resetPoll]);
|
|
109
|
+
const error = pollError ?? fetchError;
|
|
110
|
+
const isLoading = initLoading || fetching || pollStatus === "connecting";
|
|
111
|
+
const isConnected = pollStatus === "approved";
|
|
112
|
+
return {
|
|
113
|
+
status: pollStatus,
|
|
114
|
+
grant: pollGrant,
|
|
115
|
+
data,
|
|
116
|
+
error,
|
|
117
|
+
deepLinkUrl,
|
|
118
|
+
initConnect,
|
|
119
|
+
fetchData,
|
|
120
|
+
reset,
|
|
121
|
+
isLoading,
|
|
122
|
+
isConnected,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=useVanaData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVanaData.js","sourceRoot":"","sources":["../../src/react/useVanaData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { VanaEnvironment } from "../core/constants.js";
|
|
2
|
+
export interface VanaConfig {
|
|
3
|
+
privateKey: `0x${string}`;
|
|
4
|
+
scopes: string[];
|
|
5
|
+
appUrl: string;
|
|
6
|
+
environment?: VanaEnvironment;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates a validated SDK configuration.
|
|
10
|
+
*
|
|
11
|
+
* All values must be passed explicitly — the SDK does not read
|
|
12
|
+
* environment variables. The calling application is responsible
|
|
13
|
+
* for sourcing config values (e.g. from `process.env`).
|
|
14
|
+
*
|
|
15
|
+
* @param config - Required configuration fields.
|
|
16
|
+
* @returns A validated {@link VanaConfig} object.
|
|
17
|
+
* @throws {@link ConnectError} with code `CONFIG_INVALID` if any required field is missing or invalid.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { createVanaConfig } from "@opendatalabs/connect/server";
|
|
22
|
+
*
|
|
23
|
+
* const config = createVanaConfig({
|
|
24
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
25
|
+
* scopes: ["chatgpt.conversations"],
|
|
26
|
+
* appUrl: process.env.APP_URL!,
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function createVanaConfig(config: {
|
|
31
|
+
privateKey: `0x${string}`;
|
|
32
|
+
scopes: string[];
|
|
33
|
+
appUrl: string;
|
|
34
|
+
environment?: VanaEnvironment;
|
|
35
|
+
}): VanaConfig;
|
|
36
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B,GAAG,UAAU,CAmCb"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a validated SDK configuration.
|
|
4
|
+
*
|
|
5
|
+
* All values must be passed explicitly — the SDK does not read
|
|
6
|
+
* environment variables. The calling application is responsible
|
|
7
|
+
* for sourcing config values (e.g. from `process.env`).
|
|
8
|
+
*
|
|
9
|
+
* @param config - Required configuration fields.
|
|
10
|
+
* @returns A validated {@link VanaConfig} object.
|
|
11
|
+
* @throws {@link ConnectError} with code `CONFIG_INVALID` if any required field is missing or invalid.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { createVanaConfig } from "@opendatalabs/connect/server";
|
|
16
|
+
*
|
|
17
|
+
* const config = createVanaConfig({
|
|
18
|
+
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
19
|
+
* scopes: ["chatgpt.conversations"],
|
|
20
|
+
* appUrl: process.env.APP_URL!,
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function createVanaConfig(config) {
|
|
25
|
+
if (!config.privateKey) {
|
|
26
|
+
throw new ConnectError("Missing privateKey. Pass a 0x-prefixed private key.", ConnectErrorCode.CONFIG_INVALID);
|
|
27
|
+
}
|
|
28
|
+
if (!config.privateKey.startsWith("0x")) {
|
|
29
|
+
throw new ConnectError("privateKey must start with 0x.", ConnectErrorCode.CONFIG_INVALID);
|
|
30
|
+
}
|
|
31
|
+
if (!Array.isArray(config.scopes) || config.scopes.length === 0) {
|
|
32
|
+
throw new ConnectError("Missing scopes. Pass a non-empty array of scope strings.", ConnectErrorCode.CONFIG_INVALID);
|
|
33
|
+
}
|
|
34
|
+
if (!config.appUrl) {
|
|
35
|
+
throw new ConnectError("Missing appUrl. Pass the public URL of your deployed app.", ConnectErrorCode.CONFIG_INVALID);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
privateKey: config.privateKey,
|
|
39
|
+
scopes: config.scopes,
|
|
40
|
+
appUrl: config.appUrl,
|
|
41
|
+
environment: config.environment,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=config.js.map
|