@datalayer/personal-agent-protocol 0.0.0-stage → 0.2.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 +21 -2
- package/lib/auth.d.ts +44 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +168 -0
- package/lib/auth.js.map +1 -0
- package/lib/crypto.d.ts +57 -0
- package/lib/crypto.d.ts.map +1 -0
- package/lib/crypto.js +188 -0
- package/lib/crypto.js.map +1 -0
- package/lib/discovery.d.ts +11 -0
- package/lib/discovery.d.ts.map +1 -0
- package/lib/discovery.js +100 -0
- package/lib/discovery.js.map +1 -0
- package/lib/errors.d.ts +41 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +47 -0
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +3778 -0
- package/lib/index.js.map +7 -0
- package/lib/json.d.ts +3 -0
- package/lib/json.d.ts.map +1 -0
- package/lib/json.js +157 -0
- package/lib/json.js.map +1 -0
- package/lib/models.d.ts +136 -0
- package/lib/models.d.ts.map +1 -0
- package/lib/models.js +418 -0
- package/lib/models.js.map +1 -0
- package/lib/reactor.d.ts +84 -0
- package/lib/reactor.d.ts.map +1 -0
- package/lib/reactor.js +95 -0
- package/lib/reactor.js.map +1 -0
- package/lib/sessions.d.ts +78 -0
- package/lib/sessions.d.ts.map +1 -0
- package/lib/sessions.js +311 -0
- package/lib/sessions.js.map +1 -0
- package/package.json +29 -4
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { ReactorPlatformView } from "@datalayer/reactor";
|
|
2
|
+
export declare const JWT_BEARER_GRANT = "urn:ietf:params:oauth:grant-type:jwt-bearer";
|
|
3
|
+
export declare const JWT_CLIENT_ASSERTION = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer";
|
|
4
|
+
export declare class SecretValue {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(value: string);
|
|
7
|
+
reveal(): string;
|
|
8
|
+
toString(): string;
|
|
9
|
+
toJSON(): string;
|
|
10
|
+
}
|
|
11
|
+
export interface SessionAssertionClaims {
|
|
12
|
+
readonly iss: string;
|
|
13
|
+
readonly sub: string;
|
|
14
|
+
readonly aud: string;
|
|
15
|
+
readonly iat: number;
|
|
16
|
+
readonly exp: number;
|
|
17
|
+
readonly jti: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SessionToken {
|
|
20
|
+
readonly accessToken: SecretValue;
|
|
21
|
+
readonly tokenType: "DPoP" | "Bearer";
|
|
22
|
+
readonly expiresIn: number;
|
|
23
|
+
readonly scopes: readonly string[];
|
|
24
|
+
readonly sessionId: string;
|
|
25
|
+
readonly signedIn: boolean;
|
|
26
|
+
readonly accountToken?: SecretValue;
|
|
27
|
+
}
|
|
28
|
+
export type RandomBytes = (length: number) => Uint8Array;
|
|
29
|
+
export declare function generatePairwiseUserId(randomBytes?: RandomBytes): string;
|
|
30
|
+
export interface SessionAssertionOptions {
|
|
31
|
+
readonly clientId: string;
|
|
32
|
+
readonly pairwiseUserId: string;
|
|
33
|
+
readonly tokenEndpoint: string;
|
|
34
|
+
readonly now?: Date;
|
|
35
|
+
readonly lifetimeSeconds?: number;
|
|
36
|
+
readonly randomBytes?: RandomBytes;
|
|
37
|
+
}
|
|
38
|
+
export declare function buildSessionAssertionClaims(options: SessionAssertionOptions): SessionAssertionClaims;
|
|
39
|
+
export interface SessionGrantOptions {
|
|
40
|
+
readonly assertion: string;
|
|
41
|
+
readonly clientId: string;
|
|
42
|
+
readonly clientAssertion: string;
|
|
43
|
+
readonly sessionId?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class SessionGrant {
|
|
46
|
+
readonly assertion: SecretValue;
|
|
47
|
+
readonly clientId: string;
|
|
48
|
+
readonly clientAssertion: SecretValue;
|
|
49
|
+
readonly sessionId: string | undefined;
|
|
50
|
+
constructor(options: SessionGrantOptions);
|
|
51
|
+
toForm(): URLSearchParams;
|
|
52
|
+
toJSON(): Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
export declare function parseSessionToken(value: unknown): SessionToken;
|
|
55
|
+
export interface SessionRequestOptions {
|
|
56
|
+
readonly clientId: string;
|
|
57
|
+
readonly pairwiseUserId: string;
|
|
58
|
+
readonly issuer: string;
|
|
59
|
+
readonly tokenEndpoint: string;
|
|
60
|
+
readonly tenantId: string;
|
|
61
|
+
readonly signal?: AbortSignal;
|
|
62
|
+
}
|
|
63
|
+
export interface SessionRenewOptions extends SessionRequestOptions {
|
|
64
|
+
readonly sessionId: string;
|
|
65
|
+
}
|
|
66
|
+
export interface SessionClientOptions {
|
|
67
|
+
readonly reactor: ReactorPlatformView;
|
|
68
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
69
|
+
readonly maxResponseBytes?: number;
|
|
70
|
+
}
|
|
71
|
+
/** Start and renew signed-out PAP sessions over an OAuth token endpoint. */
|
|
72
|
+
export declare class SessionClient {
|
|
73
|
+
#private;
|
|
74
|
+
constructor(options: SessionClientOptions);
|
|
75
|
+
start(options: SessionRequestOptions): Promise<SessionToken>;
|
|
76
|
+
renew(options: SessionRenewOptions): Promise<SessionToken>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/lib/sessions.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { ProtocolValidationError, SessionError } from "./errors.js";
|
|
2
|
+
import { parseJsonStrict } from "./json.js";
|
|
3
|
+
import { Clocks, DpopProofProviders, RandomSources, Signers, firstContribution, } from "./reactor.js";
|
|
4
|
+
export const JWT_BEARER_GRANT = "urn:ietf:params:oauth:grant-type:jwt-bearer";
|
|
5
|
+
export const JWT_CLIENT_ASSERTION = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer";
|
|
6
|
+
export class SecretValue {
|
|
7
|
+
#value;
|
|
8
|
+
constructor(value) {
|
|
9
|
+
if (!value) {
|
|
10
|
+
throw new ProtocolValidationError("invalid_secret", "Secret value must not be empty");
|
|
11
|
+
}
|
|
12
|
+
this.#value = value;
|
|
13
|
+
}
|
|
14
|
+
reveal() {
|
|
15
|
+
return this.#value;
|
|
16
|
+
}
|
|
17
|
+
toString() {
|
|
18
|
+
return "[REDACTED]";
|
|
19
|
+
}
|
|
20
|
+
toJSON() {
|
|
21
|
+
return "[REDACTED]";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function defaultRandomBytes(length) {
|
|
25
|
+
const cryptoApi = globalThis.crypto;
|
|
26
|
+
if (!cryptoApi) {
|
|
27
|
+
throw new Error("A cryptographically secure random source is required");
|
|
28
|
+
}
|
|
29
|
+
return cryptoApi.getRandomValues(new Uint8Array(length));
|
|
30
|
+
}
|
|
31
|
+
function base64Url(bytes) {
|
|
32
|
+
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
33
|
+
let output = "";
|
|
34
|
+
for (let index = 0; index < bytes.length; index += 3) {
|
|
35
|
+
const first = bytes[index] ?? 0;
|
|
36
|
+
const second = bytes[index + 1];
|
|
37
|
+
const third = bytes[index + 2];
|
|
38
|
+
output += alphabet[first >>> 2];
|
|
39
|
+
output += alphabet[((first & 3) << 4) | ((second ?? 0) >>> 4)];
|
|
40
|
+
if (second !== undefined) {
|
|
41
|
+
output += alphabet[((second & 15) << 2) | ((third ?? 0) >>> 6)];
|
|
42
|
+
}
|
|
43
|
+
if (third !== undefined) {
|
|
44
|
+
output += alphabet[third & 63];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
function opaqueId(prefix, randomBytes) {
|
|
50
|
+
const bytes = randomBytes(16);
|
|
51
|
+
if (bytes.byteLength < 16) {
|
|
52
|
+
throw new Error("Opaque PAP identifiers require at least 128 random bits");
|
|
53
|
+
}
|
|
54
|
+
return `${prefix}_${base64Url(bytes)}`;
|
|
55
|
+
}
|
|
56
|
+
export function generatePairwiseUserId(randomBytes = defaultRandomBytes) {
|
|
57
|
+
return opaqueId("usr", randomBytes);
|
|
58
|
+
}
|
|
59
|
+
function httpsUrl(value, label) {
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = new URL(value);
|
|
63
|
+
}
|
|
64
|
+
catch (cause) {
|
|
65
|
+
throw new ProtocolValidationError("invalid_url", `${label} must be an HTTPS URL`, {
|
|
66
|
+
cause,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (parsed.protocol !== "https:" || parsed.username || parsed.password) {
|
|
70
|
+
throw new ProtocolValidationError("invalid_url", `${label} must be an HTTPS URL`);
|
|
71
|
+
}
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
export function buildSessionAssertionClaims(options) {
|
|
75
|
+
const lifetime = options.lifetimeSeconds ?? 60;
|
|
76
|
+
if (!Number.isInteger(lifetime) || lifetime <= 0) {
|
|
77
|
+
throw new ProtocolValidationError("invalid_assertion_lifetime", "Assertion lifetime must be a positive integer");
|
|
78
|
+
}
|
|
79
|
+
if (!/^[A-Za-z0-9_-]{1,256}$/.test(options.pairwiseUserId)) {
|
|
80
|
+
throw new ProtocolValidationError("invalid_user_id", "Pairwise user ID must use the URL-safe base64 alphabet");
|
|
81
|
+
}
|
|
82
|
+
const iat = Math.floor((options.now ?? new Date()).getTime() / 1000);
|
|
83
|
+
return {
|
|
84
|
+
iss: httpsUrl(options.clientId, "clientId"),
|
|
85
|
+
sub: options.pairwiseUserId,
|
|
86
|
+
aud: httpsUrl(options.tokenEndpoint, "tokenEndpoint"),
|
|
87
|
+
iat,
|
|
88
|
+
exp: iat + lifetime,
|
|
89
|
+
jti: opaqueId("jti", options.randomBytes ?? defaultRandomBytes),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export class SessionGrant {
|
|
93
|
+
assertion;
|
|
94
|
+
clientId;
|
|
95
|
+
clientAssertion;
|
|
96
|
+
sessionId;
|
|
97
|
+
constructor(options) {
|
|
98
|
+
this.assertion = new SecretValue(options.assertion);
|
|
99
|
+
this.clientId = httpsUrl(options.clientId, "clientId");
|
|
100
|
+
this.clientAssertion = new SecretValue(options.clientAssertion);
|
|
101
|
+
if (options.sessionId !== undefined && !/^[A-Za-z0-9_-]{1,256}$/.test(options.sessionId)) {
|
|
102
|
+
throw new ProtocolValidationError("invalid_session_id", "Invalid PAP session ID");
|
|
103
|
+
}
|
|
104
|
+
this.sessionId = options.sessionId;
|
|
105
|
+
}
|
|
106
|
+
toForm() {
|
|
107
|
+
const form = new URLSearchParams({
|
|
108
|
+
grant_type: JWT_BEARER_GRANT,
|
|
109
|
+
assertion: this.assertion.reveal(),
|
|
110
|
+
client_id: this.clientId,
|
|
111
|
+
client_assertion_type: JWT_CLIENT_ASSERTION,
|
|
112
|
+
client_assertion: this.clientAssertion.reveal(),
|
|
113
|
+
});
|
|
114
|
+
if (this.sessionId !== undefined) {
|
|
115
|
+
form.set("session_id", this.sessionId);
|
|
116
|
+
}
|
|
117
|
+
return form;
|
|
118
|
+
}
|
|
119
|
+
toJSON() {
|
|
120
|
+
return {
|
|
121
|
+
grant_type: JWT_BEARER_GRANT,
|
|
122
|
+
assertion: this.assertion,
|
|
123
|
+
client_id: this.clientId,
|
|
124
|
+
client_assertion_type: JWT_CLIENT_ASSERTION,
|
|
125
|
+
client_assertion: this.clientAssertion,
|
|
126
|
+
...(this.sessionId === undefined ? {} : { session_id: this.sessionId }),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function object(value, label) {
|
|
131
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
132
|
+
throw new ProtocolValidationError("invalid_type", `${label} must be an object`);
|
|
133
|
+
}
|
|
134
|
+
return value;
|
|
135
|
+
}
|
|
136
|
+
function nonEmptyString(value, label) {
|
|
137
|
+
if (typeof value !== "string" || !value) {
|
|
138
|
+
throw new ProtocolValidationError("invalid_type", `${label} must be a string`);
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
export function parseSessionToken(value) {
|
|
143
|
+
const source = object(value, "session token response");
|
|
144
|
+
const tokenType = nonEmptyString(source.token_type, "token_type");
|
|
145
|
+
if (tokenType !== "DPoP" && tokenType !== "Bearer") {
|
|
146
|
+
throw new ProtocolValidationError("invalid_token_type", "Unsupported token_type");
|
|
147
|
+
}
|
|
148
|
+
const expiresIn = source.expires_in;
|
|
149
|
+
if (!Number.isInteger(expiresIn) || expiresIn <= 0) {
|
|
150
|
+
throw new ProtocolValidationError("invalid_expiry", "expires_in must be positive");
|
|
151
|
+
}
|
|
152
|
+
const sessionId = nonEmptyString(source.session_id, "session_id");
|
|
153
|
+
if (!/^[A-Za-z0-9_-]{1,256}$/.test(sessionId)) {
|
|
154
|
+
throw new ProtocolValidationError("invalid_session_id", "Invalid PAP session ID");
|
|
155
|
+
}
|
|
156
|
+
if (typeof source.signed_in !== "boolean") {
|
|
157
|
+
throw new ProtocolValidationError("invalid_type", "signed_in must be boolean");
|
|
158
|
+
}
|
|
159
|
+
if (source.scope !== undefined && typeof source.scope !== "string") {
|
|
160
|
+
throw new ProtocolValidationError("invalid_type", "scope must be a string");
|
|
161
|
+
}
|
|
162
|
+
const scope = source.scope ?? "";
|
|
163
|
+
return {
|
|
164
|
+
accessToken: new SecretValue(nonEmptyString(source.access_token, "access_token")),
|
|
165
|
+
tokenType,
|
|
166
|
+
expiresIn: expiresIn,
|
|
167
|
+
scopes: scope.split(" ").filter(Boolean),
|
|
168
|
+
sessionId,
|
|
169
|
+
signedIn: source.signed_in,
|
|
170
|
+
...(source.refresh_token === undefined
|
|
171
|
+
? {}
|
|
172
|
+
: {
|
|
173
|
+
accountToken: new SecretValue(nonEmptyString(source.refresh_token, "refresh_token")),
|
|
174
|
+
}),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** Start and renew signed-out PAP sessions over an OAuth token endpoint. */
|
|
178
|
+
export class SessionClient {
|
|
179
|
+
#reactor;
|
|
180
|
+
#fetch;
|
|
181
|
+
#maxResponseBytes;
|
|
182
|
+
constructor(options) {
|
|
183
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
184
|
+
if (!fetcher)
|
|
185
|
+
throw new SessionError("fetch_unavailable", "A fetch implementation is required");
|
|
186
|
+
const maxResponseBytes = options.maxResponseBytes ?? 100 * 1024;
|
|
187
|
+
if (!Number.isInteger(maxResponseBytes) || maxResponseBytes <= 0) {
|
|
188
|
+
throw new RangeError("maxResponseBytes must be a positive integer");
|
|
189
|
+
}
|
|
190
|
+
this.#reactor = options.reactor;
|
|
191
|
+
this.#fetch = fetcher;
|
|
192
|
+
this.#maxResponseBytes = maxResponseBytes;
|
|
193
|
+
}
|
|
194
|
+
start(options) {
|
|
195
|
+
return this.#request(options);
|
|
196
|
+
}
|
|
197
|
+
renew(options) {
|
|
198
|
+
return this.#request(options, options.sessionId);
|
|
199
|
+
}
|
|
200
|
+
async #request(options, sessionId) {
|
|
201
|
+
const clock = firstContribution(this.#reactor, Clocks, "clock");
|
|
202
|
+
const random = firstContribution(this.#reactor, RandomSources, "random source");
|
|
203
|
+
const signer = firstContribution(this.#reactor, Signers, "signer");
|
|
204
|
+
const dpop = firstContribution(this.#reactor, DpopProofProviders, "DPoP proof provider");
|
|
205
|
+
let nonce;
|
|
206
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
207
|
+
const now = clock.now();
|
|
208
|
+
const sessionClaims = buildSessionAssertionClaims({
|
|
209
|
+
clientId: options.clientId,
|
|
210
|
+
pairwiseUserId: options.pairwiseUserId,
|
|
211
|
+
tokenEndpoint: options.tokenEndpoint,
|
|
212
|
+
now,
|
|
213
|
+
randomBytes: (length) => random.bytes(length),
|
|
214
|
+
});
|
|
215
|
+
const iat = Math.floor(now.getTime() / 1000);
|
|
216
|
+
const clientId = httpsUrl(options.clientId, "clientId");
|
|
217
|
+
const tokenEndpoint = httpsUrl(options.tokenEndpoint, "tokenEndpoint");
|
|
218
|
+
const issuer = httpsUrl(options.issuer, "issuer");
|
|
219
|
+
const clientClaims = {
|
|
220
|
+
iss: clientId,
|
|
221
|
+
sub: clientId,
|
|
222
|
+
aud: tokenEndpoint,
|
|
223
|
+
iat,
|
|
224
|
+
exp: iat + 60,
|
|
225
|
+
jti: opaqueId("jti", (length) => random.bytes(length)),
|
|
226
|
+
};
|
|
227
|
+
const assertion = await signer.sign({ ...sessionClaims }, {
|
|
228
|
+
purpose: "session_assertion",
|
|
229
|
+
});
|
|
230
|
+
const clientAssertion = await signer.sign(clientClaims, {
|
|
231
|
+
purpose: "client_assertion",
|
|
232
|
+
});
|
|
233
|
+
const proof = await dpop.create({
|
|
234
|
+
method: "POST",
|
|
235
|
+
url: tokenEndpoint,
|
|
236
|
+
tenantId: options.tenantId,
|
|
237
|
+
subject: options.pairwiseUserId,
|
|
238
|
+
issuer,
|
|
239
|
+
...(nonce === undefined ? {} : { nonce }),
|
|
240
|
+
});
|
|
241
|
+
const grant = new SessionGrant({
|
|
242
|
+
assertion: assertion.reveal(),
|
|
243
|
+
clientId,
|
|
244
|
+
clientAssertion: clientAssertion.reveal(),
|
|
245
|
+
...(sessionId === undefined ? {} : { sessionId }),
|
|
246
|
+
});
|
|
247
|
+
let response;
|
|
248
|
+
try {
|
|
249
|
+
response = await this.#fetch(tokenEndpoint, {
|
|
250
|
+
method: "POST",
|
|
251
|
+
headers: { Accept: "application/json", DPoP: proof.reveal() },
|
|
252
|
+
body: grant.toForm(),
|
|
253
|
+
credentials: "omit",
|
|
254
|
+
redirect: "error",
|
|
255
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
catch (cause) {
|
|
259
|
+
throw new SessionError("request_failed", "Session token request failed", { cause });
|
|
260
|
+
}
|
|
261
|
+
const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim();
|
|
262
|
+
if (contentType !== "application/json") {
|
|
263
|
+
throw new SessionError("invalid_content_type", "Session token endpoint must return JSON", { statusCode: response.status });
|
|
264
|
+
}
|
|
265
|
+
const body = await response.text();
|
|
266
|
+
if (new TextEncoder().encode(body).byteLength > this.#maxResponseBytes) {
|
|
267
|
+
throw new SessionError("response_too_large", "Session token response exceeds size limit", { statusCode: response.status });
|
|
268
|
+
}
|
|
269
|
+
let payload;
|
|
270
|
+
try {
|
|
271
|
+
payload = parseJsonStrict(body);
|
|
272
|
+
}
|
|
273
|
+
catch (cause) {
|
|
274
|
+
throw new SessionError("invalid_json", "Session token endpoint returned invalid JSON", {
|
|
275
|
+
statusCode: response.status,
|
|
276
|
+
cause,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
if (response.ok) {
|
|
280
|
+
let token;
|
|
281
|
+
try {
|
|
282
|
+
token = parseSessionToken(payload);
|
|
283
|
+
}
|
|
284
|
+
catch (cause) {
|
|
285
|
+
throw new SessionError("invalid_token_response", "Session token response is malformed", { statusCode: response.status, cause });
|
|
286
|
+
}
|
|
287
|
+
if (token.tokenType !== "DPoP") {
|
|
288
|
+
throw new SessionError("unexpected_token_type", "A proof-bound session request must return a DPoP token", { statusCode: response.status });
|
|
289
|
+
}
|
|
290
|
+
return token;
|
|
291
|
+
}
|
|
292
|
+
const source = typeof payload === "object" && payload !== null ? payload : {};
|
|
293
|
+
const remoteCode = "error" in source ? source.error : undefined;
|
|
294
|
+
const code = typeof remoteCode === "string" ? remoteCode : "http_error";
|
|
295
|
+
if (code === "use_dpop_nonce" && attempt === 0) {
|
|
296
|
+
nonce = response.headers.get("dpop-nonce") ?? undefined;
|
|
297
|
+
if (!nonce) {
|
|
298
|
+
throw new SessionError("missing_dpop_nonce", "Company requested a DPoP nonce but did not send one", { statusCode: response.status });
|
|
299
|
+
}
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
const retryAfter = response.headers.get("retry-after");
|
|
303
|
+
throw new SessionError(code, "Company refused the session token request", {
|
|
304
|
+
statusCode: response.status,
|
|
305
|
+
...(retryAfter === null ? {} : { details: { retryAfter } }),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
throw new SessionError("use_dpop_nonce", "Company rejected the refreshed DPoP proof");
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datalayer/personal-agent-protocol",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "TypeScript SDK for Personal Agent Protocol",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "BSD-3-Clause",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./lib/index.js",
|
|
9
|
+
"types": "./lib/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./lib/index.d.ts",
|
|
13
|
+
"import": "./lib/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": ["lib", "README.md"],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.json && esbuild src/index.ts --bundle --platform=neutral --format=esm --sourcemap --outfile=lib/index.js",
|
|
19
|
+
"build:lib": "tsc -p tsconfig.json",
|
|
20
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
21
|
+
"test": "npm run build && node --test test/*.test.mjs"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public",
|
|
25
|
+
"provenance": true
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@datalayer/reactor": "^1.0.5",
|
|
29
|
+
"jose": "^6.2.12"
|
|
30
|
+
}
|
|
31
|
+
}
|