@mdbase-dev/connect 0.1.0-beta.31 → 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.
Files changed (64) hide show
  1. package/README.md +75 -19
  2. package/dist/advanced.d.ts +7 -0
  3. package/dist/advanced.js +4 -0
  4. package/dist/application-session.d.ts +10 -5
  5. package/dist/application-session.js +32 -16
  6. package/dist/async.js +11 -5
  7. package/dist/authority-proof.d.ts +3 -0
  8. package/dist/authority-proof.js +24 -0
  9. package/dist/browser/integrity.json +1 -1
  10. package/dist/browser/mdbase-connect.min.js +3 -3
  11. package/dist/browser/mdbase-connect.min.js.sha384 +1 -1
  12. package/dist/browser.d.ts +3 -0
  13. package/dist/browser.js +5 -0
  14. package/dist/capabilities.js +2 -1
  15. package/dist/collection-client.d.ts +28 -28
  16. package/dist/collection-client.js +42 -42
  17. package/dist/connect-options.d.ts +12 -4
  18. package/dist/connect.d.ts +12 -4
  19. package/dist/connect.js +105 -104
  20. package/dist/connection-file-transport.d.ts +2 -2
  21. package/dist/connection-file-transport.js +4 -4
  22. package/dist/connection-notifications.d.ts +10 -4
  23. package/dist/connection-notifications.js +41 -23
  24. package/dist/connection-transport.d.ts +19 -15
  25. package/dist/connection-transport.js +202 -202
  26. package/dist/connection-types.d.ts +5 -4
  27. package/dist/connection.d.ts +43 -43
  28. package/dist/connection.js +221 -77
  29. package/dist/crypto-entry.d.ts +4 -0
  30. package/dist/crypto-entry.js +4 -0
  31. package/dist/crypto.js +4 -4
  32. package/dist/external-store.d.ts +10 -0
  33. package/dist/external-store.js +10 -0
  34. package/dist/file-transfer-internals.d.ts +22 -0
  35. package/dist/file-transfer-internals.js +186 -0
  36. package/dist/files.d.ts +16 -12
  37. package/dist/files.js +52 -206
  38. package/dist/hosted-file-request.js +3 -3
  39. package/dist/index.d.ts +2 -5
  40. package/dist/index.js +1 -5
  41. package/dist/internal-types.d.ts +8 -1
  42. package/dist/local-file-transport.d.ts +2 -2
  43. package/dist/local-file-transport.js +13 -13
  44. package/dist/mdbase-connect.d.ts +6 -4
  45. package/dist/mdbase-connect.js +9 -8
  46. package/dist/notifications.d.ts +3 -2
  47. package/dist/operation-helpers.d.ts +3 -3
  48. package/dist/operation-helpers.js +12 -29
  49. package/dist/operation-types.d.ts +33 -8
  50. package/dist/outcomes.d.ts +15 -15
  51. package/dist/outcomes.js +13 -1
  52. package/dist/pending-mutation-store.d.ts +13 -0
  53. package/dist/pending-mutation-store.js +64 -0
  54. package/dist/request-budget.d.ts +27 -0
  55. package/dist/request-budget.js +95 -0
  56. package/dist/runtime-utils.d.ts +2 -0
  57. package/dist/runtime-utils.js +19 -0
  58. package/dist/session.d.ts +4 -3
  59. package/dist/session.js +4 -4
  60. package/dist/stored-token.d.ts +10 -0
  61. package/dist/stored-token.js +60 -0
  62. package/dist/token-response.d.ts +11 -0
  63. package/dist/token-response.js +77 -0
  64. 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.json().catch(() => ({}));
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.json().catch(() => ({}));
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";
@@ -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.json().catch(() => ({}));
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.json().catch(() => ({}));
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.json().catch(() => ({}));
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.json().catch(() => ({}));
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().json().catch(() => null);
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) {
@@ -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
- createApplicationSession(options: MdbaseApplicationSessionOptions): MdbaseApplicationSession<Frontmatter>;
15
- manifest(): Promise<ConnectOutcome<import("@mdbase-dev/connect-protocol").MdbaseAppManifest, RegistrationProblemCode>>;
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;
@@ -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
- createApplicationSession(options) {
17
- return new MdbaseApplicationSession(this, options);
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 ?? defaultCallbackUrl()), AUTHORIZATION_PROBLEM_CODES);
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();
@@ -1,4 +1,5 @@
1
- export interface MdbaseNotificationRegistrationOptions {
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 { CollectionOperation } from "@mdbase-dev/connect-protocol";
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, outcomeUnknown: boolean, unavailableCode: "hosted_provider_unavailable" | "relay_unavailable"): Error;
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
- if (input && typeof input === "object" && !Array.isArray(input)
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, outcomeUnknown, unavailableCode) {
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 (outcomeUnknown)
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 (outcomeUnknown) {
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
- const encoded = new TextEncoder().encode(`${operation}\0${canonicalJson(input ?? {})}`);
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 OperationRequestOptions {
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
- operation: CollectionOperation;
115
- createdAt: number;
116
- resumable: true;
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?: OperationRequestOptions): Promise<Result>;
276
+ operation<Result>(operation: CollectionOperation, input: unknown, options?: ConnectRequestOptions): Promise<Result>;
252
277
  }
253
278
  export {};
@@ -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>>;