@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.
Files changed (68) hide show
  1. package/README.md +149 -49
  2. package/dist/core/constants.d.ts +28 -2
  3. package/dist/core/constants.d.ts.map +1 -1
  4. package/dist/core/constants.js +23 -2
  5. package/dist/core/constants.js.map +1 -1
  6. package/dist/core/errors.d.ts +43 -2
  7. package/dist/core/errors.d.ts.map +1 -1
  8. package/dist/core/errors.js +39 -0
  9. package/dist/core/errors.js.map +1 -1
  10. package/dist/core/grants.d.ts +19 -0
  11. package/dist/core/grants.d.ts.map +1 -0
  12. package/dist/core/grants.js +31 -0
  13. package/dist/core/grants.js.map +1 -0
  14. package/dist/core/index.d.ts +3 -2
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +3 -2
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/types.d.ts +61 -0
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/react/ConnectButton.d.ts +15 -0
  21. package/dist/react/ConnectButton.d.ts.map +1 -1
  22. package/dist/react/ConnectButton.js +8 -1
  23. package/dist/react/ConnectButton.js.map +1 -1
  24. package/dist/react/index.d.ts +1 -0
  25. package/dist/react/index.d.ts.map +1 -1
  26. package/dist/react/index.js +1 -0
  27. package/dist/react/index.js.map +1 -1
  28. package/dist/react/useVanaConnect.d.ts +33 -0
  29. package/dist/react/useVanaConnect.d.ts.map +1 -1
  30. package/dist/react/useVanaConnect.js +29 -3
  31. package/dist/react/useVanaConnect.js.map +1 -1
  32. package/dist/react/useVanaData.d.ts +67 -0
  33. package/dist/react/useVanaData.d.ts.map +1 -0
  34. package/dist/react/useVanaData.js +125 -0
  35. package/dist/react/useVanaData.js.map +1 -0
  36. package/dist/server/config.d.ts +36 -0
  37. package/dist/server/config.d.ts.map +1 -0
  38. package/dist/server/config.js +44 -0
  39. package/dist/server/config.js.map +1 -0
  40. package/dist/server/connect.d.ts +40 -1
  41. package/dist/server/connect.d.ts.map +1 -1
  42. package/dist/server/connect.js +46 -5
  43. package/dist/server/connect.js.map +1 -1
  44. package/dist/server/data-client.d.ts +17 -0
  45. package/dist/server/data-client.d.ts.map +1 -1
  46. package/dist/server/data-client.js +24 -7
  47. package/dist/server/data-client.js.map +1 -1
  48. package/dist/server/index.d.ts +2 -0
  49. package/dist/server/index.d.ts.map +1 -1
  50. package/dist/server/index.js +2 -0
  51. package/dist/server/index.js.map +1 -1
  52. package/dist/server/manifest-signer.d.ts +22 -0
  53. package/dist/server/manifest-signer.d.ts.map +1 -1
  54. package/dist/server/manifest-signer.js +22 -0
  55. package/dist/server/manifest-signer.js.map +1 -1
  56. package/dist/server/request-signer.d.ts +18 -0
  57. package/dist/server/request-signer.d.ts.map +1 -1
  58. package/dist/server/request-signer.js +6 -0
  59. package/dist/server/request-signer.js.map +1 -1
  60. package/dist/server/session-relay.d.ts +22 -0
  61. package/dist/server/session-relay.d.ts.map +1 -1
  62. package/dist/server/session-relay.js +12 -4
  63. package/dist/server/session-relay.js.map +1 -1
  64. package/dist/server/webhook.d.ts +11 -0
  65. package/dist/server/webhook.d.ts.map +1 -0
  66. package/dist/server/webhook.js +18 -0
  67. package/dist/server/webhook.js.map +1 -0
  68. package/package.json +2 -4
@@ -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
@@ -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;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB"}
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,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClE,0DAA0D;IAC1D,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;CAC3B;AAED,oDAAoD;AACpD,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,6DAA6D;IAC7D,cAAc,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,6CAA6C;IAC7C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,8BAA8B;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC9B;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,oCAAoC;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,mEAAmE;IACnE,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC9B;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -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 Vana Desktop App" }))] }));
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;AAYrD,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,uBAAuB,GAAK,CAC7D,IACG,CACP,CAAC;AACJ,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"}
@@ -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"}
@@ -1,3 +1,4 @@
1
1
  export { useVanaConnect, } from "./useVanaConnect.js";
2
2
  export { ConnectButton } from "./ConnectButton.js";
3
+ export { useVanaData, } from "./useVanaData.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -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;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACvE,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,oBAAoB,GAC5B,oBAAoB,CAmGtB"}
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 { SESSION_RELAY_URL } from "../core/constants.js";
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 baseUrl = SESSION_RELAY_URL;
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?.error?.errorCode;
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,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAoBzD,MAAM,UAAU,cAAc,CAC5B,MAA6B;IAE7B,MAAM,OAAO,GAAG,iBAAiB,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,EAAE,eAAe,IAAI,IAAI,CAAC;IAEjD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB,MAAM,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IAErE,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC9B,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,WAAW,EAAE,CAAC;QACd,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,cAAc,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,MAAmD,EAAE,EAAE;QACtD,WAAW,EAAE,CAAC;QACd,SAAS,CAAC,YAAY,CAAC,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,cAAc,CACZ,MAAM,CAAC,WAAW,IAAI,4BAA4B,MAAM,CAAC,SAAS,EAAE,CACrE,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,OAAO,eAAe,MAAM,CAAC,SAAS,OAAO,CAAC;QAEjE,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,qDAAqD;oBACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBAChD,MAAM,SAAS,GAAI,IAAY,EAAE,KAAK,EAAE,SAAS,CAAC;oBAElD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;wBAC1D,SAAS,CAAC,SAAS,CAAC,CAAC;wBACrB,QAAQ,CAAC,iBAAiB,CAAC,CAAC;oBAC9B,CAAC;yBAAM,CAAC;wBACN,SAAS,CAAC,OAAO,CAAC,CAAC;wBACnB,QAAQ,CAAC,gBAAgB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBACzC,CAAC;oBACD,WAAW,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;gBAEvD,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;oBACtB,KAAK,SAAS,CAAC;oBACf,KAAK,SAAS;wBACZ,SAAS,CAAC,SAAS,CAAC,CAAC;wBACrB,MAAM;oBACR,KAAK,UAAU;wBACb,SAAS,CAAC,UAAU,CAAC,CAAC;wBACtB,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;wBAC/B,WAAW,EAAE,CAAC;wBACd,MAAM;oBACR,KAAK,QAAQ;wBACX,SAAS,CAAC,QAAQ,CAAC,CAAC;wBACpB,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,yBAAyB,CAAC,CAAC;wBACrD,WAAW,EAAE,CAAC;wBACd,MAAM;oBACR,KAAK,SAAS;wBACZ,SAAS,CAAC,SAAS,CAAC,CAAC;wBACrB,QAAQ,CAAC,iBAAiB,CAAC,CAAC;wBAC5B,WAAW,EAAE,CAAC;wBACd,MAAM;gBACV,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,QAAQ,CACN,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAC7D,CAAC;gBACF,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QAEF,2CAA2C;QAC3C,KAAK,IAAI,EAAE,CAAC;QACZ,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CACjC,CAAC;IAEF,qBAAqB;IACrB,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC"}
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