@caltra/client 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -17
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -5
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/token_provider.d.ts +15 -0
- package/dist/token_provider.d.ts.map +1 -0
- package/dist/{handoff_token_provider.js → token_provider.js} +15 -19
- package/dist/token_provider.js.map +1 -0
- package/dist/types.d.ts +3 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/handoff_token_provider.d.ts +0 -18
- package/dist/handoff_token_provider.d.ts.map +0 -1
- package/dist/handoff_token_provider.js.map +0 -1
package/README.md
CHANGED
|
@@ -11,36 +11,31 @@ npm install @caltra/client
|
|
|
11
11
|
## Use
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import { CaltraClient
|
|
14
|
+
import { CaltraClient } from "@caltra/client";
|
|
15
15
|
|
|
16
|
-
const
|
|
16
|
+
const client = new CaltraClient({
|
|
17
|
+
// Optional. Production defaults to https://api.caltra.dev.
|
|
17
18
|
apiUrl: "https://api.caltra.dev",
|
|
18
|
-
|
|
19
|
-
const response = await fetch("/api/caltra/
|
|
19
|
+
authorizationCodeProvider: async () => {
|
|
20
|
+
const response = await fetch("/api/caltra/client-authorization", { method: "POST" });
|
|
20
21
|
if (!response.ok) throw new Error("Caltra authentication failed.");
|
|
21
|
-
return (await response.json() as {
|
|
22
|
+
return (await response.json() as { authorization_code: string }).authorization_code;
|
|
22
23
|
},
|
|
23
24
|
});
|
|
24
25
|
|
|
25
|
-
const client = new CaltraClient({
|
|
26
|
-
apiUrl: "https://api.caltra.dev",
|
|
27
|
-
tokenInvalidator: () => handoffs.invalidate(),
|
|
28
|
-
tokenProvider: async () => await handoffs.getToken(),
|
|
29
|
-
});
|
|
30
|
-
|
|
31
26
|
const agents = await client.listAgents();
|
|
32
27
|
const session = await client.createSession({ agentId: agents.data[0].id });
|
|
33
28
|
const events = await client.openSessionEvents(session.id);
|
|
34
29
|
```
|
|
35
30
|
|
|
36
|
-
The customer endpoint authenticates the current user,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
caches only the resulting short-lived client token in memory, and requests a new
|
|
40
|
-
server-provided refresh time. Never embed a Caltra server API key in a browser bundle.
|
|
31
|
+
The customer endpoint authenticates the current user, uses `@caltra/server` to create a client
|
|
32
|
+
authorization with the stable external user ID and exact browser origin, and returns only
|
|
33
|
+
`authorization_code`. The SDK authenticates each code once at `/caltra/v1/auth/authenticate`,
|
|
34
|
+
caches only the resulting short-lived client token in memory, and requests a new authorization at
|
|
35
|
+
the server-provided refresh time. Never embed a Caltra server API key in a browser bundle.
|
|
41
36
|
|
|
42
37
|
The organization-level Clerk connection configures the upstream identity boundary separately. Until
|
|
43
38
|
direct Clerk exchange becomes available for SDK sessions, browser clients still use this
|
|
44
|
-
provider-neutral
|
|
39
|
+
provider-neutral client-authorization contract.
|
|
45
40
|
|
|
46
41
|
The package is ESM-only. See the [Caltra SDK repository](https://github.com/caltra-dev/caltra-sdk) for development and integration-app instructions.
|
package/dist/client.d.ts
CHANGED
|
@@ -2,9 +2,9 @@ import { CaltraSessionEventConnection } from "./event_connection.js";
|
|
|
2
2
|
import type { CaltraAgent, CaltraClientOptions, CaltraMessageSubmission, CaltraPage, CaltraPageInput, CaltraSession, CaltraSessionMessage } from "./types.js";
|
|
3
3
|
/** Calls the versioned Caltra Client API without coupling applications to a React runtime. */
|
|
4
4
|
export declare class CaltraClient {
|
|
5
|
-
private readonly options;
|
|
6
5
|
private readonly apiUrl;
|
|
7
6
|
private readonly fetchImplementation;
|
|
7
|
+
private readonly tokenProvider;
|
|
8
8
|
constructor(options: CaltraClientOptions);
|
|
9
9
|
listAgents(input?: CaltraPageInput): Promise<CaltraPage<CaltraAgent>>;
|
|
10
10
|
listSessions(input?: CaltraPageInput): Promise<CaltraPage<CaltraSession>>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,eAAe,EACf,aAAa,EACb,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAmCpB,8FAA8F;AAC9F,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAe;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;gBAE9C,OAAO,EAAE,mBAAmB;IAUlC,UAAU,CAAC,KAAK,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAIzE,YAAY,CAAC,KAAK,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAI7E,aAAa,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAQjE,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,eAAoB,GAC1B,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAQtC,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,4BAA4B,CAAC;IAelC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAYzF,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;YAIxB,OAAO;YAWP,OAAO;YAgBP,OAAO;IAMrB,OAAO,CAAC,GAAG;CAGZ"}
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { CaltraApiError } from "./error.js";
|
|
3
3
|
import { CaltraSessionEventConnection } from "./event_connection.js";
|
|
4
|
+
import { CaltraClientTokenProvider } from "./token_provider.js";
|
|
4
5
|
const PageSchema = (item) => z.object({
|
|
5
6
|
data: z.array(item),
|
|
6
7
|
next_cursor: z.string().nullable(),
|
|
@@ -31,13 +32,13 @@ const SubmissionSchema = z.object({
|
|
|
31
32
|
}).strict();
|
|
32
33
|
/** Calls the versioned Caltra Client API without coupling applications to a React runtime. */
|
|
33
34
|
export class CaltraClient {
|
|
34
|
-
options;
|
|
35
35
|
apiUrl;
|
|
36
36
|
fetchImplementation;
|
|
37
|
+
tokenProvider;
|
|
37
38
|
constructor(options) {
|
|
38
|
-
this.
|
|
39
|
-
this.apiUrl = options.apiUrl.replace(/\/+$/, "");
|
|
39
|
+
this.apiUrl = (options.apiUrl ?? "https://api.caltra.dev").replace(/\/+$/, "");
|
|
40
40
|
this.fetchImplementation = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
41
|
+
this.tokenProvider = new CaltraClientTokenProvider(this.apiUrl, this.fetchImplementation, options.authorizationCodeProvider);
|
|
41
42
|
}
|
|
42
43
|
async listAgents(input = {}) {
|
|
43
44
|
return await this.getPage("/agents", input, PageSchema(AgentSchema));
|
|
@@ -76,7 +77,7 @@ export class CaltraClient {
|
|
|
76
77
|
});
|
|
77
78
|
}
|
|
78
79
|
async invalidateToken() {
|
|
79
|
-
|
|
80
|
+
this.tokenProvider.invalidate();
|
|
80
81
|
}
|
|
81
82
|
async getPage(path, input, schema) {
|
|
82
83
|
const url = this.url(path);
|
|
@@ -97,7 +98,7 @@ export class CaltraClient {
|
|
|
97
98
|
}
|
|
98
99
|
async headers(input) {
|
|
99
100
|
const headers = new Headers(input);
|
|
100
|
-
headers.set("authorization", `Bearer ${await this.
|
|
101
|
+
headers.set("authorization", `Bearer ${await this.tokenProvider.getToken()}`);
|
|
101
102
|
return headers;
|
|
102
103
|
}
|
|
103
104
|
url(path) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { CaltraClient } from "./client.js";
|
|
2
2
|
export { CaltraApiError } from "./error.js";
|
|
3
3
|
export { CaltraSessionEventConnection } from "./event_connection.js";
|
|
4
|
-
export {
|
|
5
|
-
export type { CaltraAgent, CaltraApiProblem, CaltraClientOptions, CaltraHandoffProvider, CaltraHandoffTokenProviderOptions, CaltraMessageCompletedEvent, CaltraMessageDeltaEvent, CaltraMessageStartedEvent, CaltraMessageSubmission, CaltraPage, CaltraPageInput, CaltraSession, CaltraSessionEvent, CaltraSessionMessage, CaltraTokenProvider, CaltraTokenConfiguration, } from "./types.js";
|
|
4
|
+
export type { CaltraAgent, CaltraApiProblem, CaltraAuthorizationCodeProvider, CaltraClientOptions, CaltraMessageCompletedEvent, CaltraMessageDeltaEvent, CaltraMessageStartedEvent, CaltraMessageSubmission, CaltraPage, CaltraPageInput, CaltraSession, CaltraSessionEvent, CaltraSessionMessage, CaltraTokenConfiguration, } from "./types.js";
|
|
6
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,+BAA+B,EAC/B,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,UAAU,EACV,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { CaltraClient } from "./client.js";
|
|
2
2
|
export { CaltraApiError } from "./error.js";
|
|
3
3
|
export { CaltraSessionEventConnection } from "./event_connection.js";
|
|
4
|
-
export { CaltraHandoffTokenProvider } from "./handoff_token_provider.js";
|
|
5
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CaltraClientOptions } from "./types.js";
|
|
2
|
+
/** Exchanges one-time authorization codes and retains only the resulting client token in memory. */
|
|
3
|
+
export declare class CaltraClientTokenProvider {
|
|
4
|
+
private readonly apiUrl;
|
|
5
|
+
private readonly fetchImplementation;
|
|
6
|
+
private readonly authorizationCodeProvider;
|
|
7
|
+
private configuration?;
|
|
8
|
+
private pending?;
|
|
9
|
+
constructor(apiUrl: string, fetchImplementation: typeof fetch, authorizationCodeProvider: CaltraClientOptions["authorizationCodeProvider"]);
|
|
10
|
+
getToken(): Promise<string>;
|
|
11
|
+
invalidate(): void;
|
|
12
|
+
private getConfiguration;
|
|
13
|
+
private authenticate;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=token_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_provider.d.ts","sourceRoot":"","sources":["../src/token_provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAA4B,MAAM,YAAY,CAAC;AAQhF,oGAAoG;AACpG,qBAAa,yBAAyB;IAKlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAN5C,OAAO,CAAC,aAAa,CAAC,CAA2B;IACjD,OAAO,CAAC,OAAO,CAAC,CAAoC;gBAGjC,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,OAAO,KAAK,EACjC,yBAAyB,EAAE,mBAAmB,CAAC,2BAA2B,CAAC;IAGxF,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,UAAU,IAAI,IAAI;YAIJ,gBAAgB;YAchB,YAAY;CAsB3B"}
|
|
@@ -5,20 +5,17 @@ const TokenConfigurationSchema = z.object({
|
|
|
5
5
|
expires_at: z.iso.datetime(),
|
|
6
6
|
refresh_after: z.iso.datetime(),
|
|
7
7
|
}).strict();
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
* Caltra client token in browser memory.
|
|
11
|
-
*/
|
|
12
|
-
export class CaltraHandoffTokenProvider {
|
|
13
|
-
options;
|
|
8
|
+
/** Exchanges one-time authorization codes and retains only the resulting client token in memory. */
|
|
9
|
+
export class CaltraClientTokenProvider {
|
|
14
10
|
apiUrl;
|
|
15
|
-
configuration;
|
|
16
11
|
fetchImplementation;
|
|
12
|
+
authorizationCodeProvider;
|
|
13
|
+
configuration;
|
|
17
14
|
pending;
|
|
18
|
-
constructor(
|
|
19
|
-
this.
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
15
|
+
constructor(apiUrl, fetchImplementation, authorizationCodeProvider) {
|
|
16
|
+
this.apiUrl = apiUrl;
|
|
17
|
+
this.fetchImplementation = fetchImplementation;
|
|
18
|
+
this.authorizationCodeProvider = authorizationCodeProvider;
|
|
22
19
|
}
|
|
23
20
|
async getToken() {
|
|
24
21
|
return (await this.getConfiguration()).clientToken;
|
|
@@ -27,13 +24,12 @@ export class CaltraHandoffTokenProvider {
|
|
|
27
24
|
this.configuration = undefined;
|
|
28
25
|
}
|
|
29
26
|
async getConfiguration() {
|
|
30
|
-
if (this.configuration
|
|
31
|
-
&& Date.now() < this.configuration.refreshAfter.getTime()) {
|
|
27
|
+
if (this.configuration && Date.now() < this.configuration.refreshAfter.getTime()) {
|
|
32
28
|
return this.configuration;
|
|
33
29
|
}
|
|
34
30
|
if (this.pending)
|
|
35
31
|
return await this.pending;
|
|
36
|
-
this.pending = this.
|
|
32
|
+
this.pending = this.authenticate();
|
|
37
33
|
try {
|
|
38
34
|
this.configuration = await this.pending;
|
|
39
35
|
return this.configuration;
|
|
@@ -42,10 +38,10 @@ export class CaltraHandoffTokenProvider {
|
|
|
42
38
|
this.pending = undefined;
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
|
-
async
|
|
46
|
-
const
|
|
47
|
-
const response = await this.fetchImplementation(`${this.apiUrl}/
|
|
48
|
-
body: JSON.stringify({
|
|
41
|
+
async authenticate() {
|
|
42
|
+
const authorizationCode = await this.authorizationCodeProvider();
|
|
43
|
+
const response = await this.fetchImplementation(`${this.apiUrl}/caltra/v1/auth/authenticate`, {
|
|
44
|
+
body: JSON.stringify({ authorization_code: authorizationCode }),
|
|
49
45
|
headers: { "content-type": "application/json" },
|
|
50
46
|
method: "POST",
|
|
51
47
|
});
|
|
@@ -63,4 +59,4 @@ export class CaltraHandoffTokenProvider {
|
|
|
63
59
|
return configuration;
|
|
64
60
|
}
|
|
65
61
|
}
|
|
66
|
-
//# sourceMappingURL=
|
|
62
|
+
//# sourceMappingURL=token_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_provider.js","sourceRoot":"","sources":["../src/token_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;IAC5B,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,oGAAoG;AACpG,MAAM,OAAO,yBAAyB;IAKjB;IACA;IACA;IANX,aAAa,CAA4B;IACzC,OAAO,CAAqC;IAEpD,YACmB,MAAc,EACd,mBAAiC,EACjC,yBAA2E;QAF3E,WAAM,GAAN,MAAM,CAAQ;QACd,wBAAmB,GAAnB,mBAAmB,CAAc;QACjC,8BAAyB,GAAzB,yBAAyB,CAAkD;IAC3F,CAAC;IAEJ,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,WAAW,CAAC;IACrD,CAAC;IAED,UAAU;QACR,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACjF,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC7C,GAAG,IAAI,CAAC,MAAM,8BAA8B,EAC5C;YACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;YAC/D,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,MAAM,EAAE,MAAM;SACf,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,MAAM,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG;YACpB,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YACrC,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;SAC5C,CAAC;QACF,IAAI,aAAa,CAAC,YAAY,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
export type
|
|
2
|
-
export type CaltraHandoffProvider = () => Promise<string>;
|
|
3
|
-
export interface CaltraHandoffTokenProviderOptions {
|
|
4
|
-
apiUrl: string;
|
|
5
|
-
fetch?: typeof fetch;
|
|
6
|
-
handoffProvider: CaltraHandoffProvider;
|
|
7
|
-
}
|
|
1
|
+
export type CaltraAuthorizationCodeProvider = () => Promise<string>;
|
|
8
2
|
export interface CaltraTokenConfiguration {
|
|
9
3
|
clientToken: string;
|
|
10
4
|
expiresAt: Date;
|
|
11
5
|
refreshAfter: Date;
|
|
12
6
|
}
|
|
13
7
|
export interface CaltraClientOptions {
|
|
14
|
-
apiUrl
|
|
8
|
+
apiUrl?: string;
|
|
9
|
+
authorizationCodeProvider: CaltraAuthorizationCodeProvider;
|
|
15
10
|
fetch?: typeof fetch;
|
|
16
|
-
tokenInvalidator?: () => Promise<void> | void;
|
|
17
|
-
tokenProvider: CaltraTokenProvider;
|
|
18
11
|
}
|
|
19
12
|
export interface CaltraPageInput {
|
|
20
13
|
cursor?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,+BAA+B,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB,EAAE,+BAA+B,CAAC;IAC3D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,2BAA2B,CAAC;AAEhC,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd"}
|
package/package.json
CHANGED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { CaltraHandoffTokenProviderOptions } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Exchanges customer-authenticated, single-use handoffs and retains only the resulting short-lived
|
|
4
|
-
* Caltra client token in browser memory.
|
|
5
|
-
*/
|
|
6
|
-
export declare class CaltraHandoffTokenProvider {
|
|
7
|
-
private readonly options;
|
|
8
|
-
private readonly apiUrl;
|
|
9
|
-
private configuration?;
|
|
10
|
-
private readonly fetchImplementation;
|
|
11
|
-
private pending?;
|
|
12
|
-
constructor(options: CaltraHandoffTokenProviderOptions);
|
|
13
|
-
getToken(): Promise<string>;
|
|
14
|
-
invalidate(): void;
|
|
15
|
-
private getConfiguration;
|
|
16
|
-
private exchange;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=handoff_token_provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handoff_token_provider.d.ts","sourceRoot":"","sources":["../src/handoff_token_provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iCAAiC,EAElC,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,qBAAa,0BAA0B;IAMzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,aAAa,CAAC,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAe;IACnD,OAAO,CAAC,OAAO,CAAC,CAAoC;gBAEvB,OAAO,EAAE,iCAAiC;IAKjE,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,UAAU,IAAI,IAAI;YAIJ,gBAAgB;YAiBhB,QAAQ;CAsBvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handoff_token_provider.js","sourceRoot":"","sources":["../src/handoff_token_provider.ts"],"names":[],"mappings":"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"}
|