@opendatalabs/connect 0.6.0 → 0.7.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 +79 -36
- package/dist/core/constants.d.ts +12 -8
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +6 -5
- package/dist/core/constants.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/react/ConnectButton.d.ts +3 -3
- package/dist/react/ConnectButton.d.ts.map +1 -1
- package/dist/react/ConnectButton.js +5 -5
- package/dist/react/ConnectButton.js.map +1 -1
- package/dist/react/useVanaConnect.d.ts +5 -5
- package/dist/react/useVanaConnect.d.ts.map +1 -1
- package/dist/react/useVanaConnect.js +11 -9
- package/dist/react/useVanaConnect.js.map +1 -1
- package/dist/react/useVanaData.d.ts +4 -2
- package/dist/react/useVanaData.d.ts.map +1 -1
- package/dist/react/useVanaData.js +12 -6
- package/dist/react/useVanaData.js.map +1 -1
- package/dist/server/connect.d.ts +5 -5
- package/dist/server/connect.d.ts.map +1 -1
- package/dist/server/connect.js +24 -7
- package/dist/server/connect.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/session-relay.d.ts +9 -3
- package/dist/server/session-relay.d.ts.map +1 -1
- package/dist/server/session-relay.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
# Vana Connect SDK
|
|
2
2
|
|
|
3
|
-
Let your users
|
|
3
|
+
Let your users bring their own data to your app.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## What problem this solves
|
|
6
|
+
|
|
7
|
+
Your users already have rich personal data — ChatGPT conversations, Instagram activity, Gmail, purchase history — but it's locked inside the platforms that collected it. As a builder, you can't easily use that data to personalize onboarding, tailor recommendations, or skip lengthy signup forms.
|
|
8
|
+
|
|
9
|
+
**Data portability** means users can export their data from these platforms and grant your app scoped access to it — with their explicit consent, cryptographic verification, and full control over what's shared and when to revoke it.
|
|
10
|
+
|
|
11
|
+
Today, getting access to user data means asking for manual file uploads (high friction), scraping on their behalf (fragile and legally risky), or negotiating enterprise API deals (slow and expensive). This SDK gives you a standardized way to request and receive personal data through Vana's [Data Portability Protocol](https://docs.vana.org/), handling session creation, grant verification, and data fetching in three function calls.
|
|
6
12
|
|
|
7
13
|
## How it works
|
|
8
14
|
|
|
@@ -12,9 +18,9 @@ Your App Vana Protocol
|
|
|
12
18
|
|
|
13
19
|
1. connect({ scopes })
|
|
14
20
|
→ creates session
|
|
15
|
-
→ returns deep link ──▶ 2. User opens
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
→ returns deep link ──▶ 2. User opens DataConnect
|
|
22
|
+
reviews scopes, exports data,
|
|
23
|
+
approves grant
|
|
18
24
|
|
|
19
25
|
3. Poll resolves with grant ◀── Grant signed & registered
|
|
20
26
|
|
|
@@ -22,31 +28,67 @@ Your App Vana Protocol
|
|
|
22
28
|
→ structured JSON user data over TLS
|
|
23
29
|
```
|
|
24
30
|
|
|
25
|
-
The SDK handles session creation, cryptographic request signing, polling, and data fetching. You write three function calls; the protocol handles the rest.
|
|
31
|
+
The [Data Portability Protocol](https://docs.vana.org/) defines how users collect data from platforms, store it under their control (on-device or hosted), and grant third-party apps scoped access. This SDK handles session creation, cryptographic request signing, polling, and data fetching. You write three function calls; the protocol handles the rest.
|
|
32
|
+
|
|
33
|
+
## Getting started
|
|
34
|
+
|
|
35
|
+
The fastest way to get up and running is with the `examples/nextjs-starter` — a complete working app which uses the development environment and has full flow of data portability wired up:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git clone https://github.com/vana-com/vana-connect.git
|
|
39
|
+
cd vana-connect/examples/nextjs-starter
|
|
40
|
+
cp .env.local.example .env.local
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Use the pre-registered dev key in .env.local. Note that this private key is ONLY for testing and works only with a testing Vana environment.
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
VANA_PRIVATE_KEY=0x3c05ac1a00546bc0b1b8d3a11fb908409005fac3f26d25f70711e4f632e720d3
|
|
47
|
+
APP_URL=http://localhost:3001
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Install and run
|
|
26
51
|
|
|
27
|
-
|
|
52
|
+
```
|
|
53
|
+
pnpm install
|
|
54
|
+
pnpm dev
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Note that while testing this example app, you should have a development version of the [DataConnect app](https://github.com/vana-com/data-connect?tab=readme-ov-file#development).
|
|
58
|
+
|
|
59
|
+
There is one caveat in development: the deep-link for DataConnect app doesn't open the dev version of the app.
|
|
60
|
+
This means that when testing your app from the end user perspective, once you see this screen:
|
|
61
|
+
<img width="627" height="560" alt="Screenshot 2026-02-21 at 15 02 58" src="https://github.com/user-attachments/assets/477ae78f-d84d-4178-a1e9-48abedf36946" />
|
|
62
|
+
|
|
63
|
+
Instead of clicking the "Launch DataConnect" button, you should right-click on it and copy its address. The address will be something like `vana://connect?sessionId=...`.
|
|
64
|
+
|
|
65
|
+
Then, in your dev version of DataConnect (likely built from the `main` branch) you will see a place to copy the link in the right-bottom corner of the app:
|
|
66
|
+
|
|
67
|
+
<img width="348" height="258" alt="Screenshot 2026-02-21 at 15 09 18" src="https://github.com/user-attachments/assets/9f9d7a14-c92e-4185-bdc2-a2d93282c748" />
|
|
28
68
|
|
|
29
|
-
|
|
69
|
+
---
|
|
30
70
|
|
|
31
|
-
|
|
32
|
-
- **Data Portability Gateway** — fast API with eventual on-chain consistency
|
|
33
|
-
- **Vana L1** — on-chain source of truth for grants, builder registry, and file records
|
|
71
|
+
## Manual integration
|
|
34
72
|
|
|
35
|
-
|
|
73
|
+
If you prefer to integrate the SDK into an existing project, follow the steps below.
|
|
36
74
|
|
|
37
|
-
|
|
75
|
+
### Installation
|
|
38
76
|
|
|
39
77
|
```bash
|
|
40
|
-
|
|
78
|
+
pnpm add @opendatalabs/connect
|
|
41
79
|
```
|
|
42
80
|
|
|
43
|
-
|
|
81
|
+
### Package manager
|
|
44
82
|
|
|
45
|
-
|
|
83
|
+
This repo is pnpm-only for local development and examples. Use `pnpm` commands, not `npm`.
|
|
46
84
|
|
|
47
|
-
|
|
85
|
+
### Prerequisites
|
|
48
86
|
|
|
49
|
-
|
|
87
|
+
First, register your app in the [Developer Portal](https://vana-developers.replit.app/). You will need to provide the URL where your app will be deployed, and then be given a private key after registration.
|
|
88
|
+
|
|
89
|
+
### Quickstart
|
|
90
|
+
|
|
91
|
+
#### 1. Create a session (server)
|
|
50
92
|
|
|
51
93
|
```typescript
|
|
52
94
|
import { connect } from "@opendatalabs/connect/server";
|
|
@@ -54,30 +96,30 @@ import { connect } from "@opendatalabs/connect/server";
|
|
|
54
96
|
const session = await connect({
|
|
55
97
|
privateKey: process.env.VANA_APP_PRIVATE_KEY as `0x${string}`,
|
|
56
98
|
scopes: ["chatgpt.conversations"],
|
|
57
|
-
webhookUrl: "https://yourapp.com/api/webhook", // optional
|
|
58
|
-
appUserId: "user-42", // optional
|
|
99
|
+
webhookUrl: "https://yourapp.com/api/webhook", // optional, data can be pushed to a web hook after a grant is approved
|
|
100
|
+
appUserId: "yourapp-user-42", // optional: correlate your app user with the data they provided
|
|
59
101
|
});
|
|
60
102
|
|
|
61
103
|
// Return to your frontend:
|
|
62
|
-
// session.sessionId
|
|
63
|
-
// session.
|
|
64
|
-
// session.expiresAt
|
|
104
|
+
// session.sessionId — used for polling
|
|
105
|
+
// session.connectUrl — opens the Vana account page → launches DataConnect
|
|
106
|
+
// session.expiresAt — ISO 8601 expiration
|
|
65
107
|
```
|
|
66
108
|
|
|
67
|
-
|
|
109
|
+
#### 2. Poll for user approval (client)
|
|
68
110
|
|
|
69
111
|
```tsx
|
|
70
112
|
import { useVanaConnect } from "@opendatalabs/connect/react";
|
|
71
113
|
|
|
72
114
|
function ConnectData({ sessionId }: { sessionId: string }) {
|
|
73
|
-
const { connect, status, grant,
|
|
115
|
+
const { connect, status, grant, connectUrl } = useVanaConnect();
|
|
74
116
|
|
|
75
117
|
useEffect(() => {
|
|
76
118
|
connect({ sessionId });
|
|
77
119
|
}, [sessionId]);
|
|
78
120
|
|
|
79
|
-
if (status === "waiting" &&
|
|
80
|
-
return <a href={
|
|
121
|
+
if (status === "waiting" && connectUrl) {
|
|
122
|
+
return <a href={connectUrl}>Connect your data</a>;
|
|
81
123
|
}
|
|
82
124
|
if (status === "approved" && grant) {
|
|
83
125
|
// grant.grantId, grant.userAddress, grant.scopes are available
|
|
@@ -99,7 +141,7 @@ import { ConnectButton } from "@opendatalabs/connect/react";
|
|
|
99
141
|
/>;
|
|
100
142
|
```
|
|
101
143
|
|
|
102
|
-
|
|
144
|
+
#### 3. Fetch user data (server)
|
|
103
145
|
|
|
104
146
|
```typescript
|
|
105
147
|
import { getData } from "@opendatalabs/connect/server";
|
|
@@ -113,9 +155,9 @@ const data = await getData({
|
|
|
113
155
|
const conversations = data["chatgpt.conversations"];
|
|
114
156
|
```
|
|
115
157
|
|
|
116
|
-
|
|
158
|
+
#### Web App Manifest
|
|
117
159
|
|
|
118
|
-
The
|
|
160
|
+
The DataConnect App verifies your identity by fetching your manifest. Use `signVanaManifest()` to generate it:
|
|
119
161
|
|
|
120
162
|
```typescript
|
|
121
163
|
import { signVanaManifest } from "@opendatalabs/connect/server";
|
|
@@ -141,6 +183,11 @@ const manifest = {
|
|
|
141
183
|
|
|
142
184
|
Make sure your HTML includes `<link rel="manifest" href="/manifest.json">`.
|
|
143
185
|
|
|
186
|
+
## Connectors
|
|
187
|
+
|
|
188
|
+
Available data connectors and their scopes (schema definitions):
|
|
189
|
+
[`vana-com/data-connectors/schemas`](https://github.com/vana-com/data-connectors/tree/main/schemas)
|
|
190
|
+
|
|
144
191
|
## API Reference
|
|
145
192
|
|
|
146
193
|
### Entrypoints
|
|
@@ -153,7 +200,7 @@ Make sure your HTML includes `<link rel="manifest" href="/manifest.json">`.
|
|
|
153
200
|
|
|
154
201
|
### `connect(config): Promise<SessionInitResult>`
|
|
155
202
|
|
|
156
|
-
Creates a session on the Session Relay. Returns `sessionId`, `
|
|
203
|
+
Creates a session on the Session Relay. Returns `sessionId`, `connectUrl`, and `expiresAt`.
|
|
157
204
|
|
|
158
205
|
| Param | Type | Required | Description |
|
|
159
206
|
| ------------ | ------------------- | -------- | ---------------------------------------------------------------------- |
|
|
@@ -176,7 +223,7 @@ Fetches user data from their Personal Server using a signed grant.
|
|
|
176
223
|
React hook that polls the Session Relay and manages connection state.
|
|
177
224
|
|
|
178
225
|
```typescript
|
|
179
|
-
const { connect, status, grant, error,
|
|
226
|
+
const { connect, status, grant, error, connectUrl, reset } = useVanaConnect();
|
|
180
227
|
```
|
|
181
228
|
|
|
182
229
|
`status` transitions: `idle` → `connecting` → `waiting` → `approved` | `denied` | `expired` | `error`
|
|
@@ -208,10 +255,6 @@ import {
|
|
|
208
255
|
} from "@opendatalabs/connect/server";
|
|
209
256
|
```
|
|
210
257
|
|
|
211
|
-
## Examples
|
|
212
|
-
|
|
213
|
-
See [`examples/nextjs-starter`](./examples/nextjs-starter) for a complete working integration with Next.js, including manifest signing, webhook handling, and the full connect-to-data-fetch flow.
|
|
214
|
-
|
|
215
258
|
## License
|
|
216
259
|
|
|
217
260
|
MIT
|
package/dist/core/constants.d.ts
CHANGED
|
@@ -3,12 +3,14 @@ export type VanaEnvironment = "dev" | "prod";
|
|
|
3
3
|
/** URL configuration for each SDK environment. */
|
|
4
4
|
export declare const ENV_CONFIG: {
|
|
5
5
|
readonly dev: {
|
|
6
|
-
readonly sessionRelayUrl: "https://session-relay
|
|
7
|
-
readonly gatewayUrl: "https://data-gateway
|
|
6
|
+
readonly sessionRelayUrl: "https://dev.session-relay.vana.org";
|
|
7
|
+
readonly gatewayUrl: "https://dev.data-gateway.vana.org";
|
|
8
|
+
readonly accountUrl: "https://account-dev.vana.org";
|
|
8
9
|
};
|
|
9
10
|
readonly prod: {
|
|
10
|
-
readonly sessionRelayUrl: "https://session-relay
|
|
11
|
-
readonly gatewayUrl: "https://data-gateway
|
|
11
|
+
readonly sessionRelayUrl: "https://session-relay.vana.org";
|
|
12
|
+
readonly gatewayUrl: "https://data-gateway.vana.org";
|
|
13
|
+
readonly accountUrl: "https://account.vana.org";
|
|
12
14
|
};
|
|
13
15
|
};
|
|
14
16
|
/** Default environment used when none is specified. */
|
|
@@ -20,10 +22,12 @@ export declare const DEFAULT_ENVIRONMENT: VanaEnvironment;
|
|
|
20
22
|
* @returns An object with `sessionRelayUrl` and `gatewayUrl`.
|
|
21
23
|
*/
|
|
22
24
|
export declare function getEnvConfig(environment?: VanaEnvironment): {
|
|
23
|
-
readonly sessionRelayUrl: "https://session-relay
|
|
24
|
-
readonly gatewayUrl: "https://data-gateway
|
|
25
|
+
readonly sessionRelayUrl: "https://dev.session-relay.vana.org";
|
|
26
|
+
readonly gatewayUrl: "https://dev.data-gateway.vana.org";
|
|
27
|
+
readonly accountUrl: "https://account-dev.vana.org";
|
|
25
28
|
} | {
|
|
26
|
-
readonly sessionRelayUrl: "https://session-relay
|
|
27
|
-
readonly gatewayUrl: "https://data-gateway
|
|
29
|
+
readonly sessionRelayUrl: "https://session-relay.vana.org";
|
|
30
|
+
readonly gatewayUrl: "https://data-gateway.vana.org";
|
|
31
|
+
readonly accountUrl: "https://account.vana.org";
|
|
28
32
|
};
|
|
29
33
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7C,kDAAkD;AAClD,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7C,kDAAkD;AAClD,eAAO,MAAM,UAAU;;;;;;;;;;;CAWb,CAAC;AAEX,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,EAAE,eAAwB,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,eAAe;;;;;;;;EAEzD"}
|
package/dist/core/constants.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/** URL configuration for each SDK environment. */
|
|
2
2
|
export const ENV_CONFIG = {
|
|
3
3
|
dev: {
|
|
4
|
-
sessionRelayUrl: "https://session-relay
|
|
5
|
-
gatewayUrl: "https://data-gateway
|
|
4
|
+
sessionRelayUrl: "https://dev.session-relay.vana.org",
|
|
5
|
+
gatewayUrl: "https://dev.data-gateway.vana.org",
|
|
6
|
+
accountUrl: "https://account-dev.vana.org",
|
|
6
7
|
},
|
|
7
8
|
prod: {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
sessionRelayUrl: "https://session-relay.vana.org",
|
|
10
|
+
gatewayUrl: "https://data-gateway.vana.org",
|
|
11
|
+
accountUrl: "https://account.vana.org",
|
|
11
12
|
},
|
|
12
13
|
};
|
|
13
14
|
/** Default environment used when none is specified. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE;QACH,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE;QACH,eAAe,EAAE,oCAAoC;QACrD,UAAU,EAAE,mCAAmC;QAC/C,UAAU,EAAE,8BAA8B;KAC3C;IACD,IAAI,EAAE;QACJ,eAAe,EAAE,gCAAgC;QACjD,UAAU,EAAE,+BAA+B;QAC3C,UAAU,EAAE,0BAA0B;KACvC;CACO,CAAC;AAEX,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAoB,MAAM,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,WAA6B;IACxD,OAAO,UAAU,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -13,8 +13,8 @@ export interface SessionInitParams {
|
|
|
13
13
|
export interface SessionInitResult {
|
|
14
14
|
/** Unique session identifier used for polling. */
|
|
15
15
|
sessionId: string;
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/** URL to account.vana.org where the user signs in and launches Data Connect. */
|
|
17
|
+
connectUrl: string;
|
|
18
18
|
/** ISO 8601 expiration timestamp for the session. */
|
|
19
19
|
expiresAt: string;
|
|
20
20
|
}
|
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,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,YAAY,GACZ,SAAS,GACT,UAAU,GACV,QAAQ,GACR,SAAS,GACT,OAAO,CAAC;AAEZ,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import type { GrantPayload } from "../core/types.js";
|
|
|
3
3
|
export interface ConnectButtonProps {
|
|
4
4
|
/** Session ID from the server-side `connect()` call. */
|
|
5
5
|
sessionId: string;
|
|
6
|
-
/**
|
|
7
|
-
|
|
6
|
+
/** URL to account.vana.org/connect. */
|
|
7
|
+
connectUrl?: string;
|
|
8
8
|
/** Called when the user approves the grant. */
|
|
9
9
|
onComplete?: (grant: GrantPayload) => void;
|
|
10
10
|
/** Called on polling errors. */
|
|
@@ -13,7 +13,7 @@ export interface ConnectButtonProps {
|
|
|
13
13
|
onDenied?: (reason: string) => void;
|
|
14
14
|
/** CSS class name for the wrapper element. */
|
|
15
15
|
className?: string;
|
|
16
|
-
/** Label for the
|
|
16
|
+
/** Label for the connect anchor (default: `"Connect with Vana"`). */
|
|
17
17
|
label?: string;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
@@ -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,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,
|
|
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,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+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,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAiDtD"}
|
|
@@ -9,11 +9,11 @@ import { useVanaConnect } from "./useVanaConnect.js";
|
|
|
9
9
|
* @param props - Component props.
|
|
10
10
|
*/
|
|
11
11
|
export function ConnectButton(props) {
|
|
12
|
-
const { sessionId,
|
|
13
|
-
const { connect, status, grant, error,
|
|
12
|
+
const { sessionId, connectUrl: connectUrlProp, onComplete, onError, onDenied, className, label, } = props;
|
|
13
|
+
const { connect, status, grant, error, connectUrl } = useVanaConnect();
|
|
14
14
|
useEffect(() => {
|
|
15
|
-
connect({ sessionId,
|
|
16
|
-
}, [sessionId,
|
|
15
|
+
connect({ sessionId, connectUrl: connectUrlProp });
|
|
16
|
+
}, [sessionId, connectUrlProp, connect]);
|
|
17
17
|
useEffect(() => {
|
|
18
18
|
if (status === "approved" && grant && onComplete) {
|
|
19
19
|
onComplete(grant);
|
|
@@ -34,6 +34,6 @@ export function ConnectButton(props) {
|
|
|
34
34
|
expired: "Session expired",
|
|
35
35
|
error: "Connection error",
|
|
36
36
|
};
|
|
37
|
-
return (_jsxs("div", { className: className, children: [_jsx("p", { children: statusText[status] ?? status }),
|
|
37
|
+
return (_jsxs("div", { className: className, children: [_jsx("p", { children: statusText[status] ?? status }), connectUrl && status === "waiting" && (_jsx("a", { href: connectUrl, target: "_blank", rel: "noopener noreferrer", children: label ?? "Connect with Vana" }))] }));
|
|
38
38
|
}
|
|
39
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;AAoBrD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EACJ,SAAS,EACT,
|
|
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,UAAU,EAAE,cAAc,EAC1B,UAAU,EACV,OAAO,EACP,QAAQ,EACR,SAAS,EACT,KAAK,GACN,GAAG,KAAK,CAAC;IAEV,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAEvE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;IACrD,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzC,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,UAAU,IAAI,MAAM,KAAK,SAAS,IAAI,CACrC,YAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,YAC3D,KAAK,IAAI,mBAAmB,GAC3B,CACL,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -11,7 +11,7 @@ export interface UseVanaConnectResult {
|
|
|
11
11
|
/** Starts polling the Session Relay for the given session. */
|
|
12
12
|
connect: (params: {
|
|
13
13
|
sessionId: string;
|
|
14
|
-
|
|
14
|
+
connectUrl?: string;
|
|
15
15
|
}) => void;
|
|
16
16
|
/** Current connection status. */
|
|
17
17
|
status: ConnectionStatus;
|
|
@@ -19,8 +19,8 @@ export interface UseVanaConnectResult {
|
|
|
19
19
|
grant: GrantPayload | null;
|
|
20
20
|
/** Error message, or `null`. */
|
|
21
21
|
error: string | null;
|
|
22
|
-
/**
|
|
23
|
-
|
|
22
|
+
/** URL to account.vana.org where the user signs in and launches Data Connect, or `null`. */
|
|
23
|
+
connectUrl: string | null;
|
|
24
24
|
/** Resets all state back to idle and stops polling. */
|
|
25
25
|
reset: () => void;
|
|
26
26
|
}
|
|
@@ -36,13 +36,13 @@ export interface UseVanaConnectResult {
|
|
|
36
36
|
*
|
|
37
37
|
* @example
|
|
38
38
|
* ```tsx
|
|
39
|
-
* const { connect, status, grant,
|
|
39
|
+
* const { connect, status, grant, connectUrl } = useVanaConnect();
|
|
40
40
|
*
|
|
41
41
|
* useEffect(() => {
|
|
42
42
|
* connect({ sessionId: "sess-123" });
|
|
43
43
|
* }, []);
|
|
44
44
|
*
|
|
45
|
-
* if (status === "waiting") return <a href={
|
|
45
|
+
* if (status === "waiting") return <a href={connectUrl!}>Open Vana</a>;
|
|
46
46
|
* if (status === "approved") return <p>Connected! Grant: {grant!.grantId}</p>;
|
|
47
47
|
* ```
|
|
48
48
|
*/
|
|
@@ -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,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,
|
|
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,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,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,4FAA4F;IAC5F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,uDAAuD;IACvD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,oBAAoB,GAC5B,oBAAoB,CA0GtB"}
|
|
@@ -12,24 +12,25 @@ import { getEnvConfig } from "../core/constants.js";
|
|
|
12
12
|
*
|
|
13
13
|
* @example
|
|
14
14
|
* ```tsx
|
|
15
|
-
* const { connect, status, grant,
|
|
15
|
+
* const { connect, status, grant, connectUrl } = useVanaConnect();
|
|
16
16
|
*
|
|
17
17
|
* useEffect(() => {
|
|
18
18
|
* connect({ sessionId: "sess-123" });
|
|
19
19
|
* }, []);
|
|
20
20
|
*
|
|
21
|
-
* if (status === "waiting") return <a href={
|
|
21
|
+
* if (status === "waiting") return <a href={connectUrl!}>Open Vana</a>;
|
|
22
22
|
* if (status === "approved") return <p>Connected! Grant: {grant!.grantId}</p>;
|
|
23
23
|
* ```
|
|
24
24
|
*/
|
|
25
25
|
export function useVanaConnect(config) {
|
|
26
|
-
const
|
|
27
|
-
const baseUrl = sessionRelayUrl;
|
|
26
|
+
const envConfig = getEnvConfig(config?.environment);
|
|
27
|
+
const baseUrl = envConfig.sessionRelayUrl;
|
|
28
|
+
const accountUrl = envConfig.accountUrl;
|
|
28
29
|
const interval = config?.pollingInterval ?? 2000;
|
|
29
30
|
const [status, setStatus] = useState("idle");
|
|
30
31
|
const [grant, setGrant] = useState(null);
|
|
31
32
|
const [error, setError] = useState(null);
|
|
32
|
-
const [
|
|
33
|
+
const [connectUrl, setConnectUrl] = useState(null);
|
|
33
34
|
const timerRef = useRef(null);
|
|
34
35
|
const stopPolling = useCallback(() => {
|
|
35
36
|
if (timerRef.current !== null) {
|
|
@@ -42,14 +43,15 @@ export function useVanaConnect(config) {
|
|
|
42
43
|
setStatus("idle");
|
|
43
44
|
setGrant(null);
|
|
44
45
|
setError(null);
|
|
45
|
-
|
|
46
|
+
setConnectUrl(null);
|
|
46
47
|
}, [stopPolling]);
|
|
47
48
|
const connect = useCallback((params) => {
|
|
48
49
|
stopPolling();
|
|
49
50
|
setStatus("connecting");
|
|
50
51
|
setGrant(null);
|
|
51
52
|
setError(null);
|
|
52
|
-
|
|
53
|
+
setConnectUrl(params.connectUrl ??
|
|
54
|
+
`${accountUrl}/connect?sessionId=${params.sessionId}`);
|
|
53
55
|
const pollUrl = `${baseUrl}/v1/session/${params.sessionId}/poll`;
|
|
54
56
|
const poll = async () => {
|
|
55
57
|
try {
|
|
@@ -104,9 +106,9 @@ export function useVanaConnect(config) {
|
|
|
104
106
|
// First poll immediately, then at interval
|
|
105
107
|
void poll();
|
|
106
108
|
timerRef.current = setInterval(() => void poll(), interval);
|
|
107
|
-
}, [baseUrl, interval, stopPolling]);
|
|
109
|
+
}, [baseUrl, accountUrl, interval, stopPolling]);
|
|
108
110
|
// Cleanup on unmount
|
|
109
111
|
useEffect(() => stopPolling, [stopPolling]);
|
|
110
|
-
return { connect, status, grant, error,
|
|
112
|
+
return { connect, status, grant, error, connectUrl, reset };
|
|
111
113
|
}
|
|
112
114
|
//# sourceMappingURL=useVanaConnect.js.map
|
|
@@ -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,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA+BpD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA6B;IAE7B,MAAM,
|
|
1
|
+
{"version":3,"file":"useVanaConnect.js","sourceRoot":"","sources":["../../src/react/useVanaConnect.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,10 @@ export interface UseVanaDataResult {
|
|
|
26
26
|
data: unknown;
|
|
27
27
|
/** Error message, or `null`. */
|
|
28
28
|
error: string | null;
|
|
29
|
-
/**
|
|
30
|
-
|
|
29
|
+
/** URL to account.vana.org where the user signs in and launches Data Connect, or `null`. */
|
|
30
|
+
connectUrl: string | null;
|
|
31
|
+
/** Opens the connect URL in a new tab. Use this instead of rendering the URL directly to avoid navigating away from your app. */
|
|
32
|
+
openConnect: () => void;
|
|
31
33
|
/** Starts the connect flow by calling the connect API route. */
|
|
32
34
|
initConnect: () => Promise<void>;
|
|
33
35
|
/** Manually fetches data using the current grant. */
|
|
@@ -1 +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,
|
|
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,4FAA4F;IAC5F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iIAAiI;IACjI,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,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,CA4HzE"}
|
|
@@ -25,10 +25,10 @@ import { useVanaConnect } from "./useVanaConnect.js";
|
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
27
|
export function useVanaData(config) {
|
|
28
|
-
const
|
|
28
|
+
const connectApiUrl = config?.connectUrl ?? "/api/connect";
|
|
29
29
|
const dataUrl = config?.dataUrl ?? "/api/data";
|
|
30
30
|
const autoFetch = config?.autoFetch ?? true;
|
|
31
|
-
const { connect, status: pollStatus, grant: pollGrant, error: pollError,
|
|
31
|
+
const { connect, status: pollStatus, grant: pollGrant, error: pollError, connectUrl, reset: resetPoll, } = useVanaConnect({
|
|
32
32
|
pollingInterval: config?.pollingInterval,
|
|
33
33
|
environment: config?.environment,
|
|
34
34
|
});
|
|
@@ -80,7 +80,7 @@ export function useVanaData(config) {
|
|
|
80
80
|
autoFetchedRef.current = false;
|
|
81
81
|
setInitLoading(true);
|
|
82
82
|
try {
|
|
83
|
-
const res = await fetch(
|
|
83
|
+
const res = await fetch(connectApiUrl, { method: "POST" });
|
|
84
84
|
const json = (await res.json());
|
|
85
85
|
if (!res.ok) {
|
|
86
86
|
setFetchError(json.error ? String(json.error) : `Connect failed: ${res.status}`);
|
|
@@ -88,7 +88,7 @@ export function useVanaData(config) {
|
|
|
88
88
|
}
|
|
89
89
|
connect({
|
|
90
90
|
sessionId: json.sessionId,
|
|
91
|
-
|
|
91
|
+
connectUrl: json.connectUrl || undefined,
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
catch (err) {
|
|
@@ -97,7 +97,7 @@ export function useVanaData(config) {
|
|
|
97
97
|
finally {
|
|
98
98
|
setInitLoading(false);
|
|
99
99
|
}
|
|
100
|
-
}, [
|
|
100
|
+
}, [connectApiUrl, connect]);
|
|
101
101
|
const reset = useCallback(() => {
|
|
102
102
|
resetPoll();
|
|
103
103
|
setData(null);
|
|
@@ -106,6 +106,11 @@ export function useVanaData(config) {
|
|
|
106
106
|
setInitLoading(false);
|
|
107
107
|
autoFetchedRef.current = false;
|
|
108
108
|
}, [resetPoll]);
|
|
109
|
+
const openConnect = useCallback(() => {
|
|
110
|
+
if (connectUrl) {
|
|
111
|
+
window.open(connectUrl, "_blank", "noopener,noreferrer");
|
|
112
|
+
}
|
|
113
|
+
}, [connectUrl]);
|
|
109
114
|
const error = pollError ?? fetchError;
|
|
110
115
|
const isLoading = initLoading || fetching || pollStatus === "connecting";
|
|
111
116
|
const isConnected = pollStatus === "approved";
|
|
@@ -114,7 +119,8 @@ export function useVanaData(config) {
|
|
|
114
119
|
grant: pollGrant,
|
|
115
120
|
data,
|
|
116
121
|
error,
|
|
117
|
-
|
|
122
|
+
connectUrl,
|
|
123
|
+
openConnect,
|
|
118
124
|
initConnect,
|
|
119
125
|
fetchData,
|
|
120
126
|
reset,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVanaData.js","sourceRoot":"","sources":["../../src/react/useVanaData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"useVanaData.js","sourceRoot":"","sources":["../../src/react/useVanaData.ts"],"names":[],"mappings":"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"}
|
package/dist/server/connect.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { ConnectConfig, GetDataConfig, SessionInitResult } from "../core/types.js";
|
|
2
2
|
/**
|
|
3
|
-
* Creates a session on the Session Relay and returns the session ID and deep link URL.
|
|
3
|
+
* Creates a session on the Session Relay and returns the session ID, connect URL, and deep link URL.
|
|
4
4
|
*
|
|
5
|
-
* This is the entry point for the Vana Connect flow. The returned `
|
|
6
|
-
* should be presented to the user to
|
|
5
|
+
* This is the entry point for the Vana Connect flow. The returned `connectUrl`
|
|
6
|
+
* should be presented to the user to sign in on account.vana.org and launch Data Connect.
|
|
7
7
|
*
|
|
8
8
|
* @param config - Connection configuration including private key and scopes.
|
|
9
|
-
* @returns Session ID,
|
|
9
|
+
* @returns Session ID, connect URL, and expiration timestamp.
|
|
10
10
|
* @throws {@link ConnectError} with code `SESSION_INIT_FAILED` if the relay rejects the request.
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
@@ -15,7 +15,7 @@ import type { ConnectConfig, GetDataConfig, SessionInitResult } from "../core/ty
|
|
|
15
15
|
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
16
16
|
* scopes: ["chatgpt.conversations"],
|
|
17
17
|
* });
|
|
18
|
-
* // session.sessionId, session.
|
|
18
|
+
* // session.sessionId, session.connectUrl, session.expiresAt
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
export declare function connect(config: ConnectConfig): Promise<SessionInitResult>;
|
|
@@ -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;;;;;;;;;;;;;;;;;;GAkBG;AACH,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,CAiC5B;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
|
@@ -3,13 +3,13 @@ import { createRequestSigner } from "./request-signer.js";
|
|
|
3
3
|
import { createSessionRelay } from "./session-relay.js";
|
|
4
4
|
import { createDataClient } from "./data-client.js";
|
|
5
5
|
/**
|
|
6
|
-
* Creates a session on the Session Relay and returns the session ID and deep link URL.
|
|
6
|
+
* Creates a session on the Session Relay and returns the session ID, connect URL, and deep link URL.
|
|
7
7
|
*
|
|
8
|
-
* This is the entry point for the Vana Connect flow. The returned `
|
|
9
|
-
* should be presented to the user to
|
|
8
|
+
* This is the entry point for the Vana Connect flow. The returned `connectUrl`
|
|
9
|
+
* should be presented to the user to sign in on account.vana.org and launch Data Connect.
|
|
10
10
|
*
|
|
11
11
|
* @param config - Connection configuration including private key and scopes.
|
|
12
|
-
* @returns Session ID,
|
|
12
|
+
* @returns Session ID, connect URL, and expiration timestamp.
|
|
13
13
|
* @throws {@link ConnectError} with code `SESSION_INIT_FAILED` if the relay rejects the request.
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
@@ -18,11 +18,11 @@ import { createDataClient } from "./data-client.js";
|
|
|
18
18
|
* privateKey: process.env.VANA_PRIVATE_KEY as `0x${string}`,
|
|
19
19
|
* scopes: ["chatgpt.conversations"],
|
|
20
20
|
* });
|
|
21
|
-
* // session.sessionId, session.
|
|
21
|
+
* // session.sessionId, session.connectUrl, session.expiresAt
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
export async function connect(config) {
|
|
25
|
-
const { sessionRelayUrl } = getEnvConfig(config.environment);
|
|
25
|
+
const { sessionRelayUrl, accountUrl } = getEnvConfig(config.environment);
|
|
26
26
|
const signer = createRequestSigner({ privateKey: config.privateKey });
|
|
27
27
|
const granteeAddress = signer.address;
|
|
28
28
|
const relay = createSessionRelay({
|
|
@@ -30,11 +30,28 @@ export async function connect(config) {
|
|
|
30
30
|
granteeAddress,
|
|
31
31
|
sessionRelayUrl,
|
|
32
32
|
});
|
|
33
|
-
|
|
33
|
+
const relayResult = await relay.initSession({
|
|
34
34
|
scopes: config.scopes,
|
|
35
35
|
webhookUrl: config.webhookUrl,
|
|
36
36
|
appUserId: config.appUserId,
|
|
37
37
|
});
|
|
38
|
+
// Build the account.vana.org connect URL from the relay response
|
|
39
|
+
const connectUrl = new URL("/connect", accountUrl);
|
|
40
|
+
connectUrl.searchParams.set("sessionId", relayResult.sessionId);
|
|
41
|
+
try {
|
|
42
|
+
const deepLinkParams = new URL(relayResult.deepLinkUrl);
|
|
43
|
+
const secret = deepLinkParams.searchParams.get("secret");
|
|
44
|
+
if (secret)
|
|
45
|
+
connectUrl.searchParams.set("secret", secret);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// deepLinkUrl may not be a valid URL; proceed without secret
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
sessionId: relayResult.sessionId,
|
|
52
|
+
connectUrl: connectUrl.toString(),
|
|
53
|
+
expiresAt: relayResult.expiresAt,
|
|
54
|
+
};
|
|
38
55
|
}
|
|
39
56
|
/**
|
|
40
57
|
* Fetches user data from their Personal Server using a signed grant.
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/server/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createRequestSigner, type RequestSigner } from "./request-signer.js";
|
|
2
|
-
export { createSessionRelay, type SessionRelay } from "./session-relay.js";
|
|
2
|
+
export { createSessionRelay, type SessionRelay, type RelaySessionInitResult, } 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";
|
|
@@ -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,
|
|
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,EACL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createRequestSigner } from "./request-signer.js";
|
|
2
|
-
export { createSessionRelay } from "./session-relay.js";
|
|
2
|
+
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";
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,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,12 +1,18 @@
|
|
|
1
|
-
import type { SessionRelayConfig, SessionInitParams,
|
|
1
|
+
import type { SessionRelayConfig, SessionInitParams, SessionPollResult } from "../core/types.js";
|
|
2
|
+
/** Raw response from the Session Relay init endpoint. */
|
|
3
|
+
export interface RelaySessionInitResult {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
deepLinkUrl: string;
|
|
6
|
+
expiresAt: string;
|
|
7
|
+
}
|
|
2
8
|
/**
|
|
3
9
|
* Low-level client for the Session Relay service.
|
|
4
10
|
*
|
|
5
11
|
* @see {@link createSessionRelay} to create an instance.
|
|
6
12
|
*/
|
|
7
13
|
export interface SessionRelay {
|
|
8
|
-
/** Creates a new session and returns the
|
|
9
|
-
initSession(params: SessionInitParams): Promise<
|
|
14
|
+
/** Creates a new session and returns the raw relay response (sessionId, deepLinkUrl, expiresAt). */
|
|
15
|
+
initSession(params: SessionInitParams): Promise<RelaySessionInitResult>;
|
|
10
16
|
/** Polls the session status once. */
|
|
11
17
|
pollSession(sessionId: string): Promise<SessionPollResult>;
|
|
12
18
|
/**
|
|
@@ -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,
|
|
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,EAClB,MAAM,kBAAkB,CAAC;AAG1B,yDAAyD;AACzD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,oGAAoG;IACpG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACxE,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,CA8F3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendatalabs/connect",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "SDK for integrating Vana Data Portability 'Connect data' flows",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc --build",
|
|
42
42
|
"clean": "tsc --build --clean",
|
|
43
|
+
"skills:sync": "node scripts/sync-skills.js",
|
|
43
44
|
"test": "vitest run",
|
|
44
45
|
"test:watch": "vitest",
|
|
45
46
|
"test:e2e": "vitest run --config test/e2e/vitest.config.ts",
|