@opengeni/sdk 2.5.0-canary.2 → 2.6.0-canary.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 +15 -0
- package/dist/accounts.d.ts +149 -0
- package/dist/accounts.js +295 -0
- package/dist/accounts.js.map +1 -0
- package/dist/artifact-client.d.ts +3 -3
- package/dist/artifacts.js +4 -3
- package/dist/browser.d.ts +6 -0
- package/dist/browser.js +30 -0
- package/dist/browser.js.map +1 -0
- package/dist/{chunk-7VERSV47.js → chunk-4VCQBOOQ.js} +75 -73
- package/dist/chunk-4VCQBOOQ.js.map +1 -0
- package/dist/chunk-C7AIXTNY.js +79 -0
- package/dist/chunk-C7AIXTNY.js.map +1 -0
- package/dist/{chunk-UP2PIWU2.js → chunk-JVRUGVPU.js} +5 -5
- package/dist/chunk-JVRUGVPU.js.map +1 -0
- package/dist/{chunk-ERPT45NP.js → chunk-Y7PC524F.js} +2 -2
- package/dist/chunk-Y7PC524F.js.map +1 -0
- package/dist/client.d.ts +13 -21
- package/dist/core.d.ts +2 -1
- package/dist/core.js +6 -5
- package/dist/document-authority-client.d.ts +29 -0
- package/dist/document-authority.d.ts +2 -0
- package/dist/document-authority.js +11 -0
- package/dist/document-authority.js.map +1 -0
- package/dist/editable-artifacts.js +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +22 -21
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +99 -1
- package/package.json +14 -2
- package/src/accounts.ts +425 -0
- package/src/artifact-client.ts +3 -3
- package/src/browser.ts +21 -0
- package/src/client.ts +123 -106
- package/src/core.ts +2 -1
- package/src/document-authority-client.ts +116 -0
- package/src/document-authority.ts +17 -0
- package/src/index.ts +19 -0
- package/src/types.ts +118 -2
- package/dist/chunk-7VERSV47.js.map +0 -1
- package/dist/chunk-ERPT45NP.js.map +0 -1
- package/dist/chunk-UP2PIWU2.js.map +0 -1
package/README.md
CHANGED
|
@@ -37,6 +37,21 @@ for await (const event of client.streamEvents(workspaceId, session.id)) {
|
|
|
37
37
|
}
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
Browser consoles that do not need operator-only surfaces can import
|
|
41
|
+
`OpenGeniBrowserClient` from `@opengeni/sdk/browser`. Document authority migration
|
|
42
|
+
and Default-collection backfill methods stay available on the backward-compatible
|
|
43
|
+
root and `@opengeni/sdk/core` clients, or through the focused
|
|
44
|
+
`@opengeni/sdk/document-authority` entry:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { OpenGeniDocumentAuthorityClient } from "@opengeni/sdk/document-authority";
|
|
48
|
+
|
|
49
|
+
const operatorClient = new OpenGeniDocumentAuthorityClient({
|
|
50
|
+
baseUrl: "https://api.example.com",
|
|
51
|
+
apiKey: process.env.OPENGENI_API_KEY!,
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
40
55
|
## Session visibility and forks
|
|
41
56
|
|
|
42
57
|
For organizations with session-tenancy activation, a canonical managed-cookie
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { type BeginManagedAuthLoginTransactionRequest as BeginManagedAuthLoginTransactionRequestType, type BootstrapManagedAuthSessionSetRequest as BootstrapManagedAuthSessionSetRequestType, type CancelManagedAuthLoginTransactionRequest as CancelManagedAuthLoginTransactionRequestType, type CompleteManagedAuthEmailPasswordTransactionRequest as CompleteManagedAuthEmailPasswordTransactionRequestType, type CompleteManagedAuthLoginTransactionResponse as CompleteManagedAuthLoginTransactionResponseType, type LogoutManagedAuthLoginSlotRequest as LogoutManagedAuthLoginSlotRequestType, type LogoutManagedAuthSessionSetRequest as LogoutManagedAuthSessionSetRequestType, type ManagedAuthDeepLinkResolution as ManagedAuthDeepLinkResolutionType, type ManagedAuthLoginTransaction as ManagedAuthLoginTransactionType, type ManagedAuthLogoutAllReceipt as ManagedAuthLogoutAllReceiptType, type ManagedAuthSessionSetProjection as ManagedAuthSessionSetProjectionType, type ResolveManagedAuthDeepLinkRequest as ResolveManagedAuthDeepLinkRequestType, type SelectManagedAuthLoginSlotRequest as SelectManagedAuthLoginSlotRequestType } from "@opengeni/contracts/managed-auth-session-sets";
|
|
2
|
+
export type BrowserAccountsFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export type BrowserAccountsClientOptions = {
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
fetch?: BrowserAccountsFetch;
|
|
6
|
+
};
|
|
7
|
+
export interface BrowserAccountsClientLike {
|
|
8
|
+
getSessionSet(): Promise<ManagedAuthSessionSetProjectionType>;
|
|
9
|
+
reconcileSessionSetAuthority(): Promise<ManagedAuthSessionSetProjectionType>;
|
|
10
|
+
bootstrapSessionSet(request: BootstrapManagedAuthSessionSetRequestType): Promise<ManagedAuthSessionSetProjectionType>;
|
|
11
|
+
beginLoginTransaction(request: BeginManagedAuthLoginTransactionRequestType): Promise<ManagedAuthLoginTransactionType>;
|
|
12
|
+
completeEmailPasswordTransaction(request: CompleteManagedAuthEmailPasswordTransactionRequestType): Promise<CompleteManagedAuthLoginTransactionResponseType>;
|
|
13
|
+
cancelLoginTransaction(request: CancelManagedAuthLoginTransactionRequestType): Promise<ManagedAuthSessionSetProjectionType>;
|
|
14
|
+
selectLoginSlot(request: SelectManagedAuthLoginSlotRequestType): Promise<ManagedAuthSessionSetProjectionType>;
|
|
15
|
+
logoutLoginSlot(request: LogoutManagedAuthLoginSlotRequestType): Promise<ManagedAuthSessionSetProjectionType>;
|
|
16
|
+
logoutSessionSet(request: LogoutManagedAuthSessionSetRequestType): Promise<ManagedAuthLogoutAllReceiptType>;
|
|
17
|
+
resolveDeepLink(request: ResolveManagedAuthDeepLinkRequestType): Promise<ManagedAuthDeepLinkResolutionType>;
|
|
18
|
+
}
|
|
19
|
+
export declare class BrowserAccountsApiError extends Error {
|
|
20
|
+
readonly status: number;
|
|
21
|
+
readonly code: string;
|
|
22
|
+
readonly name = "BrowserAccountsApiError";
|
|
23
|
+
constructor(status: number, code: string, options?: {
|
|
24
|
+
cause?: unknown;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export declare class BrowserAccountsClient implements BrowserAccountsClientLike {
|
|
28
|
+
#private;
|
|
29
|
+
constructor(options: BrowserAccountsClientOptions);
|
|
30
|
+
getSessionSet(): Promise<ManagedAuthSessionSetProjectionType>;
|
|
31
|
+
reconcileSessionSetAuthority(): Promise<ManagedAuthSessionSetProjectionType>;
|
|
32
|
+
bootstrapSessionSet(request: BootstrapManagedAuthSessionSetRequestType): Promise<{
|
|
33
|
+
mode: "broker" | "dual" | "legacy";
|
|
34
|
+
generation: string;
|
|
35
|
+
actorEpoch: string;
|
|
36
|
+
csrfToken: string;
|
|
37
|
+
selectedSlotId: string | null;
|
|
38
|
+
state: "actor_change_required" | "ready";
|
|
39
|
+
slots: {
|
|
40
|
+
id: string;
|
|
41
|
+
displayName: string;
|
|
42
|
+
verifiedClaim: {
|
|
43
|
+
kind: "email";
|
|
44
|
+
value: string;
|
|
45
|
+
};
|
|
46
|
+
state: "active" | "reauth_required";
|
|
47
|
+
}[];
|
|
48
|
+
}>;
|
|
49
|
+
beginLoginTransaction(request: BeginManagedAuthLoginTransactionRequestType): Promise<{
|
|
50
|
+
id: string;
|
|
51
|
+
kind: "add" | "reauth";
|
|
52
|
+
expiresAt: string;
|
|
53
|
+
returnIntentId: string | null;
|
|
54
|
+
}>;
|
|
55
|
+
completeEmailPasswordTransaction(request: CompleteManagedAuthEmailPasswordTransactionRequestType): Promise<{
|
|
56
|
+
projection: {
|
|
57
|
+
mode: "broker" | "dual" | "legacy";
|
|
58
|
+
generation: string;
|
|
59
|
+
actorEpoch: string;
|
|
60
|
+
csrfToken: string;
|
|
61
|
+
selectedSlotId: string | null;
|
|
62
|
+
state: "actor_change_required" | "ready";
|
|
63
|
+
slots: {
|
|
64
|
+
id: string;
|
|
65
|
+
displayName: string;
|
|
66
|
+
verifiedClaim: {
|
|
67
|
+
kind: "email";
|
|
68
|
+
value: string;
|
|
69
|
+
};
|
|
70
|
+
state: "active" | "reauth_required";
|
|
71
|
+
}[];
|
|
72
|
+
};
|
|
73
|
+
returnIntent: string | null;
|
|
74
|
+
}>;
|
|
75
|
+
cancelLoginTransaction(request: CancelManagedAuthLoginTransactionRequestType): Promise<{
|
|
76
|
+
mode: "broker" | "dual" | "legacy";
|
|
77
|
+
generation: string;
|
|
78
|
+
actorEpoch: string;
|
|
79
|
+
csrfToken: string;
|
|
80
|
+
selectedSlotId: string | null;
|
|
81
|
+
state: "actor_change_required" | "ready";
|
|
82
|
+
slots: {
|
|
83
|
+
id: string;
|
|
84
|
+
displayName: string;
|
|
85
|
+
verifiedClaim: {
|
|
86
|
+
kind: "email";
|
|
87
|
+
value: string;
|
|
88
|
+
};
|
|
89
|
+
state: "active" | "reauth_required";
|
|
90
|
+
}[];
|
|
91
|
+
}>;
|
|
92
|
+
selectLoginSlot(request: SelectManagedAuthLoginSlotRequestType): Promise<{
|
|
93
|
+
mode: "broker" | "dual" | "legacy";
|
|
94
|
+
generation: string;
|
|
95
|
+
actorEpoch: string;
|
|
96
|
+
csrfToken: string;
|
|
97
|
+
selectedSlotId: string | null;
|
|
98
|
+
state: "actor_change_required" | "ready";
|
|
99
|
+
slots: {
|
|
100
|
+
id: string;
|
|
101
|
+
displayName: string;
|
|
102
|
+
verifiedClaim: {
|
|
103
|
+
kind: "email";
|
|
104
|
+
value: string;
|
|
105
|
+
};
|
|
106
|
+
state: "active" | "reauth_required";
|
|
107
|
+
}[];
|
|
108
|
+
}>;
|
|
109
|
+
logoutLoginSlot(request: LogoutManagedAuthLoginSlotRequestType): Promise<{
|
|
110
|
+
mode: "broker" | "dual" | "legacy";
|
|
111
|
+
generation: string;
|
|
112
|
+
actorEpoch: string;
|
|
113
|
+
csrfToken: string;
|
|
114
|
+
selectedSlotId: string | null;
|
|
115
|
+
state: "actor_change_required" | "ready";
|
|
116
|
+
slots: {
|
|
117
|
+
id: string;
|
|
118
|
+
displayName: string;
|
|
119
|
+
verifiedClaim: {
|
|
120
|
+
kind: "email";
|
|
121
|
+
value: string;
|
|
122
|
+
};
|
|
123
|
+
state: "active" | "reauth_required";
|
|
124
|
+
}[];
|
|
125
|
+
}>;
|
|
126
|
+
logoutSessionSet(request: LogoutManagedAuthSessionSetRequestType): Promise<{
|
|
127
|
+
generation: string;
|
|
128
|
+
actorEpoch: string;
|
|
129
|
+
state: "logged_out";
|
|
130
|
+
}>;
|
|
131
|
+
resolveDeepLink(request: ResolveManagedAuthDeepLinkRequestType): Promise<{
|
|
132
|
+
kind: "current";
|
|
133
|
+
} | {
|
|
134
|
+
kind: "switch_required";
|
|
135
|
+
slot: {
|
|
136
|
+
id: string;
|
|
137
|
+
displayName: string;
|
|
138
|
+
verifiedClaim: {
|
|
139
|
+
kind: "email";
|
|
140
|
+
value: string;
|
|
141
|
+
};
|
|
142
|
+
state: "active" | "reauth_required";
|
|
143
|
+
};
|
|
144
|
+
} | {
|
|
145
|
+
kind: "unavailable";
|
|
146
|
+
}>;
|
|
147
|
+
}
|
|
148
|
+
export declare function createBrowserAccountsClient(options: BrowserAccountsClientOptions): BrowserAccountsClient;
|
|
149
|
+
export type { BeginManagedAuthLoginTransactionRequestType as BeginManagedAuthLoginTransactionRequest, BootstrapManagedAuthSessionSetRequestType as BootstrapManagedAuthSessionSetRequest, CancelManagedAuthLoginTransactionRequestType as CancelManagedAuthLoginTransactionRequest, CompleteManagedAuthEmailPasswordTransactionRequestType as CompleteManagedAuthEmailPasswordTransactionRequest, CompleteManagedAuthLoginTransactionResponseType as CompleteManagedAuthLoginTransactionResponse, LogoutManagedAuthLoginSlotRequestType as LogoutManagedAuthLoginSlotRequest, LogoutManagedAuthSessionSetRequestType as LogoutManagedAuthSessionSetRequest, ManagedAuthDeepLinkResolutionType as ManagedAuthDeepLinkResolution, ManagedAuthLoginTransactionType as ManagedAuthLoginTransaction, ManagedAuthLogoutAllReceiptType as ManagedAuthLogoutAllReceipt, ManagedAuthSessionSetProjectionType as ManagedAuthSessionSetProjection, ResolveManagedAuthDeepLinkRequestType as ResolveManagedAuthDeepLinkRequest, SelectManagedAuthLoginSlotRequestType as SelectManagedAuthLoginSlotRequest, };
|
package/dist/accounts.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
// src/accounts.ts
|
|
2
|
+
import {
|
|
3
|
+
BeginManagedAuthLoginTransactionRequest,
|
|
4
|
+
BootstrapManagedAuthSessionSetRequest,
|
|
5
|
+
CancelManagedAuthLoginTransactionRequest,
|
|
6
|
+
CompleteManagedAuthEmailPasswordTransactionRequest,
|
|
7
|
+
CompleteManagedAuthLoginTransactionResponse,
|
|
8
|
+
LogoutManagedAuthLoginSlotRequest,
|
|
9
|
+
LogoutManagedAuthSessionSetRequest,
|
|
10
|
+
MANAGED_AUTH_SESSION_SET_API_CONTRACT_HEADER,
|
|
11
|
+
MANAGED_AUTH_SESSION_SET_API_CONTRACT_REVISION,
|
|
12
|
+
ManagedAuthDeepLinkResolution,
|
|
13
|
+
ManagedAuthLoginTransaction,
|
|
14
|
+
ManagedAuthLogoutAllReceipt,
|
|
15
|
+
ManagedAuthSessionSetProjection,
|
|
16
|
+
ManagedAuthSessionSetErrorCode,
|
|
17
|
+
ResolveManagedAuthDeepLinkRequest,
|
|
18
|
+
SelectManagedAuthLoginSlotRequest
|
|
19
|
+
} from "@opengeni/contracts/managed-auth-session-sets";
|
|
20
|
+
var BrowserAccountsApiError = class extends Error {
|
|
21
|
+
constructor(status, code, options) {
|
|
22
|
+
super(code, options?.cause === void 0 ? void 0 : { cause: options.cause });
|
|
23
|
+
this.status = status;
|
|
24
|
+
this.code = code;
|
|
25
|
+
}
|
|
26
|
+
name = "BrowserAccountsApiError";
|
|
27
|
+
};
|
|
28
|
+
var BrowserAccountsClient = class {
|
|
29
|
+
#baseUrl;
|
|
30
|
+
#fetch;
|
|
31
|
+
// CSRF is generation-bound. Exact idempotent replay must retain the
|
|
32
|
+
// admission envelope even after an authority reread observes a newer clock.
|
|
33
|
+
#mutationAdmissions = /* @__PURE__ */ new Map();
|
|
34
|
+
#projection = null;
|
|
35
|
+
#authorityReadEpoch = 0;
|
|
36
|
+
#authorityResetPending = false;
|
|
37
|
+
#authorityReconciliation = null;
|
|
38
|
+
constructor(options) {
|
|
39
|
+
this.#baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
40
|
+
this.#fetch = options.fetch ?? ((input, init) => fetch(input, init));
|
|
41
|
+
}
|
|
42
|
+
async getSessionSet() {
|
|
43
|
+
if (this.#authorityResetPending || this.#authorityReconciliation) {
|
|
44
|
+
return await this.reconcileSessionSetAuthority();
|
|
45
|
+
}
|
|
46
|
+
const readEpoch = this.#authorityReadEpoch;
|
|
47
|
+
const received = await this.#readSessionSet();
|
|
48
|
+
if (readEpoch !== this.#authorityReadEpoch) {
|
|
49
|
+
return this.#authorityReconciliation ? await this.#authorityReconciliation : this.#projection ?? await this.getSessionSet();
|
|
50
|
+
}
|
|
51
|
+
return this.#remember(received);
|
|
52
|
+
}
|
|
53
|
+
async reconcileSessionSetAuthority() {
|
|
54
|
+
if (this.#authorityReconciliation) return await this.#authorityReconciliation;
|
|
55
|
+
const previous = this.#projection;
|
|
56
|
+
const readEpoch = ++this.#authorityReadEpoch;
|
|
57
|
+
this.#authorityResetPending = true;
|
|
58
|
+
this.#mutationAdmissions.clear();
|
|
59
|
+
const reconciliation = this.#reconcileSessionSetAuthority(previous, readEpoch);
|
|
60
|
+
this.#authorityReconciliation = reconciliation;
|
|
61
|
+
try {
|
|
62
|
+
const accepted = await reconciliation;
|
|
63
|
+
if (readEpoch === this.#authorityReadEpoch) this.#authorityResetPending = false;
|
|
64
|
+
return accepted;
|
|
65
|
+
} finally {
|
|
66
|
+
if (this.#authorityReconciliation === reconciliation) {
|
|
67
|
+
this.#authorityReconciliation = null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async bootstrapSessionSet(request) {
|
|
72
|
+
return this.#projectionResponse(
|
|
73
|
+
"POST",
|
|
74
|
+
"/v1/auth/session-set/bootstrap",
|
|
75
|
+
BootstrapManagedAuthSessionSetRequest,
|
|
76
|
+
request
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
async beginLoginTransaction(request) {
|
|
80
|
+
return ManagedAuthLoginTransaction.parse(
|
|
81
|
+
await this.#mutation(
|
|
82
|
+
"POST",
|
|
83
|
+
"/v1/auth/session-set/transactions",
|
|
84
|
+
BeginManagedAuthLoginTransactionRequest,
|
|
85
|
+
request
|
|
86
|
+
)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
async completeEmailPasswordTransaction(request) {
|
|
90
|
+
const authorityReadEpoch = this.#authorityReadEpoch;
|
|
91
|
+
const response = CompleteManagedAuthLoginTransactionResponse.parse(
|
|
92
|
+
await this.#mutation(
|
|
93
|
+
"POST",
|
|
94
|
+
"/v1/auth/session-set/transactions/email-password",
|
|
95
|
+
CompleteManagedAuthEmailPasswordTransactionRequest,
|
|
96
|
+
request
|
|
97
|
+
)
|
|
98
|
+
);
|
|
99
|
+
if (authorityReadEpoch !== this.#authorityReadEpoch) {
|
|
100
|
+
return { ...response, projection: await this.getSessionSet() };
|
|
101
|
+
}
|
|
102
|
+
const remembered = this.#remember(response.projection);
|
|
103
|
+
if (remembered !== response.projection) {
|
|
104
|
+
return { ...response, projection: await this.getSessionSet() };
|
|
105
|
+
}
|
|
106
|
+
return response;
|
|
107
|
+
}
|
|
108
|
+
async cancelLoginTransaction(request) {
|
|
109
|
+
return this.#projectionResponse(
|
|
110
|
+
"DELETE",
|
|
111
|
+
`/v1/auth/session-set/transactions/${encodeURIComponent(request.transactionId)}`,
|
|
112
|
+
CancelManagedAuthLoginTransactionRequest,
|
|
113
|
+
request
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
async selectLoginSlot(request) {
|
|
117
|
+
return this.#projectionResponse(
|
|
118
|
+
"POST",
|
|
119
|
+
"/v1/auth/session-set/select",
|
|
120
|
+
SelectManagedAuthLoginSlotRequest,
|
|
121
|
+
request
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
async logoutLoginSlot(request) {
|
|
125
|
+
return this.#projectionResponse(
|
|
126
|
+
"POST",
|
|
127
|
+
"/v1/auth/session-set/logout-one",
|
|
128
|
+
LogoutManagedAuthLoginSlotRequest,
|
|
129
|
+
request
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
async logoutSessionSet(request) {
|
|
133
|
+
const receipt = ManagedAuthLogoutAllReceipt.parse(
|
|
134
|
+
await this.#mutation(
|
|
135
|
+
"POST",
|
|
136
|
+
"/v1/auth/session-set/logout-all",
|
|
137
|
+
LogoutManagedAuthSessionSetRequest,
|
|
138
|
+
request
|
|
139
|
+
)
|
|
140
|
+
);
|
|
141
|
+
this.#authorityReadEpoch += 1;
|
|
142
|
+
this.#authorityResetPending = false;
|
|
143
|
+
this.#projection = null;
|
|
144
|
+
this.#mutationAdmissions.clear();
|
|
145
|
+
return receipt;
|
|
146
|
+
}
|
|
147
|
+
async resolveDeepLink(request) {
|
|
148
|
+
return ManagedAuthDeepLinkResolution.parse(
|
|
149
|
+
await this.#mutation(
|
|
150
|
+
"POST",
|
|
151
|
+
"/v1/auth/session-set/deep-link/resolve",
|
|
152
|
+
ResolveManagedAuthDeepLinkRequest,
|
|
153
|
+
request
|
|
154
|
+
)
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
async #projectionResponse(method, path, schema, request) {
|
|
158
|
+
const authorityReadEpoch = this.#authorityReadEpoch;
|
|
159
|
+
const received = ManagedAuthSessionSetProjection.parse(
|
|
160
|
+
await this.#mutation(method, path, schema, request)
|
|
161
|
+
);
|
|
162
|
+
if (authorityReadEpoch !== this.#authorityReadEpoch) return await this.getSessionSet();
|
|
163
|
+
const remembered = this.#remember(received);
|
|
164
|
+
return remembered === received ? received : await this.getSessionSet();
|
|
165
|
+
}
|
|
166
|
+
async #mutation(method, path, schema, request) {
|
|
167
|
+
if (this.#authorityResetPending) {
|
|
168
|
+
throw new BrowserAccountsApiError(409, "actor_change_required");
|
|
169
|
+
}
|
|
170
|
+
const body = schema.parse(request);
|
|
171
|
+
const projection = this.#projection;
|
|
172
|
+
if (!projection) throw new BrowserAccountsApiError(409, "session_set_projection_required");
|
|
173
|
+
const operationId = mutationOperationId(body);
|
|
174
|
+
const signature = operationId ? JSON.stringify([method, path, body]) : null;
|
|
175
|
+
const retained = operationId ? this.#mutationAdmissions.get(operationId) : null;
|
|
176
|
+
if (retained && retained.signature !== signature) {
|
|
177
|
+
throw new BrowserAccountsApiError(409, "operation_reused");
|
|
178
|
+
}
|
|
179
|
+
const admission = retained ?? {
|
|
180
|
+
signature: signature ?? "",
|
|
181
|
+
csrfToken: projection.csrfToken,
|
|
182
|
+
actorEpoch: projection.actorEpoch
|
|
183
|
+
};
|
|
184
|
+
if (operationId && !retained) {
|
|
185
|
+
this.#mutationAdmissions.set(operationId, admission);
|
|
186
|
+
if (this.#mutationAdmissions.size > 64) {
|
|
187
|
+
this.#mutationAdmissions.delete(this.#mutationAdmissions.keys().next().value);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return await this.#request(method, path, body, {
|
|
191
|
+
"x-opengeni-session-csrf": admission.csrfToken,
|
|
192
|
+
"x-opengeni-actor-epoch": admission.actorEpoch
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
async #request(method, path, body, headers = {}) {
|
|
196
|
+
let response;
|
|
197
|
+
try {
|
|
198
|
+
response = await this.#fetch(`${this.#baseUrl}${path}`, {
|
|
199
|
+
method,
|
|
200
|
+
credentials: "include",
|
|
201
|
+
headers: {
|
|
202
|
+
accept: "application/json",
|
|
203
|
+
[MANAGED_AUTH_SESSION_SET_API_CONTRACT_HEADER]: MANAGED_AUTH_SESSION_SET_API_CONTRACT_REVISION,
|
|
204
|
+
...body === void 0 ? {} : { "content-type": "application/json" },
|
|
205
|
+
...headers
|
|
206
|
+
},
|
|
207
|
+
...body === void 0 ? {} : { body: JSON.stringify(body) }
|
|
208
|
+
});
|
|
209
|
+
} catch (cause) {
|
|
210
|
+
if (method !== "GET") {
|
|
211
|
+
throw new BrowserAccountsApiError(503, "operation_outcome_unknown", { cause });
|
|
212
|
+
}
|
|
213
|
+
throw cause;
|
|
214
|
+
}
|
|
215
|
+
let parsed = true;
|
|
216
|
+
const value = await response.json().catch(() => {
|
|
217
|
+
parsed = false;
|
|
218
|
+
return null;
|
|
219
|
+
});
|
|
220
|
+
if (!response.ok) {
|
|
221
|
+
const code = managedAuthErrorCode(value) ?? `http_${response.status}`;
|
|
222
|
+
throw new BrowserAccountsApiError(response.status, code);
|
|
223
|
+
}
|
|
224
|
+
if (!parsed && method !== "GET") {
|
|
225
|
+
throw new BrowserAccountsApiError(503, "operation_outcome_unknown");
|
|
226
|
+
}
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
async #readSessionSet() {
|
|
230
|
+
return ManagedAuthSessionSetProjection.parse(
|
|
231
|
+
await this.#request("GET", "/v1/auth/session-set")
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
async #reconcileSessionSetAuthority(previous, readEpoch) {
|
|
235
|
+
const first = await this.#readSessionSet();
|
|
236
|
+
const second = await this.#readSessionSet();
|
|
237
|
+
if (readEpoch !== this.#authorityReadEpoch) {
|
|
238
|
+
return await this.#reconcileSessionSetAuthority(this.#projection, this.#authorityReadEpoch);
|
|
239
|
+
}
|
|
240
|
+
if (this.#projection !== previous) return this.#remember(second);
|
|
241
|
+
if (!previous || compareProjectionClock(second, previous) >= 0) {
|
|
242
|
+
return this.#remember(second);
|
|
243
|
+
}
|
|
244
|
+
if (compareProjectionClock(first, previous) < 0 && compareProjectionClock(second, first) >= 0) {
|
|
245
|
+
this.#projection = second;
|
|
246
|
+
this.#mutationAdmissions.clear();
|
|
247
|
+
return second;
|
|
248
|
+
}
|
|
249
|
+
return previous;
|
|
250
|
+
}
|
|
251
|
+
#remember(projection) {
|
|
252
|
+
const current = this.#projection;
|
|
253
|
+
if (!current || compareProjectionClock(projection, current) >= 0) {
|
|
254
|
+
this.#projection = projection;
|
|
255
|
+
return projection;
|
|
256
|
+
}
|
|
257
|
+
return current;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
function mutationOperationId(value) {
|
|
261
|
+
if (!value || typeof value !== "object") return null;
|
|
262
|
+
const operationId = value.operationId;
|
|
263
|
+
return typeof operationId === "string" ? operationId : null;
|
|
264
|
+
}
|
|
265
|
+
function compareProjectionClock(left, right) {
|
|
266
|
+
const actorDelta = BigInt(left.actorEpoch) - BigInt(right.actorEpoch);
|
|
267
|
+
if (actorDelta !== 0n) return actorDelta > 0n ? 1 : -1;
|
|
268
|
+
const generationDelta = BigInt(left.generation) - BigInt(right.generation);
|
|
269
|
+
return generationDelta === 0n ? 0 : generationDelta > 0n ? 1 : -1;
|
|
270
|
+
}
|
|
271
|
+
function managedAuthErrorCode(value) {
|
|
272
|
+
if (!value || typeof value !== "object") return null;
|
|
273
|
+
const error = value.error;
|
|
274
|
+
if (error && typeof error === "object") {
|
|
275
|
+
const details = error.details;
|
|
276
|
+
if (details && typeof details === "object") {
|
|
277
|
+
const parsed2 = ManagedAuthSessionSetErrorCode.safeParse(
|
|
278
|
+
details.managedAuthCode
|
|
279
|
+
);
|
|
280
|
+
if (parsed2.success) return parsed2.data;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const legacy = value.message;
|
|
284
|
+
const parsed = ManagedAuthSessionSetErrorCode.safeParse(legacy);
|
|
285
|
+
return parsed.success ? parsed.data : null;
|
|
286
|
+
}
|
|
287
|
+
function createBrowserAccountsClient(options) {
|
|
288
|
+
return new BrowserAccountsClient(options);
|
|
289
|
+
}
|
|
290
|
+
export {
|
|
291
|
+
BrowserAccountsApiError,
|
|
292
|
+
BrowserAccountsClient,
|
|
293
|
+
createBrowserAccountsClient
|
|
294
|
+
};
|
|
295
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/accounts.ts"],"sourcesContent":["import {\n BeginManagedAuthLoginTransactionRequest,\n BootstrapManagedAuthSessionSetRequest,\n CancelManagedAuthLoginTransactionRequest,\n CompleteManagedAuthEmailPasswordTransactionRequest,\n CompleteManagedAuthLoginTransactionResponse,\n LogoutManagedAuthLoginSlotRequest,\n LogoutManagedAuthSessionSetRequest,\n MANAGED_AUTH_SESSION_SET_API_CONTRACT_HEADER,\n MANAGED_AUTH_SESSION_SET_API_CONTRACT_REVISION,\n ManagedAuthDeepLinkResolution,\n ManagedAuthLoginTransaction,\n ManagedAuthLogoutAllReceipt,\n ManagedAuthSessionSetProjection,\n ManagedAuthSessionSetErrorCode,\n ResolveManagedAuthDeepLinkRequest,\n SelectManagedAuthLoginSlotRequest,\n type BeginManagedAuthLoginTransactionRequest as BeginManagedAuthLoginTransactionRequestType,\n type BootstrapManagedAuthSessionSetRequest as BootstrapManagedAuthSessionSetRequestType,\n type CancelManagedAuthLoginTransactionRequest as CancelManagedAuthLoginTransactionRequestType,\n type CompleteManagedAuthEmailPasswordTransactionRequest as CompleteManagedAuthEmailPasswordTransactionRequestType,\n type CompleteManagedAuthLoginTransactionResponse as CompleteManagedAuthLoginTransactionResponseType,\n type LogoutManagedAuthLoginSlotRequest as LogoutManagedAuthLoginSlotRequestType,\n type LogoutManagedAuthSessionSetRequest as LogoutManagedAuthSessionSetRequestType,\n type ManagedAuthDeepLinkResolution as ManagedAuthDeepLinkResolutionType,\n type ManagedAuthLoginTransaction as ManagedAuthLoginTransactionType,\n type ManagedAuthLogoutAllReceipt as ManagedAuthLogoutAllReceiptType,\n type ManagedAuthSessionSetProjection as ManagedAuthSessionSetProjectionType,\n type ResolveManagedAuthDeepLinkRequest as ResolveManagedAuthDeepLinkRequestType,\n type SelectManagedAuthLoginSlotRequest as SelectManagedAuthLoginSlotRequestType,\n} from \"@opengeni/contracts/managed-auth-session-sets\";\nimport type { z } from \"zod\";\n\nexport type BrowserAccountsFetch = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport type BrowserAccountsClientOptions = {\n baseUrl: string;\n fetch?: BrowserAccountsFetch;\n};\n\nexport interface BrowserAccountsClientLike {\n getSessionSet(): Promise<ManagedAuthSessionSetProjectionType>;\n reconcileSessionSetAuthority(): Promise<ManagedAuthSessionSetProjectionType>;\n bootstrapSessionSet(\n request: BootstrapManagedAuthSessionSetRequestType,\n ): Promise<ManagedAuthSessionSetProjectionType>;\n beginLoginTransaction(\n request: BeginManagedAuthLoginTransactionRequestType,\n ): Promise<ManagedAuthLoginTransactionType>;\n completeEmailPasswordTransaction(\n request: CompleteManagedAuthEmailPasswordTransactionRequestType,\n ): Promise<CompleteManagedAuthLoginTransactionResponseType>;\n cancelLoginTransaction(\n request: CancelManagedAuthLoginTransactionRequestType,\n ): Promise<ManagedAuthSessionSetProjectionType>;\n selectLoginSlot(\n request: SelectManagedAuthLoginSlotRequestType,\n ): Promise<ManagedAuthSessionSetProjectionType>;\n logoutLoginSlot(\n request: LogoutManagedAuthLoginSlotRequestType,\n ): Promise<ManagedAuthSessionSetProjectionType>;\n logoutSessionSet(\n request: LogoutManagedAuthSessionSetRequestType,\n ): Promise<ManagedAuthLogoutAllReceiptType>;\n resolveDeepLink(\n request: ResolveManagedAuthDeepLinkRequestType,\n ): Promise<ManagedAuthDeepLinkResolutionType>;\n}\n\nexport class BrowserAccountsApiError extends Error {\n readonly name = \"BrowserAccountsApiError\";\n constructor(\n readonly status: number,\n readonly code: string,\n options?: { cause?: unknown },\n ) {\n super(code, options?.cause === undefined ? undefined : { cause: options.cause });\n }\n}\n\nexport class BrowserAccountsClient implements BrowserAccountsClientLike {\n readonly #baseUrl: string;\n readonly #fetch: BrowserAccountsFetch;\n // CSRF is generation-bound. Exact idempotent replay must retain the\n // admission envelope even after an authority reread observes a newer clock.\n readonly #mutationAdmissions = new Map<\n string,\n { signature: string; csrfToken: string; actorEpoch: string }\n >();\n #projection: ManagedAuthSessionSetProjectionType | null = null;\n #authorityReadEpoch = 0;\n #authorityResetPending = false;\n #authorityReconciliation: Promise<ManagedAuthSessionSetProjectionType> | null = null;\n\n constructor(options: BrowserAccountsClientOptions) {\n this.#baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.#fetch = options.fetch ?? ((input, init) => fetch(input, init));\n }\n\n async getSessionSet(): Promise<ManagedAuthSessionSetProjectionType> {\n if (this.#authorityResetPending || this.#authorityReconciliation) {\n return await this.reconcileSessionSetAuthority();\n }\n const readEpoch = this.#authorityReadEpoch;\n const received = await this.#readSessionSet();\n if (readEpoch !== this.#authorityReadEpoch) {\n return this.#authorityReconciliation\n ? await this.#authorityReconciliation\n : (this.#projection ?? (await this.getSessionSet()));\n }\n return this.#remember(received);\n }\n\n async reconcileSessionSetAuthority(): Promise<ManagedAuthSessionSetProjectionType> {\n if (this.#authorityReconciliation) return await this.#authorityReconciliation;\n const previous = this.#projection;\n const readEpoch = ++this.#authorityReadEpoch;\n // Explicit reconciliation is an authority-invalidation boundary, not an\n // ordinary monotonic refresh. Old operation admissions must never cross it,\n // and mutations stay closed until two sequential reads reach a decision.\n this.#authorityResetPending = true;\n this.#mutationAdmissions.clear();\n const reconciliation = this.#reconcileSessionSetAuthority(previous, readEpoch);\n this.#authorityReconciliation = reconciliation;\n try {\n const accepted = await reconciliation;\n if (readEpoch === this.#authorityReadEpoch) this.#authorityResetPending = false;\n return accepted;\n } finally {\n if (this.#authorityReconciliation === reconciliation) {\n this.#authorityReconciliation = null;\n }\n }\n }\n\n async bootstrapSessionSet(request: BootstrapManagedAuthSessionSetRequestType) {\n return this.#projectionResponse(\n \"POST\",\n \"/v1/auth/session-set/bootstrap\",\n BootstrapManagedAuthSessionSetRequest,\n request,\n );\n }\n\n async beginLoginTransaction(request: BeginManagedAuthLoginTransactionRequestType) {\n return ManagedAuthLoginTransaction.parse(\n await this.#mutation(\n \"POST\",\n \"/v1/auth/session-set/transactions\",\n BeginManagedAuthLoginTransactionRequest,\n request,\n ),\n );\n }\n\n async completeEmailPasswordTransaction(\n request: CompleteManagedAuthEmailPasswordTransactionRequestType,\n ) {\n const authorityReadEpoch = this.#authorityReadEpoch;\n const response = CompleteManagedAuthLoginTransactionResponse.parse(\n await this.#mutation(\n \"POST\",\n \"/v1/auth/session-set/transactions/email-password\",\n CompleteManagedAuthEmailPasswordTransactionRequest,\n request,\n ),\n );\n if (authorityReadEpoch !== this.#authorityReadEpoch) {\n return { ...response, projection: await this.getSessionSet() };\n }\n const remembered = this.#remember(response.projection);\n if (remembered !== response.projection) {\n return { ...response, projection: await this.getSessionSet() };\n }\n return response;\n }\n\n async cancelLoginTransaction(request: CancelManagedAuthLoginTransactionRequestType) {\n return this.#projectionResponse(\n \"DELETE\",\n `/v1/auth/session-set/transactions/${encodeURIComponent(request.transactionId)}`,\n CancelManagedAuthLoginTransactionRequest,\n request,\n );\n }\n\n async selectLoginSlot(request: SelectManagedAuthLoginSlotRequestType) {\n return this.#projectionResponse(\n \"POST\",\n \"/v1/auth/session-set/select\",\n SelectManagedAuthLoginSlotRequest,\n request,\n );\n }\n\n async logoutLoginSlot(request: LogoutManagedAuthLoginSlotRequestType) {\n return this.#projectionResponse(\n \"POST\",\n \"/v1/auth/session-set/logout-one\",\n LogoutManagedAuthLoginSlotRequest,\n request,\n );\n }\n\n async logoutSessionSet(request: LogoutManagedAuthSessionSetRequestType) {\n const receipt = ManagedAuthLogoutAllReceipt.parse(\n await this.#mutation(\n \"POST\",\n \"/v1/auth/session-set/logout-all\",\n LogoutManagedAuthSessionSetRequest,\n request,\n ),\n );\n this.#authorityReadEpoch += 1;\n this.#authorityResetPending = false;\n this.#projection = null;\n this.#mutationAdmissions.clear();\n return receipt;\n }\n\n async resolveDeepLink(request: ResolveManagedAuthDeepLinkRequestType) {\n return ManagedAuthDeepLinkResolution.parse(\n await this.#mutation(\n \"POST\",\n \"/v1/auth/session-set/deep-link/resolve\",\n ResolveManagedAuthDeepLinkRequest,\n request,\n ),\n );\n }\n\n async #projectionResponse<S extends z.ZodType>(\n method: \"POST\" | \"DELETE\",\n path: string,\n schema: S,\n request: z.infer<S>,\n ): Promise<ManagedAuthSessionSetProjectionType> {\n const authorityReadEpoch = this.#authorityReadEpoch;\n const received = ManagedAuthSessionSetProjection.parse(\n await this.#mutation(method, path, schema, request),\n );\n if (authorityReadEpoch !== this.#authorityReadEpoch) return await this.getSessionSet();\n const remembered = this.#remember(received);\n // An exact replay may legitimately return its older durable receipt after\n // another tab has advanced this in-memory client. Reconcile from authority\n // instead of presenting that receipt as the current actor projection.\n return remembered === received ? received : await this.getSessionSet();\n }\n\n async #mutation<S extends z.ZodType>(\n method: \"POST\" | \"DELETE\",\n path: string,\n schema: S,\n request: z.infer<S>,\n ): Promise<unknown> {\n if (this.#authorityResetPending) {\n throw new BrowserAccountsApiError(409, \"actor_change_required\");\n }\n const body = schema.parse(request);\n const projection = this.#projection;\n if (!projection) throw new BrowserAccountsApiError(409, \"session_set_projection_required\");\n const operationId = mutationOperationId(body);\n const signature = operationId ? JSON.stringify([method, path, body]) : null;\n const retained = operationId ? this.#mutationAdmissions.get(operationId) : null;\n if (retained && retained.signature !== signature) {\n throw new BrowserAccountsApiError(409, \"operation_reused\");\n }\n const admission =\n retained ??\n ({\n signature: signature ?? \"\",\n csrfToken: projection.csrfToken,\n actorEpoch: projection.actorEpoch,\n } as const);\n if (operationId && !retained) {\n this.#mutationAdmissions.set(operationId, admission);\n if (this.#mutationAdmissions.size > 64) {\n this.#mutationAdmissions.delete(this.#mutationAdmissions.keys().next().value!);\n }\n }\n return await this.#request(method, path, body, {\n \"x-opengeni-session-csrf\": admission.csrfToken,\n \"x-opengeni-actor-epoch\": admission.actorEpoch,\n });\n }\n\n async #request(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body?: unknown,\n headers: Record<string, string> = {},\n ): Promise<unknown> {\n let response: Response;\n try {\n response = await this.#fetch(`${this.#baseUrl}${path}`, {\n method,\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n [MANAGED_AUTH_SESSION_SET_API_CONTRACT_HEADER]:\n MANAGED_AUTH_SESSION_SET_API_CONTRACT_REVISION,\n ...(body === undefined ? {} : { \"content-type\": \"application/json\" }),\n ...headers,\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n } catch (cause) {\n if (method !== \"GET\") {\n throw new BrowserAccountsApiError(503, \"operation_outcome_unknown\", { cause });\n }\n throw cause;\n }\n let parsed = true;\n const value = await response.json().catch(() => {\n parsed = false;\n return null;\n });\n if (!response.ok) {\n const code = managedAuthErrorCode(value) ?? `http_${response.status}`;\n throw new BrowserAccountsApiError(response.status, code);\n }\n if (!parsed && method !== \"GET\") {\n throw new BrowserAccountsApiError(503, \"operation_outcome_unknown\");\n }\n return value;\n }\n\n async #readSessionSet(): Promise<ManagedAuthSessionSetProjectionType> {\n return ManagedAuthSessionSetProjection.parse(\n await this.#request(\"GET\", \"/v1/auth/session-set\"),\n );\n }\n\n async #reconcileSessionSetAuthority(\n previous: ManagedAuthSessionSetProjectionType | null,\n readEpoch: number,\n ): Promise<ManagedAuthSessionSetProjectionType> {\n const first = await this.#readSessionSet();\n const second = await this.#readSessionSet();\n if (readEpoch !== this.#authorityReadEpoch) {\n return await this.#reconcileSessionSetAuthority(this.#projection, this.#authorityReadEpoch);\n }\n if (this.#projection !== previous) return this.#remember(second);\n if (!previous || compareProjectionClock(second, previous) >= 0) {\n return this.#remember(second);\n }\n if (compareProjectionClock(first, previous) < 0 && compareProjectionClock(second, first) >= 0) {\n // Same-authority clocks never decrease. Two sequential no-store reads\n // that both remain below the remembered clock therefore prove that the\n // HttpOnly authority rotated; the second may already have advanced from\n // the fresh authority's initial 1/1 projection.\n this.#projection = second;\n this.#mutationAdmissions.clear();\n return second;\n }\n return previous;\n }\n\n #remember(projection: ManagedAuthSessionSetProjectionType) {\n const current = this.#projection;\n if (!current || compareProjectionClock(projection, current) >= 0) {\n this.#projection = projection;\n return projection;\n }\n return current;\n }\n}\n\nfunction mutationOperationId(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const operationId = (value as { operationId?: unknown }).operationId;\n return typeof operationId === \"string\" ? operationId : null;\n}\n\nfunction compareProjectionClock(\n left: Pick<ManagedAuthSessionSetProjectionType, \"actorEpoch\" | \"generation\">,\n right: Pick<ManagedAuthSessionSetProjectionType, \"actorEpoch\" | \"generation\">,\n): number {\n const actorDelta = BigInt(left.actorEpoch) - BigInt(right.actorEpoch);\n if (actorDelta !== 0n) return actorDelta > 0n ? 1 : -1;\n const generationDelta = BigInt(left.generation) - BigInt(right.generation);\n return generationDelta === 0n ? 0 : generationDelta > 0n ? 1 : -1;\n}\n\nfunction managedAuthErrorCode(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const error = (value as { error?: unknown }).error;\n if (error && typeof error === \"object\") {\n const details = (error as { details?: unknown }).details;\n if (details && typeof details === \"object\") {\n const parsed = ManagedAuthSessionSetErrorCode.safeParse(\n (details as { managedAuthCode?: unknown }).managedAuthCode,\n );\n if (parsed.success) return parsed.data;\n }\n }\n const legacy = (value as { message?: unknown }).message;\n const parsed = ManagedAuthSessionSetErrorCode.safeParse(legacy);\n return parsed.success ? parsed.data : null;\n}\n\nexport function createBrowserAccountsClient(\n options: BrowserAccountsClientOptions,\n): BrowserAccountsClient {\n return new BrowserAccountsClient(options);\n}\n\nexport type {\n BeginManagedAuthLoginTransactionRequestType as BeginManagedAuthLoginTransactionRequest,\n BootstrapManagedAuthSessionSetRequestType as BootstrapManagedAuthSessionSetRequest,\n CancelManagedAuthLoginTransactionRequestType as CancelManagedAuthLoginTransactionRequest,\n CompleteManagedAuthEmailPasswordTransactionRequestType as CompleteManagedAuthEmailPasswordTransactionRequest,\n CompleteManagedAuthLoginTransactionResponseType as CompleteManagedAuthLoginTransactionResponse,\n LogoutManagedAuthLoginSlotRequestType as LogoutManagedAuthLoginSlotRequest,\n LogoutManagedAuthSessionSetRequestType as LogoutManagedAuthSessionSetRequest,\n ManagedAuthDeepLinkResolutionType as ManagedAuthDeepLinkResolution,\n ManagedAuthLoginTransactionType as ManagedAuthLoginTransaction,\n ManagedAuthLogoutAllReceiptType as ManagedAuthLogoutAllReceipt,\n ManagedAuthSessionSetProjectionType as ManagedAuthSessionSetProjection,\n ResolveManagedAuthDeepLinkRequestType as ResolveManagedAuthDeepLinkRequest,\n SelectManagedAuthLoginSlotRequestType as SelectManagedAuthLoginSlotRequest,\n};\n"],"mappings":"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","names":["parsed"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OpenGeniDocumentAuthorityClient } from "./document-authority-client.js";
|
|
2
2
|
import type { CreateEditableArtifactMaterializationRequest, CreateEditableArtifactResourceRequest, EditableArtifactListResource, EditableArtifactMaterializationJobResource, EditableArtifactPinnedVersionResource, EditableArtifactResource, ImportEditableArtifactResourceRequest, ListSessionEditableArtifactResourcesOptions, PinEditableArtifactVersionRequest, ReadEditableArtifactMaterializationOptions, ReadEditableArtifactResourceOptions } from "./editable-artifact-resources.js";
|
|
3
3
|
import type { CreateWorkspaceArtifactRequest, PublishWorkspaceArtifactVersionRequest, RollbackWorkspaceArtifactRequest, WorkspaceArtifactContentResponse, WorkspaceArtifactDetailResponse, WorkspaceArtifactListOptions, WorkspaceArtifactListResponse, WorkspaceArtifactMutationResponse } from "./workspace-artifacts.js";
|
|
4
|
-
/** Public SDK client.
|
|
5
|
-
export declare class OpenGeniClient extends
|
|
4
|
+
/** Public SDK client. Optional operator and artifact operations stay out of the console core. */
|
|
5
|
+
export declare class OpenGeniClient extends OpenGeniDocumentAuthorityClient {
|
|
6
6
|
createEditableArtifact(workspaceId: string, request: CreateEditableArtifactResourceRequest, options?: Readonly<{
|
|
7
7
|
signal?: AbortSignal | undefined;
|
|
8
8
|
}>): Promise<EditableArtifactResource>;
|
package/dist/artifacts.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OpenGeniClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-JVRUGVPU.js";
|
|
4
|
+
import "./chunk-C7AIXTNY.js";
|
|
5
|
+
import "./chunk-4VCQBOOQ.js";
|
|
6
|
+
import "./chunk-Y7PC524F.js";
|
|
6
7
|
import "./chunk-GW3EJ2GP.js";
|
|
7
8
|
import "./chunk-C4DJPZRU.js";
|
|
8
9
|
export {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Browser-console client. Optional SDK surfaces must not enter this eager graph. */
|
|
2
|
+
export { OpenGeniClient as OpenGeniBrowserClient } from "./client.js";
|
|
3
|
+
export type { FetchLike, GetSessionOptions, OpenGeniClientOptions, OpenGeniRequestOptions, SendMessageInput, SteerMessageResult, TranscribeAudioInput, WorkspaceControlEventPage, } from "./client.js";
|
|
4
|
+
export { OpenGeniApiContractMismatchError, OpenGeniApiError, OpenGeniSessionListCursorError, OpenGeniStreamError, isRetryableStreamError, } from "./errors.js";
|
|
5
|
+
export { resolveWorkspaceVoiceInputEnabled } from "./transcription.js";
|
|
6
|
+
export { OPENGENI_API_CONTRACT_HEADER, OPENGENI_API_CONTRACT_REVISION } from "./types.js";
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveWorkspaceVoiceInputEnabled
|
|
3
|
+
} from "./chunk-VYCTL62C.js";
|
|
4
|
+
import {
|
|
5
|
+
OpenGeniClient
|
|
6
|
+
} from "./chunk-4VCQBOOQ.js";
|
|
7
|
+
import {
|
|
8
|
+
OPENGENI_API_CONTRACT_HEADER,
|
|
9
|
+
OPENGENI_API_CONTRACT_REVISION
|
|
10
|
+
} from "./chunk-Y7PC524F.js";
|
|
11
|
+
import "./chunk-GW3EJ2GP.js";
|
|
12
|
+
import {
|
|
13
|
+
OpenGeniApiContractMismatchError,
|
|
14
|
+
OpenGeniApiError,
|
|
15
|
+
OpenGeniSessionListCursorError,
|
|
16
|
+
OpenGeniStreamError,
|
|
17
|
+
isRetryableStreamError
|
|
18
|
+
} from "./chunk-C4DJPZRU.js";
|
|
19
|
+
export {
|
|
20
|
+
OPENGENI_API_CONTRACT_HEADER,
|
|
21
|
+
OPENGENI_API_CONTRACT_REVISION,
|
|
22
|
+
OpenGeniApiContractMismatchError,
|
|
23
|
+
OpenGeniApiError,
|
|
24
|
+
OpenGeniClient as OpenGeniBrowserClient,
|
|
25
|
+
OpenGeniSessionListCursorError,
|
|
26
|
+
OpenGeniStreamError,
|
|
27
|
+
isRetryableStreamError,
|
|
28
|
+
resolveWorkspaceVoiceInputEnabled
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|