@centia-io/sdk 0.0.28 → 0.0.29

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 CHANGED
@@ -1,30 +1,36 @@
1
- # @centia-io/sdk
1
+ # SDK
2
2
 
3
- TypeScript/JavaScript client SDK for Centia GC2. It provides:
3
+ TypeScript/JavaScript client SDK for Centia-io. It provides:
4
4
 
5
5
  - Authentication helpers:
6
- - CodeFlow (OAuth 2.0 Authorization Code + PKCE) for browser apps
7
- - PasswordFlow for trusted/CLI/server environments
6
+ - CodeFlow (OAuth 2.0 Authorization Code + PKCE) for browser apps
7
+ - PasswordFlow for trusted/CLI/server environments
8
8
  - Data access:
9
- - Sql: Execute parameterized SQL
10
- - Rpc: Call JSON-RPC methods
11
- - createApi: A tiny type-safe helper that maps TypeScript interfaces to JSON‑RPC calls
12
-
13
- This README focuses on CodeFlow, PasswordFlow, Sql, Rpc and Api.ts (createApi).
9
+ - Sql: Execute parameterized SQL
10
+ - Rpc: Call JSON-RPC methods
11
+ - createApi: A tiny type-safe helper that maps TypeScript interfaces to JSON‑RPC calls
14
12
 
15
13
  ## Installation
16
14
 
17
- - npm: `npm install @centia-io/sdk`
18
- - pnpm: `pnpm add @centia-io/sdk`
19
- - yarn: `yarn add @centia-io/sdk`
15
+ ```bash
16
+ npm install @centia-io/sdk
17
+ yarn add @centia-io/sdk
18
+ pnpm add @centia-io/sdk
19
+ ```
20
+
21
+ Or from CDN:
22
+
23
+ ```html
24
+ <script src="https://cdn.jsdelivr.net/npm/@centia-io/sdk@latest/dist/centia-io-sdk.umd.js"></script>
25
+ ```
20
26
 
21
27
  Requirements:
22
28
  - Browser or Node.js 18+ (for global `fetch`).
23
- - An accessible GC2 host URL and client credentials.
29
+ - An accessible Centia.io host URL and client credentials.
24
30
 
25
31
  ESM import:
26
32
  ```ts
27
- import { CodeFlow, PasswordFlow, Sql, Rpc, createApi } from "@centia-io/sdk";
33
+ import { CodeFlow, PasswordFlow, Sql, Rpc, createApi, SignUp } from "@centia-io/sdk";
28
34
  import type { RpcRequest, RpcResponse, PgTypes } from "@centia-io/sdk";
29
35
  ```
30
36
 
@@ -38,23 +44,22 @@ The SDK handles token storage and refresh for you.
38
44
 
39
45
  ### CodeFlow (Browser, OAuth 2.0 Authorization Code + PKCE)
40
46
 
41
- Use this flow in browser applications where you can redirect the user to the GC2 login page.
47
+ Use this flow in browser applications where you can redirect the user to the Centia-io login page.
42
48
 
43
49
  Required options:
44
- - `host`: Base URL of your GC2 instance, e.g. `https://your.gc2.host`
45
- - `clientId`: OAuth client id configured in GC2
46
- - `redirectUri`: The URL in your app that handles the redirect back from GC2 (must be whitelisted)
47
- - `scope` (optional): space‑separated scopes, e.g. `"openid profile"`
50
+ - `host`: Base URL of your Centia-io instance, e.g. `https://api.centia.io`
51
+ - `clientId`: OAuth client id configured in Centia.io
52
+ - `redirectUri`: The URL in your app that handles the redirect back from Centia.io (must be whitelisted)
53
+ - `scope` (optional): Not in use yet, but will be used to request additional permissions from the user.
48
54
 
49
55
  Example (vanilla JS/TS + SPA):
50
56
  ```ts
51
57
  import { CodeFlow } from "@centia-io/sdk";
52
58
 
53
59
  const codeFlow = new CodeFlow({
54
- host: "https://your.gc2.host",
60
+ host: "https://api.centia.io",
55
61
  clientId: "your-client-id",
56
- redirectUri: window.location.origin + "/auth/callback",
57
- scope: "openid"
62
+ redirectUri: window.location.origin + "/auth/callback"
58
63
  });
59
64
 
60
65
  // On app startup, call redirectHandle() once to complete a login redirect (if any)
@@ -76,7 +81,7 @@ function onLogoutClick() {
76
81
  ```
77
82
 
78
83
  Notes:
79
- - `redirectHandle()` detects errors from the auth server, validates `state` (CSRF protection), exchanges the `code` for tokens, stores tokens and cleans up the URL.
84
+ - `redirectHandle()` detects errors from the auth server, validates `state` (CSRF protection), exchanges the `code` for tokens, performs `PKCE` (Proof Key for Code Exchange), stores tokens and cleans up the URL.
80
85
  - `signOut()` clears local tokens/options and redirects to the sign-out URL. If you only need to clear local state without redirect, call `codeFlow.clear()`.
81
86
 
82
87
  ### PasswordFlow (Trusted environments, CLI/Server)
@@ -95,11 +100,11 @@ Example (Node.js):
95
100
  import { PasswordFlow } from "@centia-io/sdk";
96
101
 
97
102
  const flow = new PasswordFlow({
98
- host: "http://localhost:8080",
99
- clientId: "gc2-cli",
100
- username: "mydb",
101
- password: "secret",
102
- database: "mydb"
103
+ host: "https://api.centia.io",
104
+ clientId: "your-client-id",
105
+ username: "your-username",
106
+ password: "your-password",
107
+ database: "parent-database" // The database to connect to. If superuser, this is the sam as username.
103
108
  });
104
109
 
105
110
  await flow.signIn();
@@ -110,7 +115,37 @@ await flow.signIn();
110
115
  flow.signOut(); // Clears tokens/options in local storage (no redirect)
111
116
  ```
112
117
 
113
- ---
118
+ ### SignUp (Browser – Create a new user)
119
+
120
+ Use this helper in browser applications to redirect the user to the Centia‑io sign‑up page.
121
+ The user will create an account under a specified parent database/tenant and then be redirected back to your application.
122
+
123
+ Required options:
124
+ - host: Base URL of your Centia‑io instance, e.g. https://api.centia.io
125
+ - clientId: OAuth client id configured in Centia.io
126
+ - parentDb: The parent/tenant database under which the new user should be created
127
+ - redirectUri: URL in your app to return to after sign‑up
128
+
129
+ Example (vanilla JS/TS):
130
+ ```ts
131
+ import { SignUp } from "@centia-io/sdk";
132
+
133
+ const signUp = new SignUp({
134
+ host: "https://api.centia.io",
135
+ clientId: "your-client-id",
136
+ parentDb: "your-parent-database",
137
+ redirectUri: window.location.origin + "/auth/callback"
138
+ });
139
+
140
+ // Start sign-up when the user clicks "Create account"
141
+ function onSignUpClick() {
142
+ signUp.signUp(); // Redirects to GC2 sign-up page
143
+ }
144
+ ```
145
+
146
+ Notes:
147
+ - Default endpoint is {host}/signup/. You can override with authUri if needed.
148
+ - After the user completes sign‑up and is redirected back to your app, start your normal sign‑in flow (e.g., CodeFlow. A session is started when the user signed up, so the user will be signed in automatically in the flow.)
114
149
 
115
150
  ## SQL
116
151
 
@@ -118,17 +153,17 @@ Execute parameterized SQL against GC2.
118
153
 
119
154
  - Class: `new Sql()`
120
155
  - Method: `exec(request: SqlRequest): Promise<SQLResponse>`
121
- - Endpoint: `POST {host}/api/v4/sql`
156
+ - Endpoint: `POST https://api.centia.io/api/v4/sql`
122
157
 
123
158
  Types (simplified):
124
159
  - `SqlRequest` has:
125
- - `q`: SQL string, you can use named placeholders like `:a` (server-side feature)
126
- - `params?`: object with values for placeholders
127
- - `type_hints?`: optional explicit type hints
128
- - `type_formats?`: optional per-column format strings
160
+ - `q`: SQL string, you can use named placeholders like `:a` (server-side feature)
161
+ - `params?`: object with values for placeholders
162
+ - `type_hints?`: optional explicit type hints
163
+ - `type_formats?`: optional per-column format strings
129
164
  - `SQLResponse` has:
130
- - `schema`: a map of column name -> `{ type: string, array: boolean }`
131
- - `data`: an array of rows (records)
165
+ - `schema`: a map of column name -> `{ type: string, array: boolean }`
166
+ - `data`: an array of rows (records)
132
167
 
133
168
  Example:
134
169
  ```ts
@@ -146,7 +181,8 @@ const payload = {
146
181
 
147
182
  const res = await sql.exec({
148
183
  q: "select :a::int as a, :b::varchar as b, :c::numeric as c, :d::varchar[] as d, :e::jsonb as e",
149
- params: payload
184
+ params: payload,
185
+ type_hints: { d: "varchar[]" } // Arrays are not inferred by default, and must be specified explicitly
150
186
  });
151
187
 
152
188
  console.log(res.schema); // { a: {type: 'int4', array: false}, ... }
@@ -159,9 +195,9 @@ import type { PgTypes } from "@centia-io/sdk";
159
195
 
160
196
  interface Row extends PgTypes.DataRow {
161
197
  a: number;
162
- b: string;
198
+ b: Pgtypes.Varchar;
163
199
  c: PgTypes.NumericString;
164
- d: PgTypes.PgArray<string>;
200
+ d: PgTypes.PgArray<Pgtypes.Varchar>;
165
201
  e: PgTypes.JsonValue;
166
202
  }
167
203
 
@@ -169,8 +205,6 @@ interface Row extends PgTypes.DataRow {
169
205
  const res = await sql.exec({ q: "...", params: payload }) as PgTypes.SQLResponse<Row>;
170
206
  ```
171
207
 
172
- ---
173
-
174
208
  ## RPC
175
209
 
176
210
  Call JSON‑RPC methods exposed by GC2.
