@mdbase-dev/connect 0.1.0-beta.30 → 0.1.0-beta.32
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 +75 -19
- package/dist/advanced.d.ts +7 -0
- package/dist/advanced.js +4 -0
- package/dist/application-session.d.ts +10 -5
- package/dist/application-session.js +32 -16
- package/dist/async.js +11 -5
- package/dist/authority-proof.d.ts +3 -0
- package/dist/authority-proof.js +24 -0
- package/dist/browser/integrity.json +1 -1
- package/dist/browser/mdbase-connect.min.js +3 -3
- package/dist/browser/mdbase-connect.min.js.sha384 +1 -1
- package/dist/browser.d.ts +3 -0
- package/dist/browser.js +5 -0
- package/dist/capabilities.js +2 -1
- package/dist/collection-client.d.ts +28 -28
- package/dist/collection-client.js +42 -42
- package/dist/connect-options.d.ts +12 -4
- package/dist/connect.d.ts +12 -4
- package/dist/connect.js +105 -104
- package/dist/connection-file-transport.d.ts +2 -2
- package/dist/connection-file-transport.js +4 -4
- package/dist/connection-notifications.d.ts +10 -4
- package/dist/connection-notifications.js +41 -23
- package/dist/connection-transport.d.ts +19 -15
- package/dist/connection-transport.js +202 -202
- package/dist/connection-types.d.ts +5 -4
- package/dist/connection.d.ts +43 -43
- package/dist/connection.js +221 -77
- package/dist/crypto-entry.d.ts +4 -0
- package/dist/crypto-entry.js +4 -0
- package/dist/crypto.js +4 -4
- package/dist/external-store.d.ts +10 -0
- package/dist/external-store.js +10 -0
- package/dist/file-transfer-internals.d.ts +22 -0
- package/dist/file-transfer-internals.js +186 -0
- package/dist/files.d.ts +16 -12
- package/dist/files.js +52 -206
- package/dist/hosted-file-request.js +3 -3
- package/dist/index.d.ts +2 -5
- package/dist/index.js +1 -5
- package/dist/internal-types.d.ts +8 -1
- package/dist/local-file-transport.d.ts +2 -2
- package/dist/local-file-transport.js +13 -13
- package/dist/mdbase-connect.d.ts +6 -4
- package/dist/mdbase-connect.js +9 -8
- package/dist/notifications.d.ts +3 -2
- package/dist/operation-helpers.d.ts +3 -3
- package/dist/operation-helpers.js +12 -29
- package/dist/operation-types.d.ts +33 -8
- package/dist/outcomes.d.ts +15 -15
- package/dist/outcomes.js +13 -1
- package/dist/pending-mutation-store.d.ts +13 -0
- package/dist/pending-mutation-store.js +64 -0
- package/dist/request-budget.d.ts +27 -0
- package/dist/request-budget.js +95 -0
- package/dist/runtime-utils.d.ts +2 -0
- package/dist/runtime-utils.js +19 -0
- package/dist/session.d.ts +4 -3
- package/dist/session.js +4 -4
- package/dist/stored-token.d.ts +10 -0
- package/dist/stored-token.js +60 -0
- package/dist/token-response.d.ts +11 -0
- package/dist/token-response.js +77 -0
- package/package.json +12 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { connectError } from "./errors.js";
|
|
2
|
-
import { apiError } from "./runtime-utils.js";
|
|
2
|
+
import { apiError, decodeJsonResponse } from "./runtime-utils.js";
|
|
3
3
|
export async function sendHostedFileRequest(token, method, path, input, signal, proofHeaders) {
|
|
4
4
|
if (!token.authority) {
|
|
5
5
|
throw connectError("not_remote_authority", "This authorization has no remote authority endpoint.");
|
|
@@ -30,7 +30,7 @@ export async function performHostedFileRequest(token, method, path, input, signa
|
|
|
30
30
|
}
|
|
31
31
|
response = await sendHostedFileRequest(active, method, path, input, signal, proofHeaders);
|
|
32
32
|
}
|
|
33
|
-
const body = await response
|
|
33
|
+
const body = await decodeJsonResponse(response, "invalid_operation_response", "The hosted authority returned an invalid file response.");
|
|
34
34
|
if (!response.ok) {
|
|
35
35
|
throw apiError(body, "operation_failed", "Collection file request failed.", response.status);
|
|
36
36
|
}
|
|
@@ -47,7 +47,7 @@ export async function performHostedFilePartRequest(token, path, expectedLength,
|
|
|
47
47
|
response = await sendHostedFileRequest(active, "GET", path, undefined, signal, proofHeaders);
|
|
48
48
|
}
|
|
49
49
|
if (!response.ok) {
|
|
50
|
-
const body = await response
|
|
50
|
+
const body = await decodeJsonResponse(response, "invalid_operation_response", "The hosted authority returned an invalid file range error response.");
|
|
51
51
|
throw apiError(body, "operation_failed", "Collection file range request failed.", response.status);
|
|
52
52
|
}
|
|
53
53
|
const contentLength = response.headers.get("content-length");
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
export { decryptRelayResponse, encryptRelayRequest, IndexedDbGrantKeyStore, MemoryGrantKeyStore, RelayCryptoError, type RelayBinding, type GrantKeyRecord, type GrantKeyStore } from "./crypto.js";
|
|
2
|
-
export { FileTransferCryptoError, GrantFileTransferCipher, type FileTransferBinding } from "./file-crypto.js";
|
|
3
|
-
export { ApplicationIdentityStoreError, IndexedDbApplicationIdentityStore, MemoryApplicationIdentityStore, applicationInstallationId, authorizationSigningMessage, signApplicationAuthorization, type ApplicationIdentity, type ApplicationIdentityStore } from "./application-identity.js";
|
|
4
1
|
export * from "./authorization-types.js";
|
|
5
2
|
export * from "./application-session.js";
|
|
6
|
-
export * from "./collection-client.js";
|
|
7
3
|
export * from "./connect-options.js";
|
|
8
4
|
export * from "./mdbase-connect.js";
|
|
9
5
|
export * from "./connection.js";
|
|
@@ -14,7 +10,8 @@ export * from "./files.js";
|
|
|
14
10
|
export * from "./notifications.js";
|
|
15
11
|
export * from "./outcomes.js";
|
|
16
12
|
export * from "./operation-types.js";
|
|
13
|
+
export * from "./external-store.js";
|
|
14
|
+
export { type RequestBudget } from "./request-budget.js";
|
|
17
15
|
export * from "./selection.js";
|
|
18
16
|
export type { MdbaseUnavailableReason } from "./session.js";
|
|
19
|
-
export { createPkce } from "./runtime-utils.js";
|
|
20
17
|
export type { ApplicationProvisions, ApplicationCapabilityId, ApplicationCapabilityRequirements, ApplicationRequirements, ApplicationNotifications, ApplicationAuthorizationBinding, ApplicationAuthorizationProof, CollectionChange, CollectionChangesPage, CollectionContractDescriptor, CollectionDescription, CollectionFileMetadata, FileAction, CollectionOperation as MdbaseOperation, CollectionTypeDescriptor, CollectionTypeDocument, ConnectOperationOutcome, ConnectProblem, ConnectProblemCategory, ConnectProblemCode, ConnectProblemDetailsByCode, ConnectRecoveryAction, ContractRequirement, DataContractViewIdentity, GrantScope, JsonObject, MdbaseAppManifest, NotificationCriterion, MdbaseDiagnostic, MdbaseOperationEnvelope, KnownConnectProblem, RecordDocument, QueryRecord, SavedNamedView, SavedViewDocument, SavedViewExecution, SavedViewList, SavedViewPresentation, SavedViewProperty, SavedViewSource, SavedViewSourceDocument, ReadViewSourceInput, CreateViewSourceInput, UpdateViewSourceInput, DeleteViewSourceInput, DeleteViewSourceResult, ExecuteViewInput, TypePackManifest, TypePackManifestResource, TypePackApplyResult, TypePackAssessment, TypePackReceipt, AssessTypePackInput, ApplyTypePackInput, TypePackProvision, TypePackResourceDiff, TypePackSourceResource, UnknownConnectProblem } from "@mdbase-dev/connect-protocol";
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
export { decryptRelayResponse, encryptRelayRequest, IndexedDbGrantKeyStore, MemoryGrantKeyStore, RelayCryptoError } from "./crypto.js";
|
|
2
|
-
export { FileTransferCryptoError, GrantFileTransferCipher } from "./file-crypto.js";
|
|
3
|
-
export { ApplicationIdentityStoreError, IndexedDbApplicationIdentityStore, MemoryApplicationIdentityStore, applicationInstallationId, authorizationSigningMessage, signApplicationAuthorization } from "./application-identity.js";
|
|
4
1
|
export * from "./authorization-types.js";
|
|
5
2
|
export * from "./application-session.js";
|
|
6
|
-
export * from "./collection-client.js";
|
|
7
3
|
export * from "./connect-options.js";
|
|
8
4
|
export * from "./mdbase-connect.js";
|
|
9
5
|
export * from "./connection.js";
|
|
@@ -14,5 +10,5 @@ export * from "./files.js";
|
|
|
14
10
|
export * from "./notifications.js";
|
|
15
11
|
export * from "./outcomes.js";
|
|
16
12
|
export * from "./operation-types.js";
|
|
13
|
+
export * from "./external-store.js";
|
|
17
14
|
export * from "./selection.js";
|
|
18
|
-
export { createPkce } from "./runtime-utils.js";
|
package/dist/internal-types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApplicationNotifications, ApplicationRequirements, CollectionOperation, EncryptedRelayOperationRequest, GrantEncryption, FileCapability, GrantScope } from "@mdbase-dev/connect-protocol";
|
|
1
|
+
import type { ApplicationNotifications, ApplicationRequirements, CollectionOperation, EncryptedRelayOperationRequest, GrantEncryption, FileCapability, GrantScope, MdbaseOperationRequest, MutationOperationIdentifier } from "@mdbase-dev/connect-protocol";
|
|
2
2
|
import { encryptRelayRequest } from "./crypto.js";
|
|
3
3
|
export interface Application {
|
|
4
4
|
id: string;
|
|
@@ -58,10 +58,16 @@ export interface PendingMutation {
|
|
|
58
58
|
collectionId: string;
|
|
59
59
|
grantId?: string;
|
|
60
60
|
keyId?: string;
|
|
61
|
+
keyHandle?: string;
|
|
62
|
+
applicationId?: string;
|
|
63
|
+
encryption?: GrantEncryption;
|
|
61
64
|
operation: CollectionOperation;
|
|
65
|
+
mutation?: MutationOperationIdentifier;
|
|
62
66
|
inputFingerprint: string;
|
|
63
67
|
requestId: string;
|
|
64
68
|
envelope?: EncryptedRelayOperationRequest;
|
|
69
|
+
/** Exact plaintext protocol request for transports that do not use a grant envelope. */
|
|
70
|
+
request?: MdbaseOperationRequest;
|
|
65
71
|
createdAt: number;
|
|
66
72
|
}
|
|
67
73
|
export interface OperationAttempt {
|
|
@@ -70,6 +76,7 @@ export interface OperationAttempt {
|
|
|
70
76
|
encryptedRequest?: Awaited<ReturnType<typeof encryptRelayRequest>>;
|
|
71
77
|
directDeliveryUncertain?: boolean;
|
|
72
78
|
pendingMutation?: boolean;
|
|
79
|
+
pendingMutationRecord?: PendingMutation;
|
|
73
80
|
resumingMutation?: boolean;
|
|
74
81
|
}
|
|
75
82
|
export declare const DEFAULT_OPERATIONS: CollectionOperation[];
|
|
@@ -5,8 +5,8 @@ interface LocalFileTransportOptions {
|
|
|
5
5
|
keyStore: GrantKeyStore;
|
|
6
6
|
serverUrl: string;
|
|
7
7
|
loopbackUrl: string;
|
|
8
|
-
authorizedToken(): Promise<StoredToken | null>;
|
|
9
|
-
refreshAuthorization(): Promise<StoredToken>;
|
|
8
|
+
authorizedToken(signal?: AbortSignal): Promise<StoredToken | null>;
|
|
9
|
+
refreshAuthorization(signal?: AbortSignal): Promise<StoredToken>;
|
|
10
10
|
shouldAttemptDirect(token: StoredToken): Promise<boolean>;
|
|
11
11
|
onDirectAvailable(): void;
|
|
12
12
|
onDirectUnavailable(): void;
|
|
@@ -3,7 +3,7 @@ import { decryptRelayResponse, encryptRelayRequest } from "./crypto.js";
|
|
|
3
3
|
import { MdbaseConnectError, connectError, serverConnectError } from "./errors.js";
|
|
4
4
|
import { GrantFileTransferCipher } from "./file-crypto.js";
|
|
5
5
|
import { directFallbackStatus, loopbackRequest } from "./operation-helpers.js";
|
|
6
|
-
import { apiError } from "./runtime-utils.js";
|
|
6
|
+
import { apiError, decodeJsonResponse } from "./runtime-utils.js";
|
|
7
7
|
/** Keeps grant-bound file crypto and loopback framing out of the operation transport. */
|
|
8
8
|
export class LocalFileTransport {
|
|
9
9
|
options;
|
|
@@ -39,7 +39,7 @@ export class LocalFileTransport {
|
|
|
39
39
|
}
|
|
40
40
|
response = await this.sendRelayControl(token, encryptedRequest, signal);
|
|
41
41
|
if (await refreshableBindingFailure(response, token)) {
|
|
42
|
-
token = await this.options.refreshAuthorization();
|
|
42
|
+
token = await this.options.refreshAuthorization(signal);
|
|
43
43
|
requireLocalFileToken(token);
|
|
44
44
|
encryptedRequest = await this.encryptControl(token, controlInput);
|
|
45
45
|
response = await this.sendRelayControl(token, encryptedRequest, signal);
|
|
@@ -49,7 +49,7 @@ export class LocalFileTransport {
|
|
|
49
49
|
return this.decryptControlResponse(token, encryptedRequest, response);
|
|
50
50
|
}
|
|
51
51
|
async decryptControlResponse(token, encryptedRequest, response) {
|
|
52
|
-
const body = await response
|
|
52
|
+
const body = await decodeJsonResponse(response, "invalid_operation_response", "The collection authority returned an invalid file control response.");
|
|
53
53
|
if (!response.ok) {
|
|
54
54
|
throw apiError(body, "operation_failed", "Collection file request failed.", response.status);
|
|
55
55
|
}
|
|
@@ -63,7 +63,7 @@ export class LocalFileTransport {
|
|
|
63
63
|
return decrypted.result;
|
|
64
64
|
}
|
|
65
65
|
async uploadChunk(session, chunkIndex, bytes, signal) {
|
|
66
|
-
const token = await this.localFileToken(session, "upload");
|
|
66
|
+
const token = await this.localFileToken(session, "upload", signal);
|
|
67
67
|
let deliveryToken = token;
|
|
68
68
|
let encoded = await encryptedUploadChunk(this.options.keyStore, deliveryToken, session, chunkIndex, bytes);
|
|
69
69
|
let response;
|
|
@@ -86,19 +86,19 @@ export class LocalFileTransport {
|
|
|
86
86
|
}
|
|
87
87
|
response = await this.sendRelayUpload(deliveryToken, encoded, signal);
|
|
88
88
|
if (response.status === 401 && deliveryToken.refreshToken) {
|
|
89
|
-
deliveryToken = await this.options.refreshAuthorization();
|
|
89
|
+
deliveryToken = await this.options.refreshAuthorization(signal);
|
|
90
90
|
requireLocalFileToken(deliveryToken);
|
|
91
91
|
encoded = await encryptedUploadChunk(this.options.keyStore, deliveryToken, session, chunkIndex, bytes);
|
|
92
92
|
response = await this.sendRelayUpload(deliveryToken, encoded, signal);
|
|
93
93
|
}
|
|
94
94
|
if (!response.ok) {
|
|
95
|
-
const body = await response
|
|
95
|
+
const body = await decodeJsonResponse(response, "invalid_operation_response", "The collection authority returned an invalid file upload response.");
|
|
96
96
|
throw apiError(body, "operation_failed", "Encrypted file chunk upload failed.", response.status);
|
|
97
97
|
}
|
|
98
98
|
this.options.onRelayAvailable();
|
|
99
99
|
}
|
|
100
100
|
async downloadChunk(session, chunkIndex, signal) {
|
|
101
|
-
let token = await this.localFileToken(session, "download");
|
|
101
|
+
let token = await this.localFileToken(session, "download", signal);
|
|
102
102
|
let response;
|
|
103
103
|
if (await this.options.shouldAttemptDirect(token)) {
|
|
104
104
|
try {
|
|
@@ -119,7 +119,7 @@ export class LocalFileTransport {
|
|
|
119
119
|
}
|
|
120
120
|
response = await this.sendRelayDownload(token, session, chunkIndex, signal);
|
|
121
121
|
if (response.status === 401 && token.refreshToken) {
|
|
122
|
-
token = await this.options.refreshAuthorization();
|
|
122
|
+
token = await this.options.refreshAuthorization(signal);
|
|
123
123
|
requireLocalFileToken(token);
|
|
124
124
|
response = await this.sendRelayDownload(token, session, chunkIndex, signal);
|
|
125
125
|
}
|
|
@@ -129,7 +129,7 @@ export class LocalFileTransport {
|
|
|
129
129
|
}
|
|
130
130
|
async decryptDownloadResponse(token, session, chunkIndex, response) {
|
|
131
131
|
if (!response.ok) {
|
|
132
|
-
const body = await response
|
|
132
|
+
const body = await decodeJsonResponse(response, "invalid_operation_response", "The collection authority returned an invalid file download response.");
|
|
133
133
|
throw apiError(body, "operation_failed", "Encrypted file chunk download failed.", response.status);
|
|
134
134
|
}
|
|
135
135
|
if (response.headers.get("content-type")?.split(";", 1)[0]
|
|
@@ -184,8 +184,8 @@ export class LocalFileTransport {
|
|
|
184
184
|
signal
|
|
185
185
|
});
|
|
186
186
|
}
|
|
187
|
-
async localFileToken(session, direction) {
|
|
188
|
-
const token = await this.options.authorizedToken();
|
|
187
|
+
async localFileToken(session, direction, signal) {
|
|
188
|
+
const token = await this.options.authorizedToken(signal);
|
|
189
189
|
if (!token || token.authority || !token.fileCapability || !token.encryption
|
|
190
190
|
|| !token.grantId || !token.keyHandle
|
|
191
191
|
|| session.direction !== direction
|
|
@@ -218,7 +218,7 @@ function fileUploadRequest(encoded, signal) {
|
|
|
218
218
|
async function requireSuccessfulChunkResponse(response, message) {
|
|
219
219
|
if (response.ok)
|
|
220
220
|
return;
|
|
221
|
-
const body = await response
|
|
221
|
+
const body = await decodeJsonResponse(response, "invalid_operation_response", "The collection authority returned an invalid file transfer response.");
|
|
222
222
|
throw apiError(body, "operation_failed", message, response.status);
|
|
223
223
|
}
|
|
224
224
|
async function refreshableBindingFailure(response, token) {
|
|
@@ -228,7 +228,7 @@ async function refreshableBindingFailure(response, token) {
|
|
|
228
228
|
return true;
|
|
229
229
|
if (response.status !== 409)
|
|
230
230
|
return false;
|
|
231
|
-
const body = await response.clone().
|
|
231
|
+
const body = await decodeJsonResponse(response.clone(), "invalid_operation_response", "The collection authority returned an invalid file response.").catch(() => null);
|
|
232
232
|
return body?.error?.code === "encryption_binding_stale";
|
|
233
233
|
}
|
|
234
234
|
function requireEncryption(token) {
|
package/dist/mdbase-connect.d.ts
CHANGED
|
@@ -6,15 +6,17 @@ import { type AuthorizationProblemCode, type ConnectOutcome, type RegistrationPr
|
|
|
6
6
|
import { MdbaseApplicationSession, type MdbaseApplicationSessionOptions } from "./application-session.js";
|
|
7
7
|
import type { MdbaseUnavailableReason } from "./session.js";
|
|
8
8
|
import type { Application } from "./internal-types.js";
|
|
9
|
+
import type { ConnectRequestOptions } from "./operation-types.js";
|
|
9
10
|
export declare class MdbaseConnect<Frontmatter extends JsonObject = JsonObject> {
|
|
10
11
|
private readonly internals;
|
|
11
12
|
constructor(options: MdbaseConnectOptions);
|
|
12
|
-
register(): Promise<ConnectOutcome<Application, RegistrationProblemCode>>;
|
|
13
|
+
register(options?: ConnectRequestOptions): Promise<ConnectOutcome<Application, RegistrationProblemCode>>;
|
|
13
14
|
authorize(options?: MdbaseAuthorizeOptions): Promise<ConnectOutcome<MdbaseAuthorizationOutcome<Frontmatter>, AuthorizationProblemCode>>;
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
/** The ordinary application lifecycle entry point. */
|
|
16
|
+
application(options: MdbaseApplicationSessionOptions): MdbaseApplicationSession<Frontmatter>;
|
|
17
|
+
manifest(options?: ConnectRequestOptions): Promise<ConnectOutcome<import("@mdbase-dev/connect-protocol").MdbaseAppManifest, RegistrationProblemCode>>;
|
|
16
18
|
environment(): MdbaseConnectEnvironment;
|
|
17
|
-
completeAuthorization(callbackUrl?: string): Promise<ConnectOutcome<MdbaseAuthorizationResult<Frontmatter>, AuthorizationProblemCode>>;
|
|
19
|
+
completeAuthorization(callbackUrl?: string | URL, options?: ConnectRequestOptions): Promise<ConnectOutcome<MdbaseAuthorizationResult<Frontmatter>, AuthorizationProblemCode>>;
|
|
18
20
|
connections(): MdbaseConnectionInfo[];
|
|
19
21
|
connection(collectionId: string): MdbaseConnection<Frontmatter> | null;
|
|
20
22
|
unavailableReason(collectionId: string): MdbaseUnavailableReason | null;
|
package/dist/mdbase-connect.js
CHANGED
|
@@ -7,23 +7,24 @@ export class MdbaseConnect {
|
|
|
7
7
|
constructor(options) {
|
|
8
8
|
this.internals = new MdbaseConnectInternals(options);
|
|
9
9
|
}
|
|
10
|
-
register() {
|
|
11
|
-
return captureConnectOutcome(() => this.internals.register(), REGISTRATION_PROBLEM_CODES);
|
|
10
|
+
register(options) {
|
|
11
|
+
return captureConnectOutcome(() => this.internals.register(options), REGISTRATION_PROBLEM_CODES);
|
|
12
12
|
}
|
|
13
13
|
authorize(options = {}) {
|
|
14
14
|
return captureConnectOutcome(() => this.internals.authorize(options), AUTHORIZATION_PROBLEM_CODES);
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
/** The ordinary application lifecycle entry point. */
|
|
17
|
+
application(options) {
|
|
18
|
+
return new MdbaseApplicationSession(this, options, this.internals.timeouts);
|
|
18
19
|
}
|
|
19
|
-
manifest() {
|
|
20
|
-
return captureConnectOutcome(() => this.internals.manifestDeclaration(), REGISTRATION_PROBLEM_CODES);
|
|
20
|
+
manifest(options) {
|
|
21
|
+
return captureConnectOutcome(() => this.internals.manifestDeclaration(options), REGISTRATION_PROBLEM_CODES);
|
|
21
22
|
}
|
|
22
23
|
environment() {
|
|
23
24
|
return this.internals.environment();
|
|
24
25
|
}
|
|
25
|
-
completeAuthorization(callbackUrl) {
|
|
26
|
-
return captureConnectOutcome(() => this.internals.completeAuthorization(callbackUrl
|
|
26
|
+
completeAuthorization(callbackUrl, options) {
|
|
27
|
+
return captureConnectOutcome(() => this.internals.completeAuthorization(callbackUrl === undefined ? defaultCallbackUrl() : String(callbackUrl), options), AUTHORIZATION_PROBLEM_CODES);
|
|
27
28
|
}
|
|
28
29
|
connections() {
|
|
29
30
|
return this.internals.connections();
|
package/dist/notifications.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import type { ConnectRequestOptions } from "./operation-types.js";
|
|
2
|
+
export interface MdbaseNotificationRegistrationOptions extends ConnectRequestOptions {
|
|
2
3
|
serviceWorker: ServiceWorkerRegistration;
|
|
3
4
|
/** Manifest criterion IDs to enable. Omit to enable every declared criterion. */
|
|
4
5
|
criteria?: string[];
|
|
@@ -10,7 +11,7 @@ export interface MdbaseNotificationRegistration {
|
|
|
10
11
|
installationId: string;
|
|
11
12
|
criteria: string[];
|
|
12
13
|
}
|
|
13
|
-
export interface MdbaseNativeNotificationRegistrationOptions {
|
|
14
|
+
export interface MdbaseNativeNotificationRegistrationOptions extends ConnectRequestOptions {
|
|
14
15
|
/** Current FCM registration token. Refresh by calling this method again. */
|
|
15
16
|
token: string;
|
|
16
17
|
/** Manifest criterion IDs to enable. Omit to enable every declared criterion. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CollectionOperation } from "@mdbase-dev/connect-protocol";
|
|
2
2
|
import { MdbaseConnectError } from "./errors.js";
|
|
3
3
|
import type { StoredToken } from "./internal-types.js";
|
|
4
4
|
import type { DeleteInput, DeletePreflightResult, MutationEstimate, RenameInput, RenamePreflightResult } from "./operation-types.js";
|
|
@@ -12,7 +12,7 @@ export declare function isMutation(operation: CollectionOperation, input?: unkno
|
|
|
12
12
|
export declare function uniqueOperations(operations: CollectionOperation[]): CollectionOperation[];
|
|
13
13
|
export declare function sameAuthorization(left: StoredToken, right: StoredToken): boolean;
|
|
14
14
|
export declare function throwIfCancelled(signal?: AbortSignal): void;
|
|
15
|
-
export declare function operationTransportError(error: unknown, signal: AbortSignal | undefined,
|
|
15
|
+
export declare function operationTransportError(error: unknown, signal: AbortSignal | undefined, pendingRequestId: string | undefined, unavailableCode: "hosted_provider_unavailable" | "relay_unavailable"): Error;
|
|
16
16
|
export declare function isCancellation(error: unknown, signal?: AbortSignal): boolean;
|
|
17
17
|
export declare function assertRenamePreview(input: RenameInput, preview: RenamePreflightResult): void;
|
|
18
18
|
export declare function assertDeletePreview(input: DeleteInput, preview: DeletePreflightResult): void;
|
|
@@ -21,4 +21,4 @@ export declare function deleteEstimate(preview: DeletePreflightResult): Mutation
|
|
|
21
21
|
export declare function operationFingerprint(operation: CollectionOperation, input: unknown): Promise<string>;
|
|
22
22
|
export declare function canonicalJson(value: unknown): string;
|
|
23
23
|
export declare function sortJson(value: unknown): unknown;
|
|
24
|
-
export declare function unknownMutationOutcome(cause: unknown): MdbaseConnectError;
|
|
24
|
+
export declare function unknownMutationOutcome(requestId: string, cause: unknown): MdbaseConnectError;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { isMutatingOperation, mutationFingerprint } from "@mdbase-dev/connect-protocol";
|
|
1
2
|
import { MdbaseConnectError, connectError } from "./errors.js";
|
|
2
|
-
import { bytesToBase64Url } from "./base64.js";
|
|
3
3
|
export function loopbackRequest(init) {
|
|
4
4
|
return { ...init, credentials: "omit", targetAddressSpace: "loopback" };
|
|
5
5
|
}
|
|
@@ -20,24 +20,7 @@ export function directFallbackStatus(status) {
|
|
|
20
20
|
return status === 404 || status === 405 || status === 426 || status >= 500;
|
|
21
21
|
}
|
|
22
22
|
export function isMutation(operation, input) {
|
|
23
|
-
|
|
24
|
-
&& input.dry_run === true)
|
|
25
|
-
return false;
|
|
26
|
-
return (operation === "sync"
|
|
27
|
-
&& input !== null
|
|
28
|
-
&& typeof input === "object"
|
|
29
|
-
&& !Array.isArray(input)
|
|
30
|
-
&& input.action === "mutate")
|
|
31
|
-
|| operation === "create"
|
|
32
|
-
|| operation === "update"
|
|
33
|
-
|| operation === "delete"
|
|
34
|
-
|| operation === "rename"
|
|
35
|
-
|| operation === "create_type"
|
|
36
|
-
|| operation === "update_type"
|
|
37
|
-
|| operation === "apply_type_pack"
|
|
38
|
-
|| operation === "put_timer"
|
|
39
|
-
|| operation === "cancel_timer"
|
|
40
|
-
|| operation === "reconcile_timers";
|
|
23
|
+
return isMutatingOperation(operation, input);
|
|
41
24
|
}
|
|
42
25
|
export function uniqueOperations(operations) {
|
|
43
26
|
return [...new Set(operations)];
|
|
@@ -55,19 +38,21 @@ export function throwIfCancelled(signal) {
|
|
|
55
38
|
return;
|
|
56
39
|
throw connectError("operation_cancelled", "The operation was cancelled before it changed the collection.", { operationOutcome: "not_sent", cause: signal.reason });
|
|
57
40
|
}
|
|
58
|
-
export function operationTransportError(error, signal,
|
|
41
|
+
export function operationTransportError(error, signal, pendingRequestId, unavailableCode) {
|
|
59
42
|
// Problems raised before transport dispatch already describe the
|
|
60
43
|
// authoritative outcome. Do not overwrite them merely because an older
|
|
61
44
|
// pending mutation also exists in storage.
|
|
62
45
|
if (error instanceof MdbaseConnectError)
|
|
63
46
|
return error;
|
|
64
47
|
if (signal?.aborted) {
|
|
65
|
-
if (
|
|
66
|
-
return unknownMutationOutcome(error);
|
|
48
|
+
if (pendingRequestId)
|
|
49
|
+
return unknownMutationOutcome(pendingRequestId, error);
|
|
50
|
+
if (signal.reason instanceof MdbaseConnectError)
|
|
51
|
+
return signal.reason;
|
|
67
52
|
return connectError("operation_cancelled", "The operation was cancelled before it changed the collection.", { operationOutcome: "not_sent", cause: error });
|
|
68
53
|
}
|
|
69
|
-
if (
|
|
70
|
-
return unknownMutationOutcome(error);
|
|
54
|
+
if (pendingRequestId) {
|
|
55
|
+
return unknownMutationOutcome(pendingRequestId, error);
|
|
71
56
|
}
|
|
72
57
|
if (error instanceof TypeError) {
|
|
73
58
|
return connectError(unavailableCode, unavailableCode === "hosted_provider_unavailable"
|
|
@@ -110,9 +95,7 @@ export function deleteEstimate(preview) {
|
|
|
110
95
|
};
|
|
111
96
|
}
|
|
112
97
|
export async function operationFingerprint(operation, input) {
|
|
113
|
-
|
|
114
|
-
const digest = await crypto.subtle.digest("SHA-256", encoded);
|
|
115
|
-
return bytesToBase64Url(new Uint8Array(digest));
|
|
98
|
+
return mutationFingerprint(operation, input ?? {});
|
|
116
99
|
}
|
|
117
100
|
export function canonicalJson(value) {
|
|
118
101
|
return JSON.stringify(sortJson(value));
|
|
@@ -128,6 +111,6 @@ export function sortJson(value) {
|
|
|
128
111
|
}
|
|
129
112
|
return value;
|
|
130
113
|
}
|
|
131
|
-
export function unknownMutationOutcome(cause) {
|
|
132
|
-
return connectError("operation_outcome_unknown", "The write may have completed, but mdbase could not recover its authoritative result. Retry the exact same write to recover safely.", { operationOutcome: "unknown", cause });
|
|
114
|
+
export function unknownMutationOutcome(requestId, cause) {
|
|
115
|
+
return connectError("operation_outcome_unknown", "The write may have completed, but mdbase could not recover its authoritative result. Retry the exact same write to recover safely.", { operationOutcome: "unknown", details: { request_id: requestId }, cause });
|
|
133
116
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CollectionOperation, ConnectProblem, JsonObject, QueryRecord, RecordDocument } from "@mdbase-dev/connect-protocol";
|
|
1
|
+
import type { CollectionChange, CollectionOperation, ConnectProblem, JsonObject, MutationOperationIdentifier, QueryRecord, RecordDocument } from "@mdbase-dev/connect-protocol";
|
|
2
2
|
export interface MdbaseDesiredTimer {
|
|
3
3
|
/** Stable within the timer namespace. */
|
|
4
4
|
id: string;
|
|
@@ -67,6 +67,7 @@ export interface QueryPagesOptions<Record extends JsonObject = JsonObject> {
|
|
|
67
67
|
firstPageSize?: number;
|
|
68
68
|
pageSize?: number;
|
|
69
69
|
signal?: AbortSignal;
|
|
70
|
+
timeoutMs?: number | null;
|
|
70
71
|
onProgress?: (page: QueryPage<Record>) => void;
|
|
71
72
|
}
|
|
72
73
|
export interface QueryPage<Record extends JsonObject = JsonObject> {
|
|
@@ -78,8 +79,10 @@ export interface QueryPage<Record extends JsonObject = JsonObject> {
|
|
|
78
79
|
complete: boolean;
|
|
79
80
|
snapshot?: string;
|
|
80
81
|
}
|
|
81
|
-
export interface
|
|
82
|
+
export interface ConnectRequestOptions {
|
|
82
83
|
signal?: AbortSignal;
|
|
84
|
+
/** Relative request budget. `null` deliberately disables the SDK default. */
|
|
85
|
+
timeoutMs?: number | null;
|
|
83
86
|
}
|
|
84
87
|
export interface MutationEstimate {
|
|
85
88
|
/** Records whose links may be affected, excluding the record being mutated. */
|
|
@@ -98,8 +101,7 @@ export interface MutationProgress {
|
|
|
98
101
|
completedUnits: number;
|
|
99
102
|
estimate?: MutationEstimate;
|
|
100
103
|
}
|
|
101
|
-
export interface MutationProgressOptions {
|
|
102
|
-
signal?: AbortSignal;
|
|
104
|
+
export interface MutationProgressOptions extends ConnectRequestOptions {
|
|
103
105
|
onProgress?: (progress: MutationProgress) => void;
|
|
104
106
|
}
|
|
105
107
|
export interface RenameProgressOptions extends MutationProgressOptions {
|
|
@@ -111,9 +113,14 @@ export interface DeleteProgressOptions extends MutationProgressOptions {
|
|
|
111
113
|
preflight?: DeletePreflightResult;
|
|
112
114
|
}
|
|
113
115
|
export interface PendingMutationSummary {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
requestId: string;
|
|
117
|
+
operation: MutationOperationIdentifier;
|
|
118
|
+
fingerprint: string;
|
|
119
|
+
status: "pending" | "recovering" | "outcome_unknown";
|
|
120
|
+
createdAt: string;
|
|
121
|
+
}
|
|
122
|
+
export interface PendingMutation<Result = unknown> extends PendingMutationSummary {
|
|
123
|
+
recover(options?: ConnectRequestOptions): Promise<import("./outcomes.js").ConnectOutcome<Result>>;
|
|
117
124
|
}
|
|
118
125
|
export interface CreateInput<Frontmatter extends JsonObject = JsonObject> {
|
|
119
126
|
path?: string;
|
|
@@ -217,6 +224,8 @@ export interface WatchOptions {
|
|
|
217
224
|
cursor?: number;
|
|
218
225
|
pollIntervalMs?: number;
|
|
219
226
|
signal?: AbortSignal;
|
|
227
|
+
/** Per-poll/reconnect budget. null deliberately disables the SDK default. */
|
|
228
|
+
timeoutMs?: number | null;
|
|
220
229
|
/** Set to false to surface transient transport failures immediately. */
|
|
221
230
|
retry?: false | WatchRetryOptions;
|
|
222
231
|
onStatus?: (status: WatchStatus) => void;
|
|
@@ -245,9 +254,25 @@ export type WatchStatus = {
|
|
|
245
254
|
state: "reset_required";
|
|
246
255
|
cursor: number;
|
|
247
256
|
problem: ConnectProblem<"change_cursor_reset">;
|
|
257
|
+
} | {
|
|
258
|
+
state: "closed";
|
|
259
|
+
cursor?: number;
|
|
248
260
|
};
|
|
261
|
+
export interface WatchInput {
|
|
262
|
+
cursor?: number;
|
|
263
|
+
pollIntervalMs?: number;
|
|
264
|
+
retry?: false | WatchRetryOptions;
|
|
265
|
+
/** Cancels the subscription lifetime after bounded startup succeeds. */
|
|
266
|
+
lifetimeSignal?: AbortSignal;
|
|
267
|
+
}
|
|
268
|
+
export interface MdbaseWatchSubscription {
|
|
269
|
+
readonly status: WatchStatus;
|
|
270
|
+
readonly problem: ConnectProblem | null;
|
|
271
|
+
subscribe(listener: (change: CollectionChange) => void, onStatus?: (status: WatchStatus) => void, onProblem?: (problem: ConnectProblem) => void): () => void;
|
|
272
|
+
close(): void;
|
|
273
|
+
}
|
|
249
274
|
/** Provider-neutral operation transport used by the typed collection client. */
|
|
250
275
|
export interface MdbaseCollectionTransport {
|
|
251
|
-
operation<Result>(operation: CollectionOperation, input: unknown, options?:
|
|
276
|
+
operation<Result>(operation: CollectionOperation, input: unknown, options?: ConnectRequestOptions): Promise<Result>;
|
|
252
277
|
}
|
|
253
278
|
export {};
|
package/dist/outcomes.d.ts
CHANGED
|
@@ -13,19 +13,19 @@ export type ConnectFailure<Code extends ConnectProblemCode = ConnectProblemCode>
|
|
|
13
13
|
* for programming errors and broken SDK invariants.
|
|
14
14
|
*/
|
|
15
15
|
export type ConnectOutcome<Value, Code extends ConnectProblemCode = ConnectProblemCode> = ConnectSuccess<Value> | ConnectFailure<Code>;
|
|
16
|
-
export type CommonOperationProblemCode = "access_denied" | "access_paused" | "authorization_expired" | "collection_access_denied" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "direct_operation_rejected" | "operation_outcome_unknown" | "encryption_required" | "encrypted_relay_rejected" | "hosted_provider_unavailable" | "insufficient_access" | "invalid_encrypted_response" | "invalid_operation_response" | "invalid_request" | "missing_grant_key" | "not_authorized" | "operation_cancelled" | "operation_failed" | "rate_limited" | "relay_authorization_expired" | "relay_unavailable" | "temporarily_unavailable" | "timeout" | "unsupported_operation";
|
|
17
|
-
export declare const COMMON_OPERATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation"];
|
|
16
|
+
export type CommonOperationProblemCode = "access_denied" | "access_paused" | "authorization_binding_incompatible" | "authorization_expired" | "capability_contract_incompatible" | "collection_access_denied" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "direct_operation_rejected" | "durable_mutation_unsupported" | "operation_outcome_unknown" | "encryption_required" | "encrypted_relay_rejected" | "hosted_provider_unavailable" | "insufficient_access" | "invalid_encrypted_response" | "invalid_operation_response" | "invalid_request" | "missing_grant_key" | "mutation_recovery_expired" | "mutation_request_conflict" | "not_authorized" | "operation_cancelled" | "operation_failed" | "rate_limited" | "relay_authorization_expired" | "relay_unavailable" | "temporarily_unavailable" | "timeout" | "transport_protocol_incompatible" | "unsupported_operation";
|
|
17
|
+
export declare const COMMON_OPERATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation"];
|
|
18
18
|
export declare const ALL_CONNECT_PROBLEM_CODES: ConnectProblemCode[];
|
|
19
|
-
export type RegistrationProblemCode = "discovery_failed" | "invalid_application_manifest" | "invalid_request" | "manifest_load_failed" | "rate_limited" | "temporarily_unavailable" | "timeout";
|
|
20
|
-
export declare const REGISTRATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout"];
|
|
21
|
-
export type AuthorizationProblemCode = RegistrationProblemCode | "access_denied" | "application_identity_unavailable" | "approval_window_blocked" | "authorization_cancelled" | "authorization_replayed" | "browser_required" | "collection_access_denied" | "collection_configuration_invalid" | "collection_contracts_missing" | "collection_incompatible" | "collection_invalid" | "collection_kind_unsupported" | "collection_mismatch" | "collection_not_found" | "collection_type_registry_invalid" | "collection_version_unsupported" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "device_authorization_failed" | "encryption_required" | "expired_token" | "invalid_application_authorization" | "invalid_callback" | "invalid_device_authorization_response" | "invalid_token_response" | "scope_denied" | "reconnect_required" | "token_exchange_failed";
|
|
22
|
-
export declare const AUTHORIZATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "access_denied", "application_identity_unavailable", "approval_window_blocked", "authorization_cancelled", "authorization_replayed", "browser_required", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "scope_denied", "reconnect_required", "token_exchange_failed"];
|
|
23
|
-
export type NotificationProblemCode = RegistrationProblemCode | "authorization_expired" | "invalid_push_subscription" | "managed_fcm_not_declared" | "not_authorized" | "notification_criterion_not_declared" | "notification_reauthorization_required" | "notification_registration_failed" | "notification_unregistration_failed" | "notifications_not_declared" | "notifications_unavailable";
|
|
24
|
-
export declare const NOTIFICATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "authorization_expired", "invalid_push_subscription", "managed_fcm_not_declared", "not_authorized", "notification_criterion_not_declared", "notification_reauthorization_required", "notification_registration_failed", "notification_unregistration_failed", "notifications_not_declared", "notifications_unavailable"];
|
|
19
|
+
export type RegistrationProblemCode = "discovery_failed" | "invalid_operation_response" | "invalid_application_manifest" | "invalid_request" | "manifest_load_failed" | "rate_limited" | "temporarily_unavailable" | "timeout";
|
|
20
|
+
export declare const REGISTRATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout"];
|
|
21
|
+
export type AuthorizationProblemCode = RegistrationProblemCode | "access_denied" | "application_identity_unavailable" | "approval_window_blocked" | "authorization_binding_incompatible" | "authorization_cancelled" | "authorization_replayed" | "browser_required" | "capability_contract_incompatible" | "collection_access_denied" | "collection_configuration_invalid" | "collection_contracts_missing" | "collection_incompatible" | "collection_invalid" | "collection_kind_unsupported" | "collection_mismatch" | "collection_not_found" | "collection_type_registry_invalid" | "collection_version_unsupported" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "device_authorization_failed" | "durable_mutation_unsupported" | "encryption_required" | "expired_token" | "invalid_application_authorization" | "invalid_callback" | "invalid_device_authorization_response" | "invalid_token_response" | "scope_denied" | "reconnect_required" | "token_exchange_failed" | "transport_protocol_incompatible";
|
|
22
|
+
export declare const AUTHORIZATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "access_denied", "application_identity_unavailable", "approval_window_blocked", "authorization_binding_incompatible", "authorization_cancelled", "authorization_replayed", "browser_required", "capability_contract_incompatible", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "durable_mutation_unsupported", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible"];
|
|
23
|
+
export type NotificationProblemCode = RegistrationProblemCode | "authorization_expired" | "invalid_operation_response" | "invalid_push_subscription" | "managed_fcm_not_declared" | "not_authorized" | "notification_criterion_not_declared" | "notification_reauthorization_required" | "notification_registration_failed" | "notification_unregistration_failed" | "notifications_not_declared" | "notifications_unavailable";
|
|
24
|
+
export declare const NOTIFICATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "authorization_expired", "invalid_operation_response", "invalid_push_subscription", "managed_fcm_not_declared", "not_authorized", "notification_criterion_not_declared", "notification_reauthorization_required", "notification_registration_failed", "notification_unregistration_failed", "notifications_not_declared", "notifications_unavailable"];
|
|
25
25
|
export type DirectAccessProblemCode = "connector_offline" | "connector_upgrade_required" | "invalid_operation_response" | "not_authorized" | "operation_failed" | "temporarily_unavailable" | "timeout";
|
|
26
26
|
export declare const DIRECT_ACCESS_PROBLEM_CODES: readonly ["connector_offline", "connector_upgrade_required", "invalid_operation_response", "not_authorized", "operation_failed", "temporarily_unavailable", "timeout"];
|
|
27
27
|
export type SessionProblemCode = AuthorizationProblemCode | "collection_not_ready" | "collection_not_selected" | "unknown_collection";
|
|
28
|
-
export declare const SESSION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "access_denied", "application_identity_unavailable", "approval_window_blocked", "authorization_cancelled", "authorization_replayed", "browser_required", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "scope_denied", "reconnect_required", "token_exchange_failed", "collection_not_ready", "collection_not_selected", "unknown_collection"];
|
|
28
|
+
export declare const SESSION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "access_denied", "application_identity_unavailable", "approval_window_blocked", "authorization_binding_incompatible", "authorization_cancelled", "authorization_replayed", "browser_required", "capability_contract_incompatible", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "durable_mutation_unsupported", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible", "collection_not_ready", "collection_not_selected", "unknown_collection"];
|
|
29
29
|
export type CollectionSetupProblemCode = "collection_configuration_invalid" | "collection_invalid" | "collection_type_registry_invalid" | "collection_version_unsupported";
|
|
30
30
|
export type CollectionDescriptionProblemCode = CommonOperationProblemCode | CollectionSetupProblemCode;
|
|
31
31
|
export type CollectionReadProblemCode = CollectionDescriptionProblemCode | "invalid_path" | "operation_invalid";
|
|
@@ -34,12 +34,12 @@ export type CollectionMutationProblemCode = CollectionReadProblemCode | "concurr
|
|
|
34
34
|
export type CollectionChangesProblemCode = CollectionDescriptionProblemCode | "change_cursor_reset";
|
|
35
35
|
export type CollectionTypeProblemCode = CollectionMutationProblemCode | "type_pack_provision_failed";
|
|
36
36
|
export declare const COLLECTION_SETUP_PROBLEM_CODES: readonly ["collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported"];
|
|
37
|
-
export declare const COLLECTION_DESCRIPTION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported"];
|
|
38
|
-
export declare const COLLECTION_READ_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid"];
|
|
39
|
-
export declare const COLLECTION_QUERY_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid", "query_snapshot_changed", "sandbox_unsupported"];
|
|
40
|
-
export declare const COLLECTION_MUTATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved"];
|
|
41
|
-
export declare const COLLECTION_CHANGES_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "change_cursor_reset"];
|
|
42
|
-
export declare const COLLECTION_TYPE_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_expired", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved", "type_pack_provision_failed"];
|
|
37
|
+
export declare const COLLECTION_DESCRIPTION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported"];
|
|
38
|
+
export declare const COLLECTION_READ_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid"];
|
|
39
|
+
export declare const COLLECTION_QUERY_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid", "query_snapshot_changed", "sandbox_unsupported"];
|
|
40
|
+
export declare const COLLECTION_MUTATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved"];
|
|
41
|
+
export declare const COLLECTION_CHANGES_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "change_cursor_reset"];
|
|
42
|
+
export declare const COLLECTION_TYPE_PROBLEM_CODES: readonly ["access_denied", "access_paused", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved", "type_pack_provision_failed"];
|
|
43
43
|
export declare function connectSuccess<Value>(value: Value, diagnostics?: MdbaseDiagnostic[]): ConnectSuccess<Value>;
|
|
44
44
|
export declare function connectFailure<Code extends ConnectProblemCode>(problem: ConnectProblem<Code>): ConnectFailure<Code>;
|
|
45
45
|
export declare function captureConnectOutcome<Value, Code extends ConnectProblemCode>(operation: () => Promise<Value>, allowedCodes: readonly Code[]): Promise<ConnectOutcome<Value, Code>>;
|