@@ -214,9 +248,7 @@ interface Row extends PgTypes.DataRow {
214
248
  const res = await rpc.call({ jsonrpc: "2.0", method: "typeTest", params: payload }) as PgTypes.RpcResponse<Row>;
215
249
  ```
216
250
 
217
- ---
218
-
219
- ## createApi (Api.ts)
251
+ ## createApi
220
252
 
221
253
  A tiny helper that builds a Proxy around `Rpc` so you can call `api.someMethod(params)` directly, with TypeScript autocompletion and type‑checking based on your own interface.
222
254
 
@@ -231,15 +263,15 @@ import type { PgTypes } from "@centia-io/sdk";
231
263
  interface MyApi {
232
264
  typeTest(params: {
233
265
  a: number;
234
- b: string;
266
+ b: Pgtypes.Varchar;
235
267
  c: PgTypes.NumericString;
236
- d: PgTypes.PgArray<string>;
268
+ d: PgTypes.PgArray<Pgtypes.Varchar>;
237
269
  e: PgTypes.JsonValue;
238
270
  }): Promise<Array<{
239
271
  a: number;
240
- b: string;
272
+ b: Pgtypes.Varchar;
241
273
  c: PgTypes.NumericString;
242
- d: PgTypes.PgArray<string>;
274
+ d: PgTypes.PgArray<Pgtypes.Varchar>;
243
275
  e: PgTypes.JsonValue;
244
276
  }>>;
245
277
  }
@@ -248,10 +280,10 @@ const api = createApi<MyApi>();
248
280
 
249
281
  const rows = await api.typeTest({
250
282
  a: 1,
251
- b: "hej",
283
+ b: "Hello world",
252
284
  c: "3.4",
253
- d: ["ds", "sdsd"],
254
- e: { zdsd: [2,3,4,5,6,7,8,9,10] }
285
+ d: ["Hello", "world"],
286
+ e: { "x": [1,2,3,4,5,6,7,8,9,10] }
255
287
  });
256
288
 
257
289
  console.log(rows); // typed row array
@@ -261,28 +293,17 @@ Notes:
261
293
  - `createApi<T>()` relies on naming conventions: the property name is the JSON‑RPC `method` name.
262
294
  - Each call returns `result.data` from the RPC response (array of rows).
263
295
 
264
- ---
265
-
266
296
  ## Error handling
267
297
 
268
298
  - Network/HTTP errors: thrown as `Error` with the status/body text when available.
269
299
  - Auth errors: the SDK auto‑refreshes access tokens when possible. If the refresh token is expired or missing, you’ll get an error and should re‑authenticate.
270
300
 
271
- ---
272
301
 
273
302
  ## Environment details
274
303
 
275
304
  - Storage: tokens/options stored in `localStorage` when available; otherwise a global in‑memory store is used (`globalThis.__gc2_memory_storage`).
276
305
  - Fetch: Node.js 18+ recommended (includes native `fetch`). For older Node versions, add a Fetch polyfill.
277
306
 
278
- ---
279
-
280
- ## Examples
281
-
282
- See the `examples/` folder for runnable snippets showing PasswordFlow + Sql/Rpc and browser CodeFlow usage.
283
-
284
- ---
285
-
286
307
  ## License
287
308
 
288
- AGPL-3.0
309
+ The SDK is licensed under [The MIT License](https://opensource.org/license/mit)
@@ -199,6 +199,9 @@ var Gc2Service = class {
199
199
  isPasswordFlowOptions(options) {
200
200
  return "username" in options;
201
201
  }
202
+ isSignUpOptions(options) {
203
+ return "parentDb" in options;
204
+ }
202
205
  buildUrl(path) {
203
206
  if (path.startsWith("http://") || path.startsWith("https://")) return path;
204
207
  return `${this.host}${path}`;
@@ -263,6 +266,15 @@ var Gc2Service = class {
263
266
  if (this.options.scope) params.set("scope", this.options.scope);
264
267
  return `${base}?${params.toString()}`;
265
268
  }
269
+ getSignUpURL() {
270
+ if (!this.isSignUpOptions(this.options)) throw new Error("CodeFlow options required for this operation");
271
+ const base = this.options.authUri ?? `${this.host}/signup/`;
272
+ const params = new URLSearchParams();
273
+ params.set("client_id", this.options.clientId);
274
+ params.set("parentdb", this.options.parentDb);
275
+ params.set("redirect_uri", this.options.redirectUri);
276
+ return `${base}?${params.toString()}`;
277
+ }
266
278
  async getAuthorizationCodeToken(code, codeVerifier) {
267
279
  let redirectUri;
268
280
  if (this.isCodeFlowOptions(this.options)) redirectUri = this.options.redirectUri;
@@ -502,17 +514,20 @@ var Users = class {
502
514
  var Ws = class {
503
515
  constructor(options) {
504
516
  this.options = options;
517
+ this.options.wsClient = this.options?.wsClient ?? WebSocket;
505
518
  }
506
519
  connect() {
507
520
  const me = this;
508
521
  const { accessToken } = getTokens();
509
522
  const connect = () => {
510
- const ws = new WebSocket(this.options.host + `/?token=` + accessToken);
523
+ let queryString = `?token=` + accessToken;
524
+ if (this.options?.rel) queryString = queryString + `&rel=` + this.options.rel;
525
+ const ws = new this.options.wsClient(this.options.host + `/` + queryString);
511
526
  ws.onopen = function() {
512
527
  console.log("WebSocket connected!");
513
528
  };
514
529
  ws.onmessage = function(event) {
515
- me.options?.callBack(event.data);
530
+ me.options.callBack(event.data);
516
531
  };
517
532
  ws.onclose = function(event) {
518
533
  if (accessToken !== "") {
@@ -573,12 +588,25 @@ function createApi() {
573
588
  } });
574
589
  }
575
590
 
591
+ //#endregion
592
+ //#region src/SignUp.ts
593
+ var SignUp = class {
594
+ constructor(options) {
595
+ this.options = options;
596
+ this.service = new Gc2Service(options);
597
+ }
598
+ async signUp() {
599
+ window.location = this.service.getSignUpURL();
600
+ }
601
+ };
602
+
576
603
  //#endregion
577
604
  exports.Claims = Claims;
578
605
  exports.CodeFlow = CodeFlow;
579
606
  exports.Meta = Meta;
580
607
  exports.PasswordFlow = PasswordFlow;
581
608
  exports.Rpc = Rpc;
609
+ exports.SignUp = SignUp;
582
610
  exports.Sql = Sql;
583
611
  exports.Stats = Stats;
584
612
  exports.Status = Status;
@@ -23,9 +23,17 @@ type PasswordFlowOptions = Options & {
23
23
  password: string;
24
24
  database: string;
25
25
  };
26
+ type SignUpOptions = Options & {
27
+ host: string;
28
+ clientId: string;
29
+ parentDb: string;
30
+ redirectUri: string;
31
+ };
26
32
  type WsOptions = {
27
33
  host: string;
28
- callBack?: any;
34
+ callBack: Function;
35
+ rel?: string;
36
+ wsClient?: unknown;
29
37
  };
30
38
  type GetDeviceCodeResponse = {
31
39
  device_code: string;
@@ -51,14 +59,16 @@ type GetTokenResponse = {
51
59
  declare class Gc2Service {
52
60
  private readonly options;
53
61
  private readonly host;
54
- constructor(options: CodeFlowOptions | PasswordFlowOptions);
62
+ constructor(options: CodeFlowOptions | PasswordFlowOptions | SignUpOptions);
55
63
  private isCodeFlowOptions;
56
64
  private isPasswordFlowOptions;
65
+ private isSignUpOptions;
57
66
  private buildUrl;
58
67
  private request;
59
68
  getDeviceCode(): Promise<GetDeviceCodeResponse>;
60
69
  pollToken(deviceCode: string, interval: number): Promise<GetTokenResponse>;
61
70
  getAuthorizationCodeURL(codeChallenge: string, state: string): string;
71
+ getSignUpURL(): string;
62
72
  getAuthorizationCodeToken(code: string | string[], codeVerifier: string | null): Promise<GetTokenResponse>;
63
73
  getPasswordToken(): Promise<GetTokenResponse>;
64
74
  getRefreshToken(token: string): Promise<GetTokenResponse>;
@@ -239,5 +249,13 @@ declare class Tables {
239
249
  type MethodsOf<T> = { [K in keyof T]: T[K] extends ((...args: infer A) => infer R) ? (...args: A) => R : never };
240
250
  declare function createApi<T>(): MethodsOf<T>;
241
251
  //#endregion
242
- export { Claims, CodeFlow, type CodeFlowOptions, Meta, type Options, PasswordFlow, type PasswordFlowOptions, type pgTypes_d_exports as PgTypes, Rpc, type RpcRequest, type RpcResponse, Sql, Stats, Status, Tables, Users, Ws, createApi };
252
+ //#region src/SignUp.d.ts
253
+ declare class SignUp {
254
+ options: SignUpOptions;
255
+ service: Gc2Service;
256
+ constructor(options: SignUpOptions);
257
+ signUp(): Promise<void>;
258
+ }
259
+ //#endregion
260
+ export { Claims, CodeFlow, type CodeFlowOptions, Meta, type Options, PasswordFlow, type PasswordFlowOptions, type pgTypes_d_exports as PgTypes, Rpc, type RpcRequest, type RpcResponse, SignUp, Sql, Stats, Status, Tables, Users, Ws, createApi };
243
261
  //# sourceMappingURL=centia-io-sdk.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"centia-io-sdk.d.cts","names":[],"sources":["../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/types/pgTypes.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"centia-io-sdk.d.cts","names":[],"sources":["../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/types/pgTypes.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts","../src/SignUp.ts"],"sourcesContent":[],"mappings":"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"}
@@ -23,9 +23,17 @@ type PasswordFlowOptions = Options & {
23
23
  password: string;
24
24
  database: string;
25
25
  };
26
+ type SignUpOptions = Options & {
27
+ host: string;
28
+ clientId: string;
29
+ parentDb: string;
30
+ redirectUri: string;
31
+ };
26
32
  type WsOptions = {
27
33
  host: string;
28
- callBack?: any;
34
+ callBack: Function;
35
+ rel?: string;
36
+ wsClient?: unknown;
29
37
  };
30
38
  type GetDeviceCodeResponse = {
31
39
  device_code: string;
@@ -51,14 +59,16 @@ type GetTokenResponse = {
51
59
  declare class Gc2Service {
52
60
  private readonly options;
53
61
  private readonly host;
54
- constructor(options: CodeFlowOptions | PasswordFlowOptions);
62
+ constructor(options: CodeFlowOptions | PasswordFlowOptions | SignUpOptions);
55
63
  private isCodeFlowOptions;
56
64
  private isPasswordFlowOptions;
65
+ private isSignUpOptions;
57
66
  private buildUrl;
58
67
  private request;
59
68
  getDeviceCode(): Promise<GetDeviceCodeResponse>;
60
69
  pollToken(deviceCode: string, interval: number): Promise<GetTokenResponse>;
61
70
  getAuthorizationCodeURL(codeChallenge: string, state: string): string;
71
+ getSignUpURL(): string;
62
72
  getAuthorizationCodeToken(code: string | string[], codeVerifier: string | null): Promise<GetTokenResponse>;
63
73
  getPasswordToken(): Promise<GetTokenResponse>;
64
74
  getRefreshToken(token: string): Promise<GetTokenResponse>;
@@ -239,5 +249,13 @@ declare class Tables {
239
249
  type MethodsOf<T> = { [K in keyof T]: T[K] extends ((...args: infer A) => infer R) ? (...args: A) => R : never };
240
250
  declare function createApi<T>(): MethodsOf<T>;
241
251
  //#endregion
242
- export { Claims, CodeFlow, type CodeFlowOptions, Meta, type Options, PasswordFlow, type PasswordFlowOptions, type pgTypes_d_exports as PgTypes, Rpc, type RpcRequest, type RpcResponse, Sql, Stats, Status, Tables, Users, Ws, createApi };
252
+ //#region src/SignUp.d.ts
253
+ declare class SignUp {
254
+ options: SignUpOptions;
255
+ service: Gc2Service;
256
+ constructor(options: SignUpOptions);
257
+ signUp(): Promise<void>;
258
+ }
259
+ //#endregion
260
+ export { Claims, CodeFlow, type CodeFlowOptions, Meta, type Options, PasswordFlow, type PasswordFlowOptions, type pgTypes_d_exports as PgTypes, Rpc, type RpcRequest, type RpcResponse, SignUp, Sql, Stats, Status, Tables, Users, Ws, createApi };
243
261
  //# sourceMappingURL=centia-io-sdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"centia-io-sdk.d.ts","names":[],"sources":["../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/types/pgTypes.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"centia-io-sdk.d.ts","names":[],"sources":["../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/types/pgTypes.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts","../src/SignUp.ts"],"sourcesContent":[],"mappings":"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"}
@@ -198,6 +198,9 @@ var Gc2Service = class {
198
198
  isPasswordFlowOptions(options) {
199
199
  return "username" in options;
200
200
  }
201
+ isSignUpOptions(options) {
202
+ return "parentDb" in options;
203
+ }
201
204
  buildUrl(path) {
202
205
  if (path.startsWith("http://") || path.startsWith("https://")) return path;
203
206
  return `${this.host}${path}`;
@@ -262,6 +265,15 @@ var Gc2Service = class {
262
265
  if (this.options.scope) params.set("scope", this.options.scope);
263
266
  return `${base}?${params.toString()}`;
264
267
  }
268
+ getSignUpURL() {
269
+ if (!this.isSignUpOptions(this.options)) throw new Error("CodeFlow options required for this operation");
270
+ const base = this.options.authUri ?? `${this.host}/signup/`;
271
+ const params = new URLSearchParams();
272
+ params.set("client_id", this.options.clientId);
273
+ params.set("parentdb", this.options.parentDb);
274
+ params.set("redirect_uri", this.options.redirectUri);
275
+ return `${base}?${params.toString()}`;
276
+ }
265
277
  async getAuthorizationCodeToken(code, codeVerifier) {
266
278
  let redirectUri;
267
279
  if (this.isCodeFlowOptions(this.options)) redirectUri = this.options.redirectUri;
@@ -501,17 +513,20 @@ var Users = class {
501
513
  var Ws = class {
502
514
  constructor(options) {
503
515
  this.options = options;
516
+ this.options.wsClient = this.options?.wsClient ?? WebSocket;
504
517
  }
505
518
  connect() {
506
519
  const me = this;
507
520
  const { accessToken } = getTokens();
508
521
  const connect = () => {
509
- const ws = new WebSocket(this.options.host + `/?token=` + accessToken);
522
+ let queryString = `?token=` + accessToken;
523
+ if (this.options?.rel) queryString = queryString + `&rel=` + this.options.rel;
524
+ const ws = new this.options.wsClient(this.options.host + `/` + queryString);
510
525
  ws.onopen = function() {
511
526
  console.log("WebSocket connected!");
512
527
  };
513
528
  ws.onmessage = function(event) {
514
- me.options?.callBack(event.data);
529
+ me.options.callBack(event.data);
515
530
  };
516
531
  ws.onclose = function(event) {
517
532
  if (accessToken !== "") {
@@ -573,5 +588,17 @@ function createApi() {
573
588
  }
574
589
 
575
590
  //#endregion
576
- export { Claims, CodeFlow, Meta, PasswordFlow, Rpc, Sql, Stats, Status, Tables, Users, Ws, createApi };
591
+ //#region src/SignUp.ts
592
+ var SignUp = class {
593
+ constructor(options) {
594
+ this.options = options;
595
+ this.service = new Gc2Service(options);
596
+ }
597
+ async signUp() {
598
+ window.location = this.service.getSignUpURL();
599
+ }
600
+ };
601
+
602
+ //#endregion
603
+ export { Claims, CodeFlow, Meta, PasswordFlow, Rpc, SignUp, Sql, Stats, Status, Tables, Users, Ws, createApi };
577
604
  //# sourceMappingURL=centia-io-sdk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"centia-io-sdk.js","names":["decoded: string","cached: StorageLike | null","g: any","g","str: string | null","tokens: any","options: any","headers: Record<string, string>","payload: string","e: any","redirectUri: string","url: string","e: any","headers: headers","request: RequestInit","getHeaders","res: any","get","make","get","make","get","make","get","make","get","make","get","make","request: RpcRequest"],"sources":["../src/util/jwt-decode.ts","../src/util/storage.ts","../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/util/request-headers.ts","../src/util/make-request.ts","../src/util/get-response.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts"],"sourcesContent":["/**\r\n * The MIT License (MIT)\r\n *\r\n * Copyright (c) 2015 Auth0, Inc. <support@auth0.com> (http://auth0.com)\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n */\r\n\r\nexport interface JwtDecodeOptions {\r\n header?: boolean;\r\n}\r\n\r\nexport interface JwtHeader {\r\n typ?: string;\r\n alg?: string;\r\n kid?: string;\r\n}\r\n\r\nexport interface JwtPayload {\r\n iss?: string;\r\n sub?: string;\r\n aud?: string[] | string;\r\n exp?: number;\r\n nbf?: number;\r\n iat?: number;\r\n jti?: string;\r\n}\r\n\r\nexport class InvalidTokenError extends Error {}\r\n\r\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\r\n\r\nfunction b64DecodeUnicode(str: string) {\r\n return decodeURIComponent(\r\n atob(str).replace(/(.)/g, (m, p) => {\r\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\r\n if (code.length < 2) {\r\n code = \"0\" + code;\r\n }\r\n return \"%\" + code;\r\n }),\r\n );\r\n}\r\n\r\nfunction base64UrlDecode(str: string) {\r\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n switch (output.length % 4) {\r\n case 0:\r\n break;\r\n case 2:\r\n output += \"==\";\r\n break;\r\n case 3:\r\n output += \"=\";\r\n break;\r\n default:\r\n throw new Error(\"base64 string is not of the correct length\");\r\n }\r\n\r\n try {\r\n return b64DecodeUnicode(output);\r\n } catch (err) {\r\n return atob(output);\r\n }\r\n}\r\n\r\nexport function jwtDecode<T = JwtHeader>(\r\n token: string,\r\n options: JwtDecodeOptions & { header: true },\r\n): T;\r\nexport function jwtDecode<T = JwtPayload>(token: string, options?: JwtDecodeOptions): T;\r\nexport function jwtDecode<T = JwtHeader | JwtPayload>(\r\n token: string,\r\n options?: JwtDecodeOptions,\r\n): T {\r\n if (typeof token !== \"string\") {\r\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\r\n }\r\n\r\n options ||= {};\r\n\r\n const pos = options.header === true ? 0 : 1;\r\n const part = token.split(\".\")[pos];\r\n\r\n if (typeof part !== \"string\") {\r\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\r\n }\r\n\r\n let decoded: string;\r\n try {\r\n decoded = base64UrlDecode(part);\r\n } catch (e) {\r\n throw new InvalidTokenError(\r\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\r\n );\r\n }\r\n\r\n try {\r\n return JSON.parse(decoded) as T;\r\n } catch (e) {\r\n throw new InvalidTokenError(\r\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\r\n );\r\n }\r\n}\r\n","export interface StorageLike {\r\n getItem(key: string): string | null\r\n setItem(key: string, value: string): void\r\n removeItem(key: string): void\r\n}\r\n\r\nclass MemoryStorage implements StorageLike {\r\n private store = new Map<string, string>()\r\n\r\n getItem(key: string): string | null {\r\n return this.store.has(key) ? this.store.get(key)! : null\r\n }\r\n\r\n setItem(key: string, value: string): void {\r\n this.store.set(key, String(value))\r\n }\r\n\r\n removeItem(key: string): void {\r\n this.store.delete(key)\r\n }\r\n}\r\n\r\nlet cached: StorageLike | null = null\r\n\r\nexport function getStorage(): StorageLike {\r\n if (cached) return cached\r\n try {\r\n const g: any = typeof globalThis !== 'undefined' ? (globalThis as any) : (window as any)\r\n if (g && g.localStorage && typeof g.localStorage.getItem === 'function') {\r\n cached = g.localStorage as StorageLike\r\n return cached\r\n }\r\n } catch (e) {\r\n // ignore and fall back to memory storage\r\n }\r\n const g: any = typeof globalThis !== 'undefined' ? (globalThis as any) : {}\r\n if (!g.__gc2_memory_storage) {\r\n g.__gc2_memory_storage = new MemoryStorage()\r\n }\r\n cached = g.__gc2_memory_storage as StorageLike\r\n return cached\r\n}\r\n","import {jwtDecode} from './jwt-decode'\r\nimport {Gc2Service} from \"../services/gc2.services\";\r\nimport {getStorage} from './storage'\r\n\r\nexport type Tokens = {\r\n accessToken: string;\r\n refreshToken: string;\r\n idToken?: string;\r\n};\r\n\r\nexport type Options = {\r\n host: string;\r\n wsHost?: string;\r\n tokenUri?: string;\r\n authUri?: string;\r\n logoutUri?: string;\r\n deviceUri?: string;\r\n scope?: string;\r\n clientId: string;\r\n}\r\n\r\nexport type CodeFlowOptions = Options & {\r\n redirectUri: string;\r\n}\r\n\r\nexport type PasswordFlowOptions = Options & {\r\n username: string;\r\n password: string;\r\n database: string;\r\n}\r\n\r\nexport type WsOptions = {\r\n host: string;\r\n callBack?: any;\r\n}\r\n\r\nexport type GetDeviceCodeResponse = {\r\n device_code: string;\r\n user_code: string;\r\n verification_uri: string;\r\n verification_uri_complete?: string;\r\n expires_in: number;\r\n interval: number;\r\n};\r\n\r\nexport type GetTokenResponse = {\r\n access_token: string;\r\n expires_in: number;\r\n refresh_expires_in: number;\r\n refresh_token: string;\r\n id_token?: string;\r\n token_type: string;\r\n 'not-before-policy': number;\r\n session_state: string;\r\n scope: string;\r\n};\r\n\r\n\r\nexport const generatePkceChallenge = async () => {\r\n\r\n const generateRandomString = () => {\r\n const array = new Uint32Array(28);\r\n crypto.getRandomValues(array);\r\n return Array.from(array, dec => ('0' + dec.toString(16)).substr(-2)).join('');\r\n }\r\n\r\n const sha256 = (plain: string | undefined) => {\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(plain);\r\n return crypto.subtle.digest('SHA-256', data);\r\n }\r\n\r\n const base64urlEncode = (str: ArrayBuffer) => {\r\n\r\n return btoa(String.fromCharCode.apply(null, [...new Uint8Array(str)]))\r\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n }\r\n\r\n async function pkceChallengeFromVerifier(v: string | undefined) {\r\n const hashed = await sha256(v);\r\n return base64urlEncode(hashed);\r\n }\r\n\r\n const {state, codeVerifier} = {\r\n state: generateRandomString(),\r\n codeVerifier: generateRandomString(),\r\n };\r\n const codeChallenge = await pkceChallengeFromVerifier(codeVerifier);\r\n\r\n return {\r\n state,\r\n codeVerifier,\r\n codeChallenge,\r\n }\r\n}\r\n\r\nexport const isTokenExpired = (token: string): boolean => {\r\n let isJwtExpired = false\r\n const {exp} = jwtDecode(token)\r\n const currentTime = new Date().getTime() / 1000\r\n\r\n if (exp) {\r\n if (currentTime > exp) isJwtExpired = true\r\n }\r\n return isJwtExpired\r\n}\r\n\r\nexport const claims = (token: string): any => {\r\n return jwtDecode(token)\r\n}\r\n\r\nexport const passwordIsStrongEnough = (password: string, allowNull: boolean = false) => {\r\n const message = 'Entered password is too weak'\r\n if (password === '' && allowNull) return true\r\n if (password.length < 8) return message\r\n if (!(/[A-Z]/.test(password))) return message\r\n if (!(/[a-z]/.test(password))) return message\r\n if (!(/\\d/.test(password))) return message\r\n return true\r\n}\r\n\r\nexport const isLogin = async (gc2: Gc2Service): Promise<boolean> => {\r\n const {accessToken, refreshToken} = getTokens()\r\n if (!accessToken && !refreshToken) {\r\n return false\r\n }\r\n if (!accessToken || (accessToken && isTokenExpired(accessToken))) {\r\n if (refreshToken && isTokenExpired(refreshToken)) {\r\n clearTokens()\r\n clearOptions()\r\n throw new Error('Refresh token has expired. Please login again.')\r\n }\r\n if (refreshToken) {\r\n try {\r\n const data = await gc2.getRefreshToken(refreshToken)\r\n setTokens({accessToken: data.access_token, refreshToken, idToken: data?.id_token})\r\n console.log('Access token refreshed')\r\n } catch (e) {\r\n throw new Error('Could not get refresh token.')\r\n }\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport const setTokens = (tokens: Tokens): void => {\r\n getStorage().setItem('gc2_tokens', JSON.stringify({\r\n 'accessToken': tokens.accessToken,\r\n 'refreshToken': tokens.refreshToken,\r\n 'idToken': tokens?.idToken || ''\r\n }\r\n )\r\n )\r\n}\r\n\r\nexport const getTokens = (): Tokens => {\r\n const str: string | null = getStorage().getItem('gc2_tokens')\r\n const tokens: any = str ? JSON.parse(str) : {}\r\n return {\r\n accessToken: tokens?.accessToken || '',\r\n refreshToken: tokens?.refreshToken || '',\r\n idToken: tokens?.idToken || '',\r\n }\r\n}\r\n\r\nexport const setOptions = (options: CodeFlowOptions): void => {\r\n getStorage().setItem('gc2_options', JSON.stringify({\r\n 'clientId': options.clientId,\r\n 'host': options.host,\r\n 'redirectUri': options.redirectUri\r\n }\r\n )\r\n )\r\n}\r\n\r\nexport const getOptions = (): CodeFlowOptions => {\r\n const str: string | null = getStorage().getItem('gc2_options')\r\n const options: any = str ? JSON.parse(str) : {}\r\n return {\r\n clientId: options?.clientId || '',\r\n host: options?.host || '',\r\n redirectUri: options?.redirectUri || '',\r\n }\r\n}\r\n\r\nexport const base64UrlEncodeString = (str: string): string => {\r\n return btoa(new TextEncoder().encode(str).reduce((acc, byte) => acc + String.fromCharCode(byte), ''))\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n\r\nexport const clearTokens = (): void => {\r\n getStorage().removeItem('gc2_tokens')\r\n}\r\n\r\nexport const clearOptions = (): void => {\r\n getStorage().removeItem('gc2_options')\r\n}\r\n\r\nexport const getNonce = (): string|null => {\r\n return <string>getStorage().getItem('gc2_nonce')\r\n}\r\nexport const clearNonce = (): void => {\r\n getStorage().removeItem('gc2_nonce')\r\n}\r\n\r\n","import {CodeFlowOptions, GetDeviceCodeResponse, getNonce, GetTokenResponse, PasswordFlowOptions} from '../util/utils';\r\n\r\nexport class Gc2Service {\r\n private readonly options: CodeFlowOptions | PasswordFlowOptions;\r\n private readonly host: string;\r\n\r\n constructor(options: CodeFlowOptions | PasswordFlowOptions) {\r\n this.options = options;\r\n this.host = options.host;\r\n }\r\n\r\n // Type guards to check if options is CodeFlowOptions or PasswordFlowOptions\r\n private isCodeFlowOptions(options: CodeFlowOptions | PasswordFlowOptions): options is CodeFlowOptions {\r\n return 'redirectUri' in options;\r\n }\r\n private isPasswordFlowOptions(options: CodeFlowOptions | PasswordFlowOptions): options is PasswordFlowOptions {\r\n return 'username' in options;\r\n }\r\n\r\n private buildUrl(path: string): string {\r\n if (path.startsWith('http://') || path.startsWith('https://')) {\r\n return path;\r\n }\r\n return `${this.host}${path}`;\r\n }\r\n\r\n private async request(\r\n url: string,\r\n method: 'GET' | 'POST',\r\n body?: any,\r\n contentType: 'application/json' | 'application/x-www-form-urlencoded' = 'application/json'\r\n ): Promise<any> {\r\n const headers: Record<string, string> = {'Content-Type': contentType};\r\n let payload: string;\r\n\r\n if (contentType === 'application/json') {\r\n payload = JSON.stringify(body);\r\n } else {\r\n payload = new URLSearchParams(body).toString();\r\n }\r\n\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: payload,\r\n });\r\n\r\n if (!response.ok) {\r\n const errText = await response.text();\r\n throw new Error(`HTTP error ${response.status}: ${errText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getDeviceCode(): Promise<GetDeviceCodeResponse> {\r\n const path = this.options.deviceUri ?? `${this.host}/api/v4/oauth/device`;\r\n return this.request(this.buildUrl(path), 'POST', {\r\n client_id: this.options.clientId,\r\n });\r\n }\r\n\r\n async pollToken(deviceCode: string, interval: number): Promise<GetTokenResponse> {\r\n const path = this.options.tokenUri ?? `${this.host}/api/v4/oauth`;\r\n const getToken = async (): Promise<GetTokenResponse | null | string> => {\r\n try {\r\n return await this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n device_code: deviceCode,\r\n grant_type: 'device_code',\r\n }\r\n );\r\n } catch (e: any) {\r\n const err = JSON.parse(e.message.split(': ')[1]);\r\n if (err.error === 'authorization_pending') {\r\n return null;\r\n }\r\n return err.error_description;\r\n }\r\n };\r\n\r\n let response = await getToken();\r\n while (response === null) {\r\n await new Promise(resolve => setTimeout(resolve, interval * 1100));\r\n response = await getToken();\r\n }\r\n\r\n if (typeof response === 'string') {\r\n throw new Error(response);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n getAuthorizationCodeURL(codeChallenge: string, state: string): string {\r\n let redirectUri: string\r\n if (this.isCodeFlowOptions(this.options)) {\r\n redirectUri = this.options.redirectUri\r\n } else {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const base = this.options.authUri ?? `${this.host}/auth/`\r\n const params = new URLSearchParams()\r\n // Get nonce from local storage if it exists\r\n const nonce = getNonce()\r\n // Add parameters conditionally\r\n params.set('response_type', 'code');\r\n params.set('client_id', this.options.clientId);\r\n params.set('redirect_uri', redirectUri);\r\n params.set('state', state);\r\n params.set('code_challenge', codeChallenge);\r\n params.set('code_challenge_method', 'S256');\r\n if (nonce) {\r\n params.set('nonce', nonce);\r\n }\r\n // Only add scope if it's defined\r\n if (this.options.scope) {\r\n params.set('scope', this.options.scope);\r\n }\r\n return `${base}?${params.toString()}`;\r\n }\r\n\r\n async getAuthorizationCodeToken(\r\n code: string | string[],\r\n codeVerifier: string | null\r\n ): Promise<GetTokenResponse> {\r\n let redirectUri: string\r\n if (this.isCodeFlowOptions(this.options)) {\r\n redirectUri = this.options.redirectUri\r\n } else {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const path = this.options.tokenUri ?? `${this.host}/api/v4/oauth`;\r\n return this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n redirect_uri: redirectUri,\r\n grant_type: 'authorization_code',\r\n code,\r\n code_verifier: codeVerifier,\r\n },\r\n 'application/x-www-form-urlencoded'\r\n );\r\n }\r\n\r\n async getPasswordToken(): Promise<GetTokenResponse> {\r\n let username, password, database\r\n if (this.isPasswordFlowOptions(this.options)) {\r\n username = this.options.username\r\n password = this.options.password\r\n database = this.options.database\r\n } else {\r\n throw new Error('PasswordFlow options required for this operation')\r\n }\r\n const path = `${this.host}/api/v4/oauth`;\r\n return this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n grant_type: 'password',\r\n username,\r\n password,\r\n database,\r\n }\r\n );\r\n }\r\n\r\n async getRefreshToken(token: string): Promise<GetTokenResponse> {\r\n const path = this.options.tokenUri ?? `${this.host}/api/v4/oauth`;\r\n return this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n grant_type: 'refresh_token',\r\n refresh_token: token,\r\n }\r\n );\r\n }\r\n\r\n getSignOutURL(): string {\r\n let redirectUri: string\r\n if (this.isCodeFlowOptions(this.options)) {\r\n redirectUri = this.options.redirectUri\r\n } else {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const params = new URLSearchParams({\r\n redirect_uri: redirectUri,\r\n });\r\n return this.options.logoutUri ?? `${this.host}/signout?${params.toString()}`;\r\n }\r\n}\r\n","import {Gc2Service} from './services/gc2.services'\r\nimport {generatePkceChallenge, isLogin, setTokens, setOptions, clearNonce} from './util/utils'\r\nimport {CodeFlowOptions, clearTokens, clearOptions} from \"./util/utils\";\r\nimport {getStorage} from './util/storage'\r\n\r\nexport default class CodeFlow {\r\n options: CodeFlowOptions\r\n service: Gc2Service\r\n\r\n constructor(options: CodeFlowOptions) {\r\n this.options = options\r\n this.service = new Gc2Service(options)\r\n }\r\n\r\n public async redirectHandle(): Promise<boolean> {\r\n const url: string = window.location.search\r\n const queryParams = new URLSearchParams(url)\r\n\r\n const error = queryParams.get('error')\r\n if (error) {\r\n throw new Error(`Failed to redirect: ${url}`)\r\n }\r\n\r\n const code = queryParams.get('code')\r\n if (code) {\r\n const state = queryParams.get('state')\r\n if (state !== getStorage().getItem('state')) {\r\n throw new Error('Possible CSRF attack. Aborting login!')\r\n }\r\n try {\r\n const {\r\n access_token,\r\n refresh_token,\r\n id_token,\r\n } = await this.service.getAuthorizationCodeToken(code, getStorage().getItem('codeVerifier'))\r\n setTokens({accessToken: access_token, refreshToken: refresh_token, idToken: id_token})\r\n setOptions({\r\n clientId: this.options.clientId,\r\n host: this.options.host,\r\n redirectUri: this.options.redirectUri\r\n })\r\n getStorage().removeItem('state')\r\n getStorage().removeItem('codeVerifier')\r\n\r\n // Remove state and code from the redirect url\r\n const params = new URLSearchParams(window.location.search);\r\n params.delete('code')\r\n params.delete('state')\r\n const loc = window.location\r\n const newUrl = loc.origin + loc.pathname + (params.size > 0 ? '?' + params.toString() : '')\r\n history.pushState(null, '', newUrl);\r\n\r\n return Promise.resolve(true)\r\n\r\n } catch (e: any) {\r\n throw new Error(e.message)\r\n }\r\n }\r\n return await isLogin(this.service);\r\n }\r\n\r\n public async signIn(): Promise<void> {\r\n const {state, codeVerifier, codeChallenge} = await generatePkceChallenge()\r\n getStorage().setItem(\"state\", state)\r\n getStorage().setItem(\"codeVerifier\", codeVerifier);\r\n // @ts-ignore\r\n window.location = this.service.getAuthorizationCodeURL(\r\n codeChallenge,\r\n state,\r\n );\r\n }\r\n\r\n public signOut(): void {\r\n this.clear()\r\n // @ts-ignore\r\n window.location = this.service.getSignOutURL();\r\n }\r\n\r\n public clear(): void {\r\n clearTokens()\r\n clearOptions()\r\n clearNonce()\r\n }\r\n}\r\n","import {Gc2Service,} from './services/gc2.services'\r\nimport {isLogin, setTokens, setOptions, PasswordFlowOptions, clearTokens, clearOptions, clearNonce} from './util/utils'\r\n\r\nexport default class PasswordFlow {\r\n options: PasswordFlowOptions\r\n service: Gc2Service\r\n\r\n constructor(options: PasswordFlowOptions) {\r\n this.options = options\r\n this.service = new Gc2Service(options)\r\n }\r\n\r\n public async signIn(): Promise<void> {\r\n const {access_token, refresh_token} = await this.service.getPasswordToken()\r\n setTokens({accessToken: access_token, refreshToken: refresh_token})\r\n setOptions({\r\n clientId: this.options.clientId,\r\n host: this.options.host,\r\n redirectUri: ''\r\n })\r\n }\r\n\r\n public signOut(): void {\r\n this.clear()\r\n }\r\n\r\n public clear(): void {\r\n clearTokens()\r\n clearOptions()\r\n clearNonce()\r\n }\r\n}\r\n","/**\r\n * @author Martin Høgh <mh@mapcentia.com>\r\n * @copyright 2013-2024 MapCentia ApS\r\n * @license http://www.gnu.org/licenses/#AGPL GNU AFFERO GENERAL PUBLIC LICENSE 3\r\n *\r\n */\r\n\r\nimport {getOptions, getTokens, isLogin} from \"./utils\";\r\nimport {Gc2Service} from \"../services/gc2.services\";\r\n\r\nconst getHeaders = async (contentType: string|null = 'application/json'): Promise<any>=> {\r\n type headers = {\r\n Accept: string,\r\n Cookie: string,\r\n Authorization: string|null,\r\n 'Content-Type'?: string\r\n }\r\n\r\n const options = getOptions()\r\n const service = new Gc2Service(options)\r\n\r\n // We check is token needs refreshing\r\n if (!await isLogin(service)) {\r\n return Promise.reject('Is not logged in')\r\n }\r\n\r\n const {accessToken} = getTokens()\r\n\r\n const headers: headers = {\r\n Accept: 'application/json',\r\n Cookie: 'XDEBUG_SESSION=XDEBUG_ECLIPSE',\r\n Authorization: accessToken ? 'Bearer ' + accessToken : null,\r\n }\r\n if (contentType) {\r\n headers['Content-Type'] = contentType\r\n }\r\n return headers\r\n}\r\nexport default getHeaders\r\n\r\n","/**\r\n * @author Martin Høgh <mh@mapcentia.com>\r\n * @copyright 2013-2024 MapCentia ApS\r\n * @license http://www.gnu.org/licenses/#AGPL GNU AFFERO GENERAL PUBLIC LICENSE 3\r\n *\r\n */\r\n\r\nimport getHeaders from './request-headers'\r\nimport Method from '../common/http-verbs'\r\nimport {getOptions} from './utils'\r\n\r\nexport const make = async (version: string, resource: string, method: Method, payload?: any, contentType: string | null = 'application/json'): Promise<any> => {\r\n const options = getOptions()\r\n const headers = await getHeaders(contentType)\r\n\r\n let request: RequestInit = {\r\n method: method,\r\n headers: headers,\r\n redirect: 'manual'\r\n }\r\n if (payload) {\r\n request.body = contentType === 'application/json' ? JSON.stringify(payload) : payload\r\n }\r\n return await fetch(options.host + `/api/v${version}/${resource}`, request)\r\n}\r\nexport default make\r\n","const get = async (response: Response, expectedCode: number): Promise<any> => {\r\n let res: any = null\r\n let bodyText = ''\r\n\r\n // Read the body only once as text. This avoids \"body used already\" with node-fetch.\r\n try {\r\n // Even for 204/303, text() is safe and will return '' for empty bodies\r\n bodyText = await response.text()\r\n } catch (e) {\r\n // Ignore body read errors; we'll proceed with null/empty body\r\n }\r\n\r\n // Try to parse JSON if there is a body\r\n if (bodyText) {\r\n try {\r\n res = JSON.parse(bodyText)\r\n } catch (e) {\r\n // Not JSON; keep res as null and use bodyText for error messages\r\n }\r\n }\r\n\r\n if (response.status !== expectedCode) {\r\n const msg = (res && (res.message || res.error)) || bodyText || `Unexpected status ${response.status}`\r\n throw new Error(msg)\r\n }\r\n\r\n // For 204/303, res will be null (no body), which is fine for callers expecting no content\r\n return res\r\n}\r\n\r\nexport default get\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\nimport {SqlRequest, SQLResponse} from \"./types/pgTypes\";\r\n\r\nexport default class Sql {\r\n async exec(request: SqlRequest): Promise<SQLResponse> {\r\n const response = await make('4', `sql`, 'POST', request)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\nimport {RpcRequest, RpcResponse} from \"./types/pgTypes\";\r\n\r\nexport default class Rpc {\r\n async call(request: RpcRequest): Promise<RpcResponse> {\r\n const response = await make('4', `call`, 'POST', request)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Meta {\r\n async query(rel: string): Promise<any> {\r\n const response = await make('3', `meta/${rel}`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import {getTokens} from \"./util/utils\";\r\n\r\nexport default class Status {\r\n isAuth() {\r\n const tokens = getTokens()\r\n return !(!tokens.accessToken && !tokens.refreshToken);\r\n }\r\n\r\n getTokens() {\r\n return getTokens()\r\n }\r\n}\r\n","import {claims, getTokens} from \"./util/utils\";\r\n\r\nexport default class Claims {\r\n get() {\r\n const tokens = getTokens().accessToken\r\n return claims(tokens);\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Users {\r\n async get(user: string): Promise<any> {\r\n const response = await make('4', `users/${user}`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import {WsOptions, getTokens} from \"./util/utils\";\r\n\r\nexport default class Ws {\r\n private readonly options: WsOptions;\r\n\r\n constructor(options: WsOptions) {\r\n this.options = options;\r\n }\r\n\r\n connect(): void {\r\n const me = this;\r\n const {accessToken} = getTokens()\r\n\r\n const connect = () => {\r\n const ws = new WebSocket(\r\n this.options.host + `/?token=` + accessToken,\r\n );\r\n ws.onopen = function() {\r\n console.log('WebSocket connected!');\r\n };\r\n\r\n ws.onmessage = function(event) {\r\n // Handle incoming messages\r\n me.options?.callBack(event.data)\r\n };\r\n\r\n ws.onclose = function(event) {\r\n if (accessToken !== '') {\r\n console.log('WebSocket closed, reconnecting in 3 seconds...', event.reason);\r\n setTimeout(connect, 3000); // Try to reconnect\r\n }\r\n };\r\n\r\n ws.onerror = function(err) {\r\n console.error('WebSocket error observed:', err);\r\n // Close the socket on error to ensure clean reconnection\r\n ws.close();\r\n };\r\n };\r\n\r\n // Start the connection\r\n if (accessToken !== '') {\r\n connect();\r\n }\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Stats {\r\n async get(): Promise<any> {\r\n const response = await make('4', `stats`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Tables {\r\n async get(schema: string, table: string): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n\r\n async create(schema: string, table: string, payload: any): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'POST', payload)\r\n return await get(response, 200)\r\n }\r\n\r\n async patch(schema: string, table: string, payload: any): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'PATCH', payload)\r\n return await get(response, 200)\r\n }\r\n\r\n async delete(schema: string, table: string): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'DELETE', null)\r\n return await get(response, 204)\r\n }\r\n}\r\n","import Rpc from \"./Rpc\"\r\nimport {RpcRequest} from \"./types/pgTypes\"\r\n\r\ntype MethodsOf<T> = {\r\n [K in keyof T]: T[K] extends (...args: infer A) => infer R ? (...args: A) => R : never;\r\n};\r\n\r\n// Implementation signature (wide) — overloads above control the public typing\r\nasync function dispatch<K extends keyof any & string>(name: K, args: object|Array<object>): Promise<any> {\r\n //console.log(\"Dispatch:\", name, args);\r\n // route to real implementations:\r\n const rpc = new Rpc()\r\n const request: RpcRequest = {\r\n jsonrpc: \"2.0\",\r\n method: name,\r\n id: 1,\r\n params: args as Record<string, unknown>,\r\n }\r\n const res = await rpc.call(request)\r\n return res.result.data\r\n}\r\n\r\nexport default function createApi<T>(): MethodsOf<T> {\r\n return new Proxy(\r\n {},\r\n {\r\n get(_target, prop) {\r\n if (typeof prop !== \"string\") return undefined;\r\n return (...args: any[]) => (dispatch as any)(prop, ...args);\r\n },\r\n }\r\n ) as unknown as MethodsOf<T>;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"centia-io-sdk.js","names":["decoded: string","cached: StorageLike | null","g: any","g","str: string | null","tokens: any","options: any","headers: Record<string, string>","payload: string","e: any","redirectUri: string","url: string","e: any","headers: headers","request: RequestInit","getHeaders","res: any","get","make","get","make","get","make","get","make","get","make","get","make","request: RpcRequest"],"sources":["../src/util/jwt-decode.ts","../src/util/storage.ts","../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/util/request-headers.ts","../src/util/make-request.ts","../src/util/get-response.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts","../src/SignUp.ts"],"sourcesContent":["/**\r\n * The MIT License (MIT)\r\n *\r\n * Copyright (c) 2015 Auth0, Inc. <support@auth0.com> (http://auth0.com)\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n */\r\n\r\nexport interface JwtDecodeOptions {\r\n header?: boolean;\r\n}\r\n\r\nexport interface JwtHeader {\r\n typ?: string;\r\n alg?: string;\r\n kid?: string;\r\n}\r\n\r\nexport interface JwtPayload {\r\n iss?: string;\r\n sub?: string;\r\n aud?: string[] | string;\r\n exp?: number;\r\n nbf?: number;\r\n iat?: number;\r\n jti?: string;\r\n}\r\n\r\nexport class InvalidTokenError extends Error {}\r\n\r\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\r\n\r\nfunction b64DecodeUnicode(str: string) {\r\n return decodeURIComponent(\r\n atob(str).replace(/(.)/g, (m, p) => {\r\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\r\n if (code.length < 2) {\r\n code = \"0\" + code;\r\n }\r\n return \"%\" + code;\r\n }),\r\n );\r\n}\r\n\r\nfunction base64UrlDecode(str: string) {\r\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n switch (output.length % 4) {\r\n case 0:\r\n break;\r\n case 2:\r\n output += \"==\";\r\n break;\r\n case 3:\r\n output += \"=\";\r\n break;\r\n default:\r\n throw new Error(\"base64 string is not of the correct length\");\r\n }\r\n\r\n try {\r\n return b64DecodeUnicode(output);\r\n } catch (err) {\r\n return atob(output);\r\n }\r\n}\r\n\r\nexport function jwtDecode<T = JwtHeader>(\r\n token: string,\r\n options: JwtDecodeOptions & { header: true },\r\n): T;\r\nexport function jwtDecode<T = JwtPayload>(token: string, options?: JwtDecodeOptions): T;\r\nexport function jwtDecode<T = JwtHeader | JwtPayload>(\r\n token: string,\r\n options?: JwtDecodeOptions,\r\n): T {\r\n if (typeof token !== \"string\") {\r\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\r\n }\r\n\r\n options ||= {};\r\n\r\n const pos = options.header === true ? 0 : 1;\r\n const part = token.split(\".\")[pos];\r\n\r\n if (typeof part !== \"string\") {\r\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\r\n }\r\n\r\n let decoded: string;\r\n try {\r\n decoded = base64UrlDecode(part);\r\n } catch (e) {\r\n throw new InvalidTokenError(\r\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\r\n );\r\n }\r\n\r\n try {\r\n return JSON.parse(decoded) as T;\r\n } catch (e) {\r\n throw new InvalidTokenError(\r\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\r\n );\r\n }\r\n}\r\n","export interface StorageLike {\r\n getItem(key: string): string | null\r\n setItem(key: string, value: string): void\r\n removeItem(key: string): void\r\n}\r\n\r\nclass MemoryStorage implements StorageLike {\r\n private store = new Map<string, string>()\r\n\r\n getItem(key: string): string | null {\r\n return this.store.has(key) ? this.store.get(key)! : null\r\n }\r\n\r\n setItem(key: string, value: string): void {\r\n this.store.set(key, String(value))\r\n }\r\n\r\n removeItem(key: string): void {\r\n this.store.delete(key)\r\n }\r\n}\r\n\r\nlet cached: StorageLike | null = null\r\n\r\nexport function getStorage(): StorageLike {\r\n if (cached) return cached\r\n try {\r\n const g: any = typeof globalThis !== 'undefined' ? (globalThis as any) : (window as any)\r\n if (g && g.localStorage && typeof g.localStorage.getItem === 'function') {\r\n cached = g.localStorage as StorageLike\r\n return cached\r\n }\r\n } catch (e) {\r\n // ignore and fall back to memory storage\r\n }\r\n const g: any = typeof globalThis !== 'undefined' ? (globalThis as any) : {}\r\n if (!g.__gc2_memory_storage) {\r\n g.__gc2_memory_storage = new MemoryStorage()\r\n }\r\n cached = g.__gc2_memory_storage as StorageLike\r\n return cached\r\n}\r\n","import {jwtDecode} from './jwt-decode'\r\nimport {Gc2Service} from \"../services/gc2.services\"\r\nimport {getStorage} from './storage'\r\n\r\nexport type Tokens = {\r\n accessToken: string\r\n refreshToken: string\r\n idToken?: string\r\n}\r\n\r\nexport type Options = {\r\n host: string\r\n wsHost?: string\r\n tokenUri?: string\r\n authUri?: string\r\n logoutUri?: string\r\n deviceUri?: string\r\n scope?: string\r\n clientId: string\r\n}\r\n\r\nexport type CodeFlowOptions = Options & {\r\n redirectUri: string\r\n}\r\n\r\nexport type PasswordFlowOptions = Options & {\r\n username: string\r\n password: string\r\n database: string\r\n}\r\n\r\nexport type SignUpOptions = Options & {\r\n host: string\r\n clientId: string\r\n parentDb: string\r\n redirectUri: string\r\n}\r\n\r\nexport type WsOptions = {\r\n host: string\r\n callBack: Function\r\n rel?: string\r\n wsClient?: unknown\r\n}\r\n\r\nexport type GetDeviceCodeResponse = {\r\n device_code: string\r\n user_code: string\r\n verification_uri: string\r\n verification_uri_complete?: string\r\n expires_in: number\r\n interval: number\r\n}\r\n\r\nexport type GetTokenResponse = {\r\n access_token: string\r\n expires_in: number\r\n refresh_expires_in: number\r\n refresh_token: string\r\n id_token?: string\r\n token_type: string\r\n 'not-before-policy': number\r\n session_state: string\r\n scope: string\r\n}\r\n\r\n\r\nexport const generatePkceChallenge = async () => {\r\n\r\n const generateRandomString = () => {\r\n const array = new Uint32Array(28);\r\n crypto.getRandomValues(array);\r\n return Array.from(array, dec => ('0' + dec.toString(16)).substr(-2)).join('');\r\n }\r\n\r\n const sha256 = (plain: string | undefined) => {\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(plain);\r\n return crypto.subtle.digest('SHA-256', data);\r\n }\r\n\r\n const base64urlEncode = (str: ArrayBuffer) => {\r\n\r\n return btoa(String.fromCharCode.apply(null, [...new Uint8Array(str)]))\r\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n }\r\n\r\n async function pkceChallengeFromVerifier(v: string | undefined) {\r\n const hashed = await sha256(v);\r\n return base64urlEncode(hashed);\r\n }\r\n\r\n const {state, codeVerifier} = {\r\n state: generateRandomString(),\r\n codeVerifier: generateRandomString(),\r\n };\r\n const codeChallenge = await pkceChallengeFromVerifier(codeVerifier);\r\n\r\n return {\r\n state,\r\n codeVerifier,\r\n codeChallenge,\r\n }\r\n}\r\n\r\nexport const isTokenExpired = (token: string): boolean => {\r\n let isJwtExpired = false\r\n const {exp} = jwtDecode(token)\r\n const currentTime = new Date().getTime() / 1000\r\n\r\n if (exp) {\r\n if (currentTime > exp) isJwtExpired = true\r\n }\r\n return isJwtExpired\r\n}\r\n\r\nexport const claims = (token: string): any => {\r\n return jwtDecode(token)\r\n}\r\n\r\nexport const passwordIsStrongEnough = (password: string, allowNull: boolean = false) => {\r\n const message = 'Entered password is too weak'\r\n if (password === '' && allowNull) return true\r\n if (password.length < 8) return message\r\n if (!(/[A-Z]/.test(password))) return message\r\n if (!(/[a-z]/.test(password))) return message\r\n if (!(/\\d/.test(password))) return message\r\n return true\r\n}\r\n\r\nexport const isLogin = async (gc2: Gc2Service): Promise<boolean> => {\r\n const {accessToken, refreshToken} = getTokens()\r\n if (!accessToken && !refreshToken) {\r\n return false\r\n }\r\n if (!accessToken || (accessToken && isTokenExpired(accessToken))) {\r\n if (refreshToken && isTokenExpired(refreshToken)) {\r\n clearTokens()\r\n clearOptions()\r\n throw new Error('Refresh token has expired. Please login again.')\r\n }\r\n if (refreshToken) {\r\n try {\r\n const data = await gc2.getRefreshToken(refreshToken)\r\n setTokens({accessToken: data.access_token, refreshToken, idToken: data?.id_token})\r\n console.log('Access token refreshed')\r\n } catch (e) {\r\n throw new Error('Could not get refresh token.')\r\n }\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport const setTokens = (tokens: Tokens): void => {\r\n getStorage().setItem('gc2_tokens', JSON.stringify({\r\n 'accessToken': tokens.accessToken,\r\n 'refreshToken': tokens.refreshToken,\r\n 'idToken': tokens?.idToken || ''\r\n }\r\n )\r\n )\r\n}\r\n\r\nexport const getTokens = (): Tokens => {\r\n const str: string | null = getStorage().getItem('gc2_tokens')\r\n const tokens: any = str ? JSON.parse(str) : {}\r\n return {\r\n accessToken: tokens?.accessToken || '',\r\n refreshToken: tokens?.refreshToken || '',\r\n idToken: tokens?.idToken || '',\r\n }\r\n}\r\n\r\nexport const setOptions = (options: CodeFlowOptions): void => {\r\n getStorage().setItem('gc2_options', JSON.stringify({\r\n 'clientId': options.clientId,\r\n 'host': options.host,\r\n 'redirectUri': options.redirectUri\r\n }\r\n )\r\n )\r\n}\r\n\r\nexport const getOptions = (): CodeFlowOptions => {\r\n const str: string | null = getStorage().getItem('gc2_options')\r\n const options: any = str ? JSON.parse(str) : {}\r\n return {\r\n clientId: options?.clientId || '',\r\n host: options?.host || '',\r\n redirectUri: options?.redirectUri || '',\r\n }\r\n}\r\n\r\nexport const base64UrlEncodeString = (str: string): string => {\r\n return btoa(new TextEncoder().encode(str).reduce((acc, byte) => acc + String.fromCharCode(byte), ''))\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n\r\nexport const clearTokens = (): void => {\r\n getStorage().removeItem('gc2_tokens')\r\n}\r\n\r\nexport const clearOptions = (): void => {\r\n getStorage().removeItem('gc2_options')\r\n}\r\n\r\nexport const getNonce = (): string|null => {\r\n return <string>getStorage().getItem('gc2_nonce')\r\n}\r\nexport const clearNonce = (): void => {\r\n getStorage().removeItem('gc2_nonce')\r\n}\r\n\r\n","import {CodeFlowOptions, GetDeviceCodeResponse, getNonce, GetTokenResponse, PasswordFlowOptions, SignUpOptions} from '../util/utils';\r\n\r\nexport class Gc2Service {\r\n private readonly options: CodeFlowOptions | PasswordFlowOptions;\r\n private readonly host: string;\r\n\r\n constructor(options: CodeFlowOptions | PasswordFlowOptions | SignUpOptions) {\r\n this.options = options;\r\n this.host = options.host;\r\n }\r\n\r\n // Type guards to check if options is CodeFlowOptions or PasswordFlowOptions\r\n private isCodeFlowOptions(options: CodeFlowOptions | PasswordFlowOptions | SignUpOptions): options is CodeFlowOptions {\r\n return 'redirectUri' in options;\r\n }\r\n private isPasswordFlowOptions(options: CodeFlowOptions | PasswordFlowOptions| SignUpOptions): options is PasswordFlowOptions {\r\n return 'username' in options;\r\n }\r\n private isSignUpOptions(options: CodeFlowOptions | PasswordFlowOptions| SignUpOptions): options is SignUpOptions {\r\n return 'parentDb' in options;\r\n }\r\n\r\n private buildUrl(path: string): string {\r\n if (path.startsWith('http://') || path.startsWith('https://')) {\r\n return path;\r\n }\r\n return `${this.host}${path}`;\r\n }\r\n\r\n private async request(\r\n url: string,\r\n method: 'GET' | 'POST',\r\n body?: any,\r\n contentType: 'application/json' | 'application/x-www-form-urlencoded' = 'application/json'\r\n ): Promise<any> {\r\n const headers: Record<string, string> = {'Content-Type': contentType};\r\n let payload: string;\r\n\r\n if (contentType === 'application/json') {\r\n payload = JSON.stringify(body);\r\n } else {\r\n payload = new URLSearchParams(body).toString();\r\n }\r\n\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: payload,\r\n });\r\n\r\n if (!response.ok) {\r\n const errText = await response.text();\r\n throw new Error(`HTTP error ${response.status}: ${errText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n async getDeviceCode(): Promise<GetDeviceCodeResponse> {\r\n const path = this.options.deviceUri ?? `${this.host}/api/v4/oauth/device`;\r\n return this.request(this.buildUrl(path), 'POST', {\r\n client_id: this.options.clientId,\r\n });\r\n }\r\n\r\n async pollToken(deviceCode: string, interval: number): Promise<GetTokenResponse> {\r\n const path = this.options.tokenUri ?? `${this.host}/api/v4/oauth`;\r\n const getToken = async (): Promise<GetTokenResponse | null | string> => {\r\n try {\r\n return await this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n device_code: deviceCode,\r\n grant_type: 'device_code',\r\n }\r\n );\r\n } catch (e: any) {\r\n const err = JSON.parse(e.message.split(': ')[1]);\r\n if (err.error === 'authorization_pending') {\r\n return null;\r\n }\r\n return err.error_description;\r\n }\r\n };\r\n\r\n let response = await getToken();\r\n while (response === null) {\r\n await new Promise(resolve => setTimeout(resolve, interval * 1100));\r\n response = await getToken();\r\n }\r\n\r\n if (typeof response === 'string') {\r\n throw new Error(response);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n getAuthorizationCodeURL(codeChallenge: string, state: string): string {\r\n let redirectUri: string\r\n if (this.isCodeFlowOptions(this.options)) {\r\n redirectUri = this.options.redirectUri\r\n } else {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const base = this.options.authUri ?? `${this.host}/auth/`\r\n const params = new URLSearchParams()\r\n // Get nonce from local storage if it exists\r\n const nonce = getNonce()\r\n // Add parameters conditionally\r\n params.set('response_type', 'code');\r\n params.set('client_id', this.options.clientId);\r\n params.set('redirect_uri', redirectUri);\r\n params.set('state', state);\r\n params.set('code_challenge', codeChallenge);\r\n params.set('code_challenge_method', 'S256');\r\n if (nonce) {\r\n params.set('nonce', nonce);\r\n }\r\n // Only add scope if it's defined\r\n if (this.options.scope) {\r\n params.set('scope', this.options.scope);\r\n }\r\n return `${base}?${params.toString()}`;\r\n }\r\n\r\n getSignUpURL(): string {\r\n if (!this.isSignUpOptions(this.options)) {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const base = this.options.authUri ?? `${this.host}/signup/`\r\n const params = new URLSearchParams()\r\n params.set('client_id', this.options.clientId)\r\n params.set('parentdb', this.options.parentDb)\r\n params.set('redirect_uri', this.options.redirectUri)\r\n return `${base}?${params.toString()}`;\r\n }\r\n\r\n async getAuthorizationCodeToken(\r\n code: string | string[],\r\n codeVerifier: string | null\r\n ): Promise<GetTokenResponse> {\r\n let redirectUri: string\r\n if (this.isCodeFlowOptions(this.options)) {\r\n redirectUri = this.options.redirectUri\r\n } else {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const path = this.options.tokenUri ?? `${this.host}/api/v4/oauth`;\r\n return this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n redirect_uri: redirectUri,\r\n grant_type: 'authorization_code',\r\n code,\r\n code_verifier: codeVerifier,\r\n },\r\n 'application/x-www-form-urlencoded'\r\n );\r\n }\r\n\r\n async getPasswordToken(): Promise<GetTokenResponse> {\r\n let username, password, database\r\n if (this.isPasswordFlowOptions(this.options)) {\r\n username = this.options.username\r\n password = this.options.password\r\n database = this.options.database\r\n } else {\r\n throw new Error('PasswordFlow options required for this operation')\r\n }\r\n const path = `${this.host}/api/v4/oauth`;\r\n return this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n grant_type: 'password',\r\n username,\r\n password,\r\n database,\r\n }\r\n );\r\n }\r\n\r\n async getRefreshToken(token: string): Promise<GetTokenResponse> {\r\n const path = this.options.tokenUri ?? `${this.host}/api/v4/oauth`;\r\n return this.request(\r\n this.buildUrl(path),\r\n 'POST',\r\n {\r\n client_id: this.options.clientId,\r\n grant_type: 'refresh_token',\r\n refresh_token: token,\r\n }\r\n );\r\n }\r\n\r\n getSignOutURL(): string {\r\n let redirectUri: string\r\n if (this.isCodeFlowOptions(this.options)) {\r\n redirectUri = this.options.redirectUri\r\n } else {\r\n throw new Error('CodeFlow options required for this operation')\r\n }\r\n const params = new URLSearchParams({\r\n redirect_uri: redirectUri,\r\n });\r\n return this.options.logoutUri ?? `${this.host}/signout?${params.toString()}`;\r\n }\r\n}\r\n","import {Gc2Service} from './services/gc2.services'\r\nimport {generatePkceChallenge, isLogin, setTokens, setOptions, clearNonce} from './util/utils'\r\nimport {CodeFlowOptions, clearTokens, clearOptions} from \"./util/utils\";\r\nimport {getStorage} from './util/storage'\r\n\r\nexport default class CodeFlow {\r\n options: CodeFlowOptions\r\n service: Gc2Service\r\n\r\n constructor(options: CodeFlowOptions) {\r\n this.options = options\r\n this.service = new Gc2Service(options)\r\n }\r\n\r\n public async redirectHandle(): Promise<boolean> {\r\n const url: string = window.location.search\r\n const queryParams = new URLSearchParams(url)\r\n\r\n const error = queryParams.get('error')\r\n if (error) {\r\n throw new Error(`Failed to redirect: ${url}`)\r\n }\r\n\r\n const code = queryParams.get('code')\r\n if (code) {\r\n const state = queryParams.get('state')\r\n if (state !== getStorage().getItem('state')) {\r\n throw new Error('Possible CSRF attack. Aborting login!')\r\n }\r\n try {\r\n const {\r\n access_token,\r\n refresh_token,\r\n id_token,\r\n } = await this.service.getAuthorizationCodeToken(code, getStorage().getItem('codeVerifier'))\r\n setTokens({accessToken: access_token, refreshToken: refresh_token, idToken: id_token})\r\n setOptions({\r\n clientId: this.options.clientId,\r\n host: this.options.host,\r\n redirectUri: this.options.redirectUri\r\n })\r\n getStorage().removeItem('state')\r\n getStorage().removeItem('codeVerifier')\r\n\r\n // Remove state and code from the redirect url\r\n const params = new URLSearchParams(window.location.search);\r\n params.delete('code')\r\n params.delete('state')\r\n const loc = window.location\r\n const newUrl = loc.origin + loc.pathname + (params.size > 0 ? '?' + params.toString() : '')\r\n history.pushState(null, '', newUrl);\r\n\r\n return Promise.resolve(true)\r\n\r\n } catch (e: any) {\r\n throw new Error(e.message)\r\n }\r\n }\r\n return await isLogin(this.service);\r\n }\r\n\r\n public async signIn(): Promise<void> {\r\n const {state, codeVerifier, codeChallenge} = await generatePkceChallenge()\r\n getStorage().setItem(\"state\", state)\r\n getStorage().setItem(\"codeVerifier\", codeVerifier);\r\n // @ts-ignore\r\n window.location = this.service.getAuthorizationCodeURL(\r\n codeChallenge,\r\n state,\r\n );\r\n }\r\n\r\n public signOut(): void {\r\n this.clear()\r\n // @ts-ignore\r\n window.location = this.service.getSignOutURL();\r\n }\r\n\r\n public clear(): void {\r\n clearTokens()\r\n clearOptions()\r\n clearNonce()\r\n }\r\n}\r\n","import {Gc2Service,} from './services/gc2.services'\r\nimport {isLogin, setTokens, setOptions, PasswordFlowOptions, clearTokens, clearOptions, clearNonce} from './util/utils'\r\n\r\nexport default class PasswordFlow {\r\n options: PasswordFlowOptions\r\n service: Gc2Service\r\n\r\n constructor(options: PasswordFlowOptions) {\r\n this.options = options\r\n this.service = new Gc2Service(options)\r\n }\r\n\r\n public async signIn(): Promise<void> {\r\n const {access_token, refresh_token} = await this.service.getPasswordToken()\r\n setTokens({accessToken: access_token, refreshToken: refresh_token})\r\n setOptions({\r\n clientId: this.options.clientId,\r\n host: this.options.host,\r\n redirectUri: ''\r\n })\r\n }\r\n\r\n public signOut(): void {\r\n this.clear()\r\n }\r\n\r\n public clear(): void {\r\n clearTokens()\r\n clearOptions()\r\n clearNonce()\r\n }\r\n}\r\n","/**\r\n * @author Martin Høgh <mh@mapcentia.com>\r\n * @copyright 2013-2024 MapCentia ApS\r\n * @license http://www.gnu.org/licenses/#AGPL GNU AFFERO GENERAL PUBLIC LICENSE 3\r\n *\r\n */\r\n\r\nimport {getOptions, getTokens, isLogin} from \"./utils\";\r\nimport {Gc2Service} from \"../services/gc2.services\";\r\n\r\nconst getHeaders = async (contentType: string|null = 'application/json'): Promise<any>=> {\r\n type headers = {\r\n Accept: string,\r\n Cookie: string,\r\n Authorization: string|null,\r\n 'Content-Type'?: string\r\n }\r\n\r\n const options = getOptions()\r\n const service = new Gc2Service(options)\r\n\r\n // We check is token needs refreshing\r\n if (!await isLogin(service)) {\r\n return Promise.reject('Is not logged in')\r\n }\r\n\r\n const {accessToken} = getTokens()\r\n\r\n const headers: headers = {\r\n Accept: 'application/json',\r\n Cookie: 'XDEBUG_SESSION=XDEBUG_ECLIPSE',\r\n Authorization: accessToken ? 'Bearer ' + accessToken : null,\r\n }\r\n if (contentType) {\r\n headers['Content-Type'] = contentType\r\n }\r\n return headers\r\n}\r\nexport default getHeaders\r\n\r\n","/**\r\n * @author Martin Høgh <mh@mapcentia.com>\r\n * @copyright 2013-2024 MapCentia ApS\r\n * @license http://www.gnu.org/licenses/#AGPL GNU AFFERO GENERAL PUBLIC LICENSE 3\r\n *\r\n */\r\n\r\nimport getHeaders from './request-headers'\r\nimport Method from '../common/http-verbs'\r\nimport {getOptions} from './utils'\r\n\r\nexport const make = async (version: string, resource: string, method: Method, payload?: any, contentType: string | null = 'application/json'): Promise<any> => {\r\n const options = getOptions()\r\n const headers = await getHeaders(contentType)\r\n\r\n let request: RequestInit = {\r\n method: method,\r\n headers: headers,\r\n redirect: 'manual'\r\n }\r\n if (payload) {\r\n request.body = contentType === 'application/json' ? JSON.stringify(payload) : payload\r\n }\r\n return await fetch(options.host + `/api/v${version}/${resource}`, request)\r\n}\r\nexport default make\r\n","const get = async (response: Response, expectedCode: number): Promise<any> => {\r\n let res: any = null\r\n let bodyText = ''\r\n\r\n // Read the body only once as text. This avoids \"body used already\" with node-fetch.\r\n try {\r\n // Even for 204/303, text() is safe and will return '' for empty bodies\r\n bodyText = await response.text()\r\n } catch (e) {\r\n // Ignore body read errors; we'll proceed with null/empty body\r\n }\r\n\r\n // Try to parse JSON if there is a body\r\n if (bodyText) {\r\n try {\r\n res = JSON.parse(bodyText)\r\n } catch (e) {\r\n // Not JSON; keep res as null and use bodyText for error messages\r\n }\r\n }\r\n\r\n if (response.status !== expectedCode) {\r\n const msg = (res && (res.message || res.error)) || bodyText || `Unexpected status ${response.status}`\r\n throw new Error(msg)\r\n }\r\n\r\n // For 204/303, res will be null (no body), which is fine for callers expecting no content\r\n return res\r\n}\r\n\r\nexport default get\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\nimport {SqlRequest, SQLResponse} from \"./types/pgTypes\";\r\n\r\nexport default class Sql {\r\n async exec(request: SqlRequest): Promise<SQLResponse> {\r\n const response = await make('4', `sql`, 'POST', request)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\nimport {RpcRequest, RpcResponse} from \"./types/pgTypes\";\r\n\r\nexport default class Rpc {\r\n async call(request: RpcRequest): Promise<RpcResponse> {\r\n const response = await make('4', `call`, 'POST', request)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Meta {\r\n async query(rel: string): Promise<any> {\r\n const response = await make('3', `meta/${rel}`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import {getTokens} from \"./util/utils\";\r\n\r\nexport default class Status {\r\n isAuth() {\r\n const tokens = getTokens()\r\n return !(!tokens.accessToken && !tokens.refreshToken);\r\n }\r\n\r\n getTokens() {\r\n return getTokens()\r\n }\r\n}\r\n","import {claims, getTokens} from \"./util/utils\";\r\n\r\nexport default class Claims {\r\n get() {\r\n const tokens = getTokens().accessToken\r\n return claims(tokens);\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Users {\r\n async get(user: string): Promise<any> {\r\n const response = await make('4', `users/${user}`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import {WsOptions, getTokens} from \"./util/utils\";\r\n\r\nexport default class Ws {\r\n private readonly options: WsOptions;\r\n\r\n constructor(options: WsOptions) {\r\n this.options = options;\r\n this.options.wsClient = this.options?.wsClient ?? WebSocket\r\n }\r\n\r\n connect(): void {\r\n const me = this;\r\n const {accessToken} = getTokens()\r\n\r\n const connect = () => {\r\n let queryString = `?token=` + accessToken\r\n if (this.options?.rel) {\r\n queryString = queryString + `&rel=` + this.options.rel\r\n }\r\n const ws = new this.options.wsClient(\r\n this.options.host + `/` + queryString,\r\n );\r\n\r\n ws.onopen = function () {\r\n console.log('WebSocket connected!');\r\n };\r\n\r\n ws.onmessage = function (event) {\r\n // Handle incoming messages\r\n me.options.callBack(event.data)\r\n };\r\n\r\n ws.onclose = function (event) {\r\n if (accessToken !== '') {\r\n console.log('WebSocket closed, reconnecting in 3 seconds...', event.reason);\r\n setTimeout(connect, 3000); // Try to reconnect\r\n }\r\n };\r\n\r\n ws.onerror = function (err) {\r\n console.error('WebSocket error observed:', err);\r\n // Close the socket on error to ensure clean reconnection\r\n ws.close();\r\n };\r\n };\r\n\r\n // Start the connection\r\n if (accessToken !== '') {\r\n connect();\r\n }\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Stats {\r\n async get(): Promise<any> {\r\n const response = await make('4', `stats`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n}\r\n","import make from \"./util/make-request\";\r\nimport get from \"./util/get-response\";\r\n\r\nexport default class Tables {\r\n async get(schema: string, table: string): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'GET', null)\r\n return await get(response, 200)\r\n }\r\n\r\n async create(schema: string, table: string, payload: any): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'POST', payload)\r\n return await get(response, 200)\r\n }\r\n\r\n async patch(schema: string, table: string, payload: any): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'PATCH', payload)\r\n return await get(response, 200)\r\n }\r\n\r\n async delete(schema: string, table: string): Promise<any> {\r\n const response = await make('4', `schemas/${encodeURIComponent(schema)}/tables/${encodeURIComponent(table)}`, 'DELETE', null)\r\n return await get(response, 204)\r\n }\r\n}\r\n","import Rpc from \"./Rpc\"\r\nimport {RpcRequest} from \"./types/pgTypes\"\r\n\r\ntype MethodsOf<T> = {\r\n [K in keyof T]: T[K] extends (...args: infer A) => infer R ? (...args: A) => R : never;\r\n};\r\n\r\n// Implementation signature (wide) — overloads above control the public typing\r\nasync function dispatch<K extends keyof any & string>(name: K, args: object|Array<object>): Promise<any> {\r\n //console.log(\"Dispatch:\", name, args);\r\n // route to real implementations:\r\n const rpc = new Rpc()\r\n const request: RpcRequest = {\r\n jsonrpc: \"2.0\",\r\n method: name,\r\n id: 1,\r\n params: args as Record<string, unknown>,\r\n }\r\n const res = await rpc.call(request)\r\n return res.result.data\r\n}\r\n\r\nexport default function createApi<T>(): MethodsOf<T> {\r\n return new Proxy(\r\n {},\r\n {\r\n get(_target, prop) {\r\n if (typeof prop !== \"string\") return undefined;\r\n return (...args: any[]) => (dispatch as any)(prop, ...args);\r\n },\r\n }\r\n ) as unknown as MethodsOf<T>;\r\n}\r\n","import {Gc2Service} from './services/gc2.services'\r\nimport {SignUpOptions} from './util/utils'\r\n\r\nexport default class SignUp {\r\n options: SignUpOptions\r\n service: Gc2Service\r\n\r\n constructor(options: SignUpOptions) {\r\n this.options = options\r\n this.service = new Gc2Service(options)\r\n }\r\n\r\n public async signUp(): Promise<void> {\r\n // @ts-ignore\r\n window.location = this.service.getSignUpURL();\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -204,6 +204,9 @@ var Gc2Service = class {
204
204
  isPasswordFlowOptions(options) {
205
205
  return "username" in options;
206
206
  }
207
+ isSignUpOptions(options) {
208
+ return "parentDb" in options;
209
+ }
207
210
  buildUrl(path) {
208
211
  if (path.startsWith("http://") || path.startsWith("https://")) return path;
209
212
  return `${this.host}${path}`;
@@ -268,6 +271,15 @@ var Gc2Service = class {
268
271
  if (this.options.scope) params.set("scope", this.options.scope);
269
272
  return `${base}?${params.toString()}`;
270
273
  }
274
+ getSignUpURL() {
275
+ if (!this.isSignUpOptions(this.options)) throw new Error("CodeFlow options required for this operation");
276
+ const base = this.options.authUri ?? `${this.host}/signup/`;
277
+ const params = new URLSearchParams();
278
+ params.set("client_id", this.options.clientId);
279
+ params.set("parentdb", this.options.parentDb);
280
+ params.set("redirect_uri", this.options.redirectUri);
281
+ return `${base}?${params.toString()}`;
282
+ }
271
283
  async getAuthorizationCodeToken(code, codeVerifier) {
272
284
  let redirectUri;
273
285
  if (this.isCodeFlowOptions(this.options)) redirectUri = this.options.redirectUri;
@@ -507,17 +519,20 @@ var Users = class {
507
519
  var Ws = class {
508
520
  constructor(options) {
509
521
  this.options = options;
522
+ this.options.wsClient = this.options?.wsClient ?? WebSocket;
510
523
  }
511
524
  connect() {
512
525
  const me = this;
513
526
  const { accessToken } = getTokens();
514
527
  const connect = () => {
515
- const ws = new WebSocket(this.options.host + `/?token=` + accessToken);
528
+ let queryString = `?token=` + accessToken;
529
+ if (this.options?.rel) queryString = queryString + `&rel=` + this.options.rel;
530
+ const ws = new this.options.wsClient(this.options.host + `/` + queryString);
516
531
  ws.onopen = function() {
517
532
  console.log("WebSocket connected!");
518
533
  };
519
534
  ws.onmessage = function(event) {
520
- me.options?.callBack(event.data);
535
+ me.options.callBack(event.data);
521
536
  };
522
537
  ws.onclose = function(event) {
523
538
  if (accessToken !== "") {
@@ -578,12 +593,25 @@ function createApi() {
578
593
  } });
579
594
  }
580
595
 
596
+ //#endregion
597
+ //#region src/SignUp.ts
598
+ var SignUp = class {
599
+ constructor(options) {
600
+ this.options = options;
601
+ this.service = new Gc2Service(options);
602
+ }
603
+ async signUp() {
604
+ window.location = this.service.getSignUpURL();
605
+ }
606
+ };
607
+
581
608
  //#endregion
582
609
  exports.Claims = Claims;
583
610
  exports.CodeFlow = CodeFlow;
584
611
  exports.Meta = Meta;
585
612
  exports.PasswordFlow = PasswordFlow;
586
613
  exports.Rpc = Rpc;
614
+ exports.SignUp = SignUp;
587
615
  exports.Sql = Sql;
588
616
  exports.Stats = Stats;
589
617
  exports.Status = Status;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@centia-io/sdk",
3
- "version": "0.0.28",
3
+ "version": "0.0.29",
4
4
  "description": "Centia-io TypeScript SDK",
5
5
  "author": "Martin Høgh",
6
6
  "license": "MIT",
@@ -20,12 +20,10 @@
20
20
  ],
21
21
  "devDependencies": {
22
22
  "tsdown": "^0.15.7",
23
- "typescript": "^5.6.3",
24
- "vite": "^5.4.10"
23
+ "typescript": "^5.6.3"
25
24
  },
26
25
  "private": false,
27
26
  "scripts": {
28
- "dev": "vite build --watch --mode development",
29
27
  "build": "tsdown --watch"
30
28
  }
31
29
  }