@mdbase-dev/connect 0.1.0-beta.100
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/LICENSE +21 -0
- package/README.md +696 -0
- package/dist/advanced.d.ts +9 -0
- package/dist/advanced.js +6 -0
- package/dist/application-contract.d.ts +22 -0
- package/dist/application-contract.js +75 -0
- package/dist/application-identity.d.ts +34 -0
- package/dist/application-identity.js +148 -0
- package/dist/application-session.d.ts +167 -0
- package/dist/application-session.js +722 -0
- package/dist/async.d.ts +1 -0
- package/dist/async.js +19 -0
- package/dist/authority-proof.d.ts +3 -0
- package/dist/authority-proof.js +24 -0
- package/dist/authority-sync-request.d.ts +3 -0
- package/dist/authority-sync-request.js +20 -0
- package/dist/authorization-refresh.d.ts +14 -0
- package/dist/authorization-refresh.js +41 -0
- package/dist/authorization-types.d.ts +7 -0
- package/dist/authorization-types.js +1 -0
- package/dist/authorization-url.d.ts +5 -0
- package/dist/authorization-url.js +34 -0
- package/dist/base64.d.ts +3 -0
- package/dist/base64.js +21 -0
- package/dist/browser/integrity.json +4 -0
- package/dist/browser/mdbase-connect.min.js +3 -0
- package/dist/browser/mdbase-connect.min.js.sha384 +1 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.js +5 -0
- package/dist/capabilities.d.ts +24 -0
- package/dist/capabilities.js +91 -0
- package/dist/collection-client.d.ts +66 -0
- package/dist/collection-client.js +686 -0
- package/dist/connect-authorization-helpers.d.ts +4 -0
- package/dist/connect-authorization-helpers.js +25 -0
- package/dist/connect-options.d.ts +35 -0
- package/dist/connect-options.js +1 -0
- package/dist/connect.d.ts +66 -0
- package/dist/connect.js +711 -0
- package/dist/connection-file-transport.d.ts +34 -0
- package/dist/connection-file-transport.js +85 -0
- package/dist/connection-index.d.ts +3 -0
- package/dist/connection-index.js +20 -0
- package/dist/connection-notifications.d.ts +31 -0
- package/dist/connection-notifications.js +197 -0
- package/dist/connection-transport-internals.d.ts +24 -0
- package/dist/connection-transport-internals.js +1 -0
- package/dist/connection-transport.d.ts +64 -0
- package/dist/connection-transport.js +725 -0
- package/dist/connection-types.d.ts +38 -0
- package/dist/connection-types.js +1 -0
- package/dist/connection.d.ts +175 -0
- package/dist/connection.js +606 -0
- package/dist/crypto-entry.d.ts +7 -0
- package/dist/crypto-entry.js +4 -0
- package/dist/crypto.d.ts +63 -0
- package/dist/crypto.js +409 -0
- package/dist/direct-access.d.ts +3 -0
- package/dist/direct-access.js +29 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.js +142 -0
- package/dist/external-store.d.ts +10 -0
- package/dist/external-store.js +10 -0
- package/dist/file-crypto.d.ts +25 -0
- package/dist/file-crypto.js +132 -0
- package/dist/file-sha256.d.ts +12 -0
- package/dist/file-sha256.js +143 -0
- package/dist/file-stream-source.d.ts +17 -0
- package/dist/file-stream-source.js +157 -0
- package/dist/file-transfer-internals.d.ts +23 -0
- package/dist/file-transfer-internals.js +228 -0
- package/dist/files.d.ts +115 -0
- package/dist/files.js +563 -0
- package/dist/fresh-encrypted-request.d.ts +4 -0
- package/dist/fresh-encrypted-request.js +28 -0
- package/dist/grant-key-leases.d.ts +24 -0
- package/dist/grant-key-leases.js +144 -0
- package/dist/hosted-file-request.d.ts +6 -0
- package/dist/hosted-file-request.js +63 -0
- package/dist/hosted-operation-response.d.ts +5 -0
- package/dist/hosted-operation-response.js +26 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +10 -0
- package/dist/internal-types.d.ts +100 -0
- package/dist/internal-types.js +1 -0
- package/dist/local-file-transport.d.ts +37 -0
- package/dist/local-file-transport.js +457 -0
- package/dist/mdbase-connect.d.ts +28 -0
- package/dist/mdbase-connect.js +53 -0
- package/dist/notifications.d.ts +48 -0
- package/dist/notifications.js +52 -0
- package/dist/operation-helpers.d.ts +27 -0
- package/dist/operation-helpers.js +144 -0
- package/dist/operation-types.d.ts +707 -0
- package/dist/operation-types.js +1 -0
- package/dist/outcomes.d.ts +51 -0
- package/dist/outcomes.js +194 -0
- package/dist/pending-mutation-store.d.ts +13 -0
- package/dist/pending-mutation-store.js +64 -0
- package/dist/pending-recovery-transports.d.ts +5 -0
- package/dist/pending-recovery-transports.js +52 -0
- package/dist/popup-authorization.d.ts +31 -0
- package/dist/popup-authorization.js +100 -0
- package/dist/query-pagination.d.ts +6 -0
- package/dist/query-pagination.js +119 -0
- package/dist/request-budget.d.ts +34 -0
- package/dist/request-budget.js +104 -0
- package/dist/request-coordinator.d.ts +29 -0
- package/dist/request-coordinator.js +213 -0
- package/dist/retired-grant-keys.d.ts +9 -0
- package/dist/retired-grant-keys.js +56 -0
- package/dist/runtime-utils.d.ts +52 -0
- package/dist/runtime-utils.js +368 -0
- package/dist/saved-view-pagination.d.ts +6 -0
- package/dist/saved-view-pagination.js +76 -0
- package/dist/selection.d.ts +48 -0
- package/dist/selection.js +112 -0
- package/dist/session.d.ts +114 -0
- package/dist/session.js +569 -0
- package/dist/shared-operation.d.ts +7 -0
- package/dist/shared-operation.js +41 -0
- package/dist/stored-token.d.ts +10 -0
- package/dist/stored-token.js +64 -0
- package/dist/structured-readiness.d.ts +77 -0
- package/dist/structured-readiness.js +126 -0
- package/dist/token-response.d.ts +12 -0
- package/dist/token-response.js +81 -0
- package/dist/transient-retry.d.ts +22 -0
- package/dist/transient-retry.js +59 -0
- package/dist/watch-policy.d.ts +8 -0
- package/dist/watch-policy.js +12 -0
- package/package.json +51 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ConnectProblem, ConnectProblemCode, MdbaseDiagnostic } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
export type ConnectSuccess<Value> = {
|
|
3
|
+
ok: true;
|
|
4
|
+
value: Value;
|
|
5
|
+
diagnostics: MdbaseDiagnostic[];
|
|
6
|
+
};
|
|
7
|
+
export type ConnectFailure<Code extends ConnectProblemCode = ConnectProblemCode> = {
|
|
8
|
+
ok: false;
|
|
9
|
+
problem: ConnectProblem<Code>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Every expected failure from the public SDK is data. Exceptions are reserved
|
|
13
|
+
* for programming errors and broken SDK invariants.
|
|
14
|
+
*/
|
|
15
|
+
export type ConnectOutcome<Value, Code extends ConnectProblemCode = ConnectProblemCode> = ConnectSuccess<Value> | ConnectFailure<Code>;
|
|
16
|
+
export type CommonOperationProblemCode = "access_denied" | "access_paused" | "application_declaration_mismatch" | "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", "application_declaration_mismatch", "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
|
+
export declare const ALL_CONNECT_PROBLEM_CODES: ConnectProblemCode[];
|
|
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_declaration_mismatch" | "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" | "legacy_scope_reauthorization_required" | "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_declaration_mismatch", "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", "legacy_scope_reauthorization_required", "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
|
+
export type DirectAccessProblemCode = "connector_offline" | "connector_upgrade_required" | "invalid_operation_response" | "not_authorized" | "operation_failed" | "temporarily_unavailable" | "timeout";
|
|
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
|
+
export type SessionProblemCode = AuthorizationProblemCode | "collection_not_ready" | "collection_not_selected" | "operation_cancelled" | "session_destroyed" | "session_not_started" | "session_starting" | "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_declaration_mismatch", "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", "legacy_scope_reauthorization_required", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible", "collection_not_ready", "collection_not_selected", "operation_cancelled", "session_destroyed", "session_not_started", "session_starting", "unknown_collection"];
|
|
29
|
+
export type CollectionSetupProblemCode = "collection_configuration_invalid" | "collection_invalid" | "collection_type_registry_invalid" | "collection_version_unsupported";
|
|
30
|
+
export type CollectionDescriptionProblemCode = CommonOperationProblemCode | CollectionSetupProblemCode;
|
|
31
|
+
export type CollectionReadProblemCode = CollectionDescriptionProblemCode | "invalid_path" | "operation_invalid";
|
|
32
|
+
export type CollectionQueryProblemCode = CollectionReadProblemCode | "cursor_capacity_exhausted" | "generation_expired" | "invalid_read_cursor" | "query_snapshot_changed" | "sandbox_unsupported";
|
|
33
|
+
export type CollectionMutationProblemCode = CollectionReadProblemCode | "concurrent_modification" | "invalid_preflight" | "pending_mutation_unresolved";
|
|
34
|
+
export type CollectionChangesProblemCode = CollectionDescriptionProblemCode | "change_cursor_reset";
|
|
35
|
+
export type CollectionTypeProblemCode = CollectionMutationProblemCode | "type_pack_provision_failed";
|
|
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", "application_declaration_mismatch", "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", "application_declaration_mismatch", "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", "application_declaration_mismatch", "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", "cursor_capacity_exhausted", "generation_expired", "invalid_read_cursor", "query_snapshot_changed", "sandbox_unsupported"];
|
|
40
|
+
export declare const COLLECTION_MUTATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "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", "application_declaration_mismatch", "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", "application_declaration_mismatch", "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
|
+
export declare function connectSuccess<Value>(value: Value, diagnostics?: MdbaseDiagnostic[]): ConnectSuccess<Value>;
|
|
44
|
+
export declare function connectFailure<Code extends ConnectProblemCode>(problem: ConnectProblem<Code>): ConnectFailure<Code>;
|
|
45
|
+
export declare function captureConnectOutcome<Value, Code extends ConnectProblemCode>(operation: () => Promise<Value>, allowedCodes: readonly Code[]): Promise<ConnectOutcome<Value, Code>>;
|
|
46
|
+
export declare class ConnectOutcomeError extends Error {
|
|
47
|
+
readonly problem: ConnectProblem;
|
|
48
|
+
constructor(problem: ConnectProblem);
|
|
49
|
+
}
|
|
50
|
+
/** Explicitly opt back into exception flow for scripts and narrow adapters. */
|
|
51
|
+
export declare function unwrapConnectOutcome<Value>(outcome: ConnectOutcome<Value>): Value;
|
package/dist/outcomes.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { CONNECT_PROBLEM_CATALOG } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
import { MdbaseConnectError, unknownConnectProblem } from "./errors.js";
|
|
3
|
+
export const COMMON_OPERATION_PROBLEM_CODES = [
|
|
4
|
+
"access_denied",
|
|
5
|
+
"access_paused",
|
|
6
|
+
"application_declaration_mismatch",
|
|
7
|
+
"authorization_binding_incompatible",
|
|
8
|
+
"authorization_expired",
|
|
9
|
+
"capability_contract_incompatible",
|
|
10
|
+
"collection_access_denied",
|
|
11
|
+
"connector_identity_changed",
|
|
12
|
+
"connector_offline",
|
|
13
|
+
"connector_upgrade_required",
|
|
14
|
+
"direct_operation_rejected",
|
|
15
|
+
"durable_mutation_unsupported",
|
|
16
|
+
"operation_outcome_unknown",
|
|
17
|
+
"encryption_required",
|
|
18
|
+
"encrypted_relay_rejected",
|
|
19
|
+
"hosted_provider_unavailable",
|
|
20
|
+
"insufficient_access",
|
|
21
|
+
"invalid_encrypted_response",
|
|
22
|
+
"invalid_operation_response",
|
|
23
|
+
"invalid_request",
|
|
24
|
+
"missing_grant_key",
|
|
25
|
+
"mutation_recovery_expired",
|
|
26
|
+
"mutation_request_conflict",
|
|
27
|
+
"not_authorized",
|
|
28
|
+
"operation_cancelled",
|
|
29
|
+
"operation_failed",
|
|
30
|
+
"rate_limited",
|
|
31
|
+
"relay_authorization_expired",
|
|
32
|
+
"relay_unavailable",
|
|
33
|
+
"temporarily_unavailable",
|
|
34
|
+
"timeout",
|
|
35
|
+
"transport_protocol_incompatible",
|
|
36
|
+
"unsupported_operation"
|
|
37
|
+
];
|
|
38
|
+
export const ALL_CONNECT_PROBLEM_CODES = Object.keys(CONNECT_PROBLEM_CATALOG);
|
|
39
|
+
export const REGISTRATION_PROBLEM_CODES = [
|
|
40
|
+
"discovery_failed",
|
|
41
|
+
"invalid_operation_response",
|
|
42
|
+
"invalid_application_manifest",
|
|
43
|
+
"invalid_request",
|
|
44
|
+
"manifest_load_failed",
|
|
45
|
+
"rate_limited",
|
|
46
|
+
"temporarily_unavailable",
|
|
47
|
+
"timeout"
|
|
48
|
+
];
|
|
49
|
+
export const AUTHORIZATION_PROBLEM_CODES = [
|
|
50
|
+
...REGISTRATION_PROBLEM_CODES,
|
|
51
|
+
"access_denied",
|
|
52
|
+
"application_declaration_mismatch",
|
|
53
|
+
"application_identity_unavailable",
|
|
54
|
+
"approval_window_blocked",
|
|
55
|
+
"authorization_binding_incompatible",
|
|
56
|
+
"authorization_cancelled",
|
|
57
|
+
"authorization_replayed",
|
|
58
|
+
"browser_required",
|
|
59
|
+
"capability_contract_incompatible",
|
|
60
|
+
"collection_access_denied",
|
|
61
|
+
"collection_configuration_invalid",
|
|
62
|
+
"collection_contracts_missing",
|
|
63
|
+
"collection_incompatible",
|
|
64
|
+
"collection_invalid",
|
|
65
|
+
"collection_kind_unsupported",
|
|
66
|
+
"collection_mismatch",
|
|
67
|
+
"collection_not_found",
|
|
68
|
+
"collection_type_registry_invalid",
|
|
69
|
+
"collection_version_unsupported",
|
|
70
|
+
"connector_identity_changed",
|
|
71
|
+
"connector_offline",
|
|
72
|
+
"connector_upgrade_required",
|
|
73
|
+
"device_authorization_failed",
|
|
74
|
+
"durable_mutation_unsupported",
|
|
75
|
+
"encryption_required",
|
|
76
|
+
"expired_token",
|
|
77
|
+
"invalid_application_authorization",
|
|
78
|
+
"invalid_callback",
|
|
79
|
+
"invalid_device_authorization_response",
|
|
80
|
+
"invalid_token_response",
|
|
81
|
+
"legacy_scope_reauthorization_required",
|
|
82
|
+
"scope_denied",
|
|
83
|
+
"reconnect_required",
|
|
84
|
+
"token_exchange_failed",
|
|
85
|
+
"transport_protocol_incompatible"
|
|
86
|
+
];
|
|
87
|
+
export const NOTIFICATION_PROBLEM_CODES = [
|
|
88
|
+
...REGISTRATION_PROBLEM_CODES,
|
|
89
|
+
"authorization_expired",
|
|
90
|
+
"invalid_operation_response",
|
|
91
|
+
"invalid_push_subscription",
|
|
92
|
+
"managed_fcm_not_declared",
|
|
93
|
+
"not_authorized",
|
|
94
|
+
"notification_criterion_not_declared",
|
|
95
|
+
"notification_reauthorization_required",
|
|
96
|
+
"notification_registration_failed",
|
|
97
|
+
"notification_unregistration_failed",
|
|
98
|
+
"notifications_not_declared",
|
|
99
|
+
"notifications_unavailable"
|
|
100
|
+
];
|
|
101
|
+
export const DIRECT_ACCESS_PROBLEM_CODES = [
|
|
102
|
+
"connector_offline",
|
|
103
|
+
"connector_upgrade_required",
|
|
104
|
+
"invalid_operation_response",
|
|
105
|
+
"not_authorized",
|
|
106
|
+
"operation_failed",
|
|
107
|
+
"temporarily_unavailable",
|
|
108
|
+
"timeout"
|
|
109
|
+
];
|
|
110
|
+
export const SESSION_PROBLEM_CODES = [
|
|
111
|
+
...AUTHORIZATION_PROBLEM_CODES,
|
|
112
|
+
"collection_not_ready",
|
|
113
|
+
"collection_not_selected",
|
|
114
|
+
"operation_cancelled",
|
|
115
|
+
"session_destroyed",
|
|
116
|
+
"session_not_started",
|
|
117
|
+
"session_starting",
|
|
118
|
+
"unknown_collection"
|
|
119
|
+
];
|
|
120
|
+
export const COLLECTION_SETUP_PROBLEM_CODES = [
|
|
121
|
+
"collection_configuration_invalid",
|
|
122
|
+
"collection_invalid",
|
|
123
|
+
"collection_type_registry_invalid",
|
|
124
|
+
"collection_version_unsupported"
|
|
125
|
+
];
|
|
126
|
+
export const COLLECTION_DESCRIPTION_PROBLEM_CODES = [
|
|
127
|
+
...COMMON_OPERATION_PROBLEM_CODES,
|
|
128
|
+
...COLLECTION_SETUP_PROBLEM_CODES
|
|
129
|
+
];
|
|
130
|
+
export const COLLECTION_READ_PROBLEM_CODES = [
|
|
131
|
+
...COLLECTION_DESCRIPTION_PROBLEM_CODES,
|
|
132
|
+
"invalid_path",
|
|
133
|
+
"operation_invalid"
|
|
134
|
+
];
|
|
135
|
+
export const COLLECTION_QUERY_PROBLEM_CODES = [
|
|
136
|
+
...COLLECTION_READ_PROBLEM_CODES,
|
|
137
|
+
"cursor_capacity_exhausted",
|
|
138
|
+
"generation_expired",
|
|
139
|
+
"invalid_read_cursor",
|
|
140
|
+
"query_snapshot_changed",
|
|
141
|
+
"sandbox_unsupported"
|
|
142
|
+
];
|
|
143
|
+
export const COLLECTION_MUTATION_PROBLEM_CODES = [
|
|
144
|
+
...COLLECTION_READ_PROBLEM_CODES,
|
|
145
|
+
"concurrent_modification",
|
|
146
|
+
"invalid_preflight",
|
|
147
|
+
"pending_mutation_unresolved"
|
|
148
|
+
];
|
|
149
|
+
export const COLLECTION_CHANGES_PROBLEM_CODES = [
|
|
150
|
+
...COLLECTION_DESCRIPTION_PROBLEM_CODES,
|
|
151
|
+
"change_cursor_reset"
|
|
152
|
+
];
|
|
153
|
+
export const COLLECTION_TYPE_PROBLEM_CODES = [
|
|
154
|
+
...COLLECTION_MUTATION_PROBLEM_CODES,
|
|
155
|
+
"type_pack_provision_failed"
|
|
156
|
+
];
|
|
157
|
+
export function connectSuccess(value, diagnostics = []) {
|
|
158
|
+
return { ok: true, value, diagnostics };
|
|
159
|
+
}
|
|
160
|
+
export function connectFailure(problem) {
|
|
161
|
+
return { ok: false, problem };
|
|
162
|
+
}
|
|
163
|
+
export async function captureConnectOutcome(operation, allowedCodes) {
|
|
164
|
+
try {
|
|
165
|
+
return connectSuccess(await operation());
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (!(error instanceof MdbaseConnectError))
|
|
169
|
+
throw error;
|
|
170
|
+
const problem = error.problem;
|
|
171
|
+
if (problem.code === "unknown" || allowedCodes.includes(problem.code)) {
|
|
172
|
+
return connectFailure(problem);
|
|
173
|
+
}
|
|
174
|
+
return connectFailure(unknownConnectProblem(problem.code, problem.message, {
|
|
175
|
+
details: problem.details,
|
|
176
|
+
operationOutcome: problem.operation_outcome,
|
|
177
|
+
traceId: problem.trace_id
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export class ConnectOutcomeError extends Error {
|
|
182
|
+
problem;
|
|
183
|
+
constructor(problem) {
|
|
184
|
+
super(problem.message);
|
|
185
|
+
this.problem = problem;
|
|
186
|
+
this.name = "ConnectOutcomeError";
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Explicitly opt back into exception flow for scripts and narrow adapters. */
|
|
190
|
+
export function unwrapConnectOutcome(outcome) {
|
|
191
|
+
if (!outcome.ok)
|
|
192
|
+
throw new ConnectOutcomeError(outcome.problem);
|
|
193
|
+
return outcome.value;
|
|
194
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type MutationOperationIdentifier } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
import type { PendingMutation } from "./internal-types.js";
|
|
3
|
+
export declare class PendingMutationStore {
|
|
4
|
+
private readonly storage;
|
|
5
|
+
private readonly baseKey;
|
|
6
|
+
constructor(storage: Storage, baseKey: string);
|
|
7
|
+
list(collectionId: string | null): PendingMutation[];
|
|
8
|
+
find(collectionId: string | null, requestId: string): PendingMutation | null;
|
|
9
|
+
identifier(pending: PendingMutation): MutationOperationIdentifier;
|
|
10
|
+
store(pending: PendingMutation): void;
|
|
11
|
+
take(requestId: string): PendingMutation | null;
|
|
12
|
+
private key;
|
|
13
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { isCollectionOperation, mutationOperationIdentifier } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
import { parseStored } from "./runtime-utils.js";
|
|
3
|
+
export class PendingMutationStore {
|
|
4
|
+
storage;
|
|
5
|
+
baseKey;
|
|
6
|
+
constructor(storage, baseKey) {
|
|
7
|
+
this.storage = storage;
|
|
8
|
+
this.baseKey = baseKey;
|
|
9
|
+
}
|
|
10
|
+
list(collectionId) {
|
|
11
|
+
if (!collectionId)
|
|
12
|
+
return [];
|
|
13
|
+
const legacy = parseStored(this.storage.getItem(this.baseKey));
|
|
14
|
+
if (validPendingMutation(legacy) && legacy.collectionId === collectionId) {
|
|
15
|
+
const migratedKey = this.key(legacy.requestId);
|
|
16
|
+
if (!this.storage.getItem(migratedKey)) {
|
|
17
|
+
this.storage.setItem(migratedKey, JSON.stringify(legacy));
|
|
18
|
+
}
|
|
19
|
+
this.storage.removeItem(this.baseKey);
|
|
20
|
+
}
|
|
21
|
+
const keys = [];
|
|
22
|
+
for (let index = 0; index < this.storage.length; index += 1) {
|
|
23
|
+
const key = this.storage.key(index);
|
|
24
|
+
if (key?.startsWith(`${this.baseKey}:`))
|
|
25
|
+
keys.push(key);
|
|
26
|
+
}
|
|
27
|
+
return keys
|
|
28
|
+
.map((key) => parseStored(this.storage.getItem(key)))
|
|
29
|
+
.filter((pending) => validPendingMutation(pending) && pending.collectionId === collectionId)
|
|
30
|
+
.sort((left, right) => left.createdAt - right.createdAt
|
|
31
|
+
|| left.requestId.localeCompare(right.requestId));
|
|
32
|
+
}
|
|
33
|
+
find(collectionId, requestId) {
|
|
34
|
+
return this.list(collectionId)
|
|
35
|
+
.find((pending) => pending.requestId === requestId) ?? null;
|
|
36
|
+
}
|
|
37
|
+
identifier(pending) {
|
|
38
|
+
return pending.mutation ?? mutationOperationIdentifier(pending.operation, pending.request?.input ?? (pending.operation === "sync" ? { action: "mutate" } : {})) ?? (pending.operation === "sync" ? "sync:mutate" : pending.operation);
|
|
39
|
+
}
|
|
40
|
+
store(pending) {
|
|
41
|
+
this.storage.setItem(this.key(pending.requestId), JSON.stringify(pending));
|
|
42
|
+
}
|
|
43
|
+
take(requestId) {
|
|
44
|
+
const key = this.key(requestId);
|
|
45
|
+
const pending = parseStored(this.storage.getItem(key));
|
|
46
|
+
this.storage.removeItem(key);
|
|
47
|
+
return pending;
|
|
48
|
+
}
|
|
49
|
+
key(requestId) {
|
|
50
|
+
return `${this.baseKey}:${encodeURIComponent(requestId)}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function validPendingMutation(pending) {
|
|
54
|
+
return Boolean(pending
|
|
55
|
+
&& typeof pending.collectionId === "string"
|
|
56
|
+
&& typeof pending.requestId === "string"
|
|
57
|
+
&& pending.requestId.length > 0
|
|
58
|
+
&& isCollectionOperation(pending.operation)
|
|
59
|
+
&& typeof pending.inputFingerprint === "string"
|
|
60
|
+
&& Number.isFinite(pending.createdAt)
|
|
61
|
+
&& pending.createdAt > 0
|
|
62
|
+
&& (pending.envelope || pending.request)
|
|
63
|
+
&& (pending.operation === "sync" || mutationOperationIdentifier(pending.operation, pending.request?.input ?? {}) !== null));
|
|
64
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CollectionOperation, OperationTransportProtocolVersion } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
export declare function pendingRecoveryTransports(storage: Storage, storagePrefix: string, operations: readonly CollectionOperation[], collectionId?: string): OperationTransportProtocolVersion[];
|
|
3
|
+
export declare function pendingMutationsUseKey(storage: Storage, baseKey: string, keyHandle: string): boolean;
|
|
4
|
+
export declare function pendingMutationKeyHandles(storage: Storage, baseKey: string): Set<string>;
|
|
5
|
+
export declare function removePendingMutations(storage: Storage, baseKey: string, removeKey: (keyHandle: string) => void): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { isSupportedOperationTransport, OPERATION_TRANSPORT_PROTOCOL_VERSION } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
import { parseStored } from "./runtime-utils.js";
|
|
3
|
+
export function pendingRecoveryTransports(storage, storagePrefix, operations, collectionId) {
|
|
4
|
+
const prefix = `${storagePrefix}:pending-mutation:`;
|
|
5
|
+
const versions = new Set();
|
|
6
|
+
for (let index = 0; index < storage.length; index += 1) {
|
|
7
|
+
const key = storage.key(index);
|
|
8
|
+
if (!key?.startsWith(prefix))
|
|
9
|
+
continue;
|
|
10
|
+
const pending = parseStored(storage.getItem(key));
|
|
11
|
+
if (!pending
|
|
12
|
+
|| !operations.includes(pending.operation)
|
|
13
|
+
|| (collectionId && pending.collectionId !== collectionId))
|
|
14
|
+
continue;
|
|
15
|
+
const version = pending.envelope?.protocol_version ?? pending.request?.protocol_version;
|
|
16
|
+
if (version !== undefined
|
|
17
|
+
&& version !== OPERATION_TRANSPORT_PROTOCOL_VERSION
|
|
18
|
+
&& isSupportedOperationTransport(version)) {
|
|
19
|
+
versions.add(version);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return [...versions].sort((left, right) => right - left);
|
|
23
|
+
}
|
|
24
|
+
export function pendingMutationsUseKey(storage, baseKey, keyHandle) {
|
|
25
|
+
return pendingMutationKeyHandles(storage, baseKey).has(keyHandle);
|
|
26
|
+
}
|
|
27
|
+
export function pendingMutationKeyHandles(storage, baseKey) {
|
|
28
|
+
const handles = new Set();
|
|
29
|
+
for (let index = 0; index < storage.length; index += 1) {
|
|
30
|
+
const key = storage.key(index);
|
|
31
|
+
if (key !== baseKey && !key?.startsWith(`${baseKey}:`))
|
|
32
|
+
continue;
|
|
33
|
+
const pending = parseStored(storage.getItem(key));
|
|
34
|
+
if (pending?.keyHandle)
|
|
35
|
+
handles.add(pending.keyHandle);
|
|
36
|
+
}
|
|
37
|
+
return handles;
|
|
38
|
+
}
|
|
39
|
+
export function removePendingMutations(storage, baseKey, removeKey) {
|
|
40
|
+
const keys = [baseKey];
|
|
41
|
+
for (let index = 0; index < storage.length; index += 1) {
|
|
42
|
+
const key = storage.key(index);
|
|
43
|
+
if (key?.startsWith(`${baseKey}:`))
|
|
44
|
+
keys.push(key);
|
|
45
|
+
}
|
|
46
|
+
for (const key of keys) {
|
|
47
|
+
const pending = parseStored(storage.getItem(key));
|
|
48
|
+
if (pending?.keyHandle)
|
|
49
|
+
removeKey(pending.keyHandle);
|
|
50
|
+
storage.removeItem(key);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { JsonObject } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
import type { MdbaseAuthorizeOptions, MdbaseAuthorizationOutcome, MdbaseAuthorizationResult, MdbaseConnection } from "./connection.js";
|
|
3
|
+
import type { GrantKeyStore } from "./crypto.js";
|
|
4
|
+
import type { Application, StoredAuthorization } from "./internal-types.js";
|
|
5
|
+
export declare function prepareAuthorizationWindow(input: {
|
|
6
|
+
options: MdbaseAuthorizeOptions;
|
|
7
|
+
portableDeclared: boolean;
|
|
8
|
+
navigate?: (url: string) => void | Promise<void>;
|
|
9
|
+
register(signal: AbortSignal): Promise<Application>;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
application: Application;
|
|
12
|
+
popup: Window | null;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function waitForPopupAuthorization<Frontmatter extends JsonObject>(input: {
|
|
15
|
+
storage: Storage;
|
|
16
|
+
storagePrefix: string;
|
|
17
|
+
state: string;
|
|
18
|
+
pending: StoredAuthorization;
|
|
19
|
+
popup: Window;
|
|
20
|
+
signal: AbortSignal;
|
|
21
|
+
keyStore: GrantKeyStore;
|
|
22
|
+
connection(collectionId: string): MdbaseConnection<Frontmatter> | null;
|
|
23
|
+
}): Promise<MdbaseAuthorizationOutcome<Frontmatter>>;
|
|
24
|
+
export declare function publishPopupAuthorizationCompletion<Frontmatter extends JsonObject>(input: {
|
|
25
|
+
storage: Storage;
|
|
26
|
+
storagePrefix: string;
|
|
27
|
+
state: string;
|
|
28
|
+
pending: StoredAuthorization | null;
|
|
29
|
+
popupAttempt: boolean;
|
|
30
|
+
completion: Promise<MdbaseAuthorizationResult<Frontmatter>>;
|
|
31
|
+
}): Promise<MdbaseAuthorizationResult<Frontmatter>>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { abortableDelay } from "./async.js";
|
|
2
|
+
import { MdbaseConnectError, connectError, serverConnectError } from "./errors.js";
|
|
3
|
+
import { parseStored } from "./runtime-utils.js";
|
|
4
|
+
export async function prepareAuthorizationWindow(input) {
|
|
5
|
+
if (typeof location === "undefined" && !input.navigate && !input.options.openVerification) {
|
|
6
|
+
throw connectError("browser_required", "Authorization navigation requires a browser environment.");
|
|
7
|
+
}
|
|
8
|
+
const popupRequested = input.options.presentation === "popup" || input.portableDeclared;
|
|
9
|
+
const popup = popupRequested
|
|
10
|
+
&& !input.options.openVerification
|
|
11
|
+
&& !input.navigate
|
|
12
|
+
&& typeof window !== "undefined"
|
|
13
|
+
? window.open("", "mdbase-connect-authorization", "popup,width=620,height=760")
|
|
14
|
+
: null;
|
|
15
|
+
try {
|
|
16
|
+
return {
|
|
17
|
+
application: await input.register(input.options.signal),
|
|
18
|
+
popup
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
popup?.close();
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function waitForPopupAuthorization(input) {
|
|
27
|
+
const completionKey = authorizationCompletionKey(input.storagePrefix, input.state);
|
|
28
|
+
try {
|
|
29
|
+
while (true) {
|
|
30
|
+
const completion = parseStored(input.storage.getItem(completionKey));
|
|
31
|
+
if (completion?.version === 1) {
|
|
32
|
+
input.storage.removeItem(completionKey);
|
|
33
|
+
if (completion.status === "failed") {
|
|
34
|
+
throw serverConnectError(completion.code, completion.message, {
|
|
35
|
+
details: completion.returnTo ? { return_to: completion.returnTo } : undefined
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const connection = input.connection(completion.collectionId);
|
|
39
|
+
if (!connection) {
|
|
40
|
+
throw connectError("invalid_callback", "Authorization completed without a usable saved connection.");
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
kind: "connected",
|
|
44
|
+
connection,
|
|
45
|
+
...(completion.returnTo ? { returnTo: completion.returnTo } : {})
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Cross-origin opener isolation may report a live Connect window as
|
|
49
|
+
// closed. Shared callback state, abort, or the request budget owns exit.
|
|
50
|
+
await abortableDelay(200, input.signal);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
input.popup.close();
|
|
55
|
+
input.storage.removeItem(completionKey);
|
|
56
|
+
const pendingKey = `${input.storagePrefix}:pending:${input.state}`;
|
|
57
|
+
const outstanding = parseStored(input.storage.getItem(pendingKey));
|
|
58
|
+
if (outstanding?.state === input.state) {
|
|
59
|
+
input.storage.removeItem(pendingKey);
|
|
60
|
+
if (input.pending.keyHandle)
|
|
61
|
+
await input.keyStore.delete(input.pending.keyHandle);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function publishPopupAuthorizationCompletion(input) {
|
|
66
|
+
return input.completion.then((result) => {
|
|
67
|
+
if (input.popupAttempt)
|
|
68
|
+
writeCompletion(input, {
|
|
69
|
+
version: 1,
|
|
70
|
+
status: "connected",
|
|
71
|
+
collectionId: result.connection.collectionId,
|
|
72
|
+
...(result.returnTo ? { returnTo: result.returnTo } : {})
|
|
73
|
+
});
|
|
74
|
+
if (input.popupAttempt)
|
|
75
|
+
closeCallbackWindow();
|
|
76
|
+
return result;
|
|
77
|
+
}).catch((error) => {
|
|
78
|
+
if (input.popupAttempt)
|
|
79
|
+
writeCompletion(input, {
|
|
80
|
+
version: 1,
|
|
81
|
+
status: "failed",
|
|
82
|
+
code: error instanceof MdbaseConnectError ? error.code : "invalid_callback",
|
|
83
|
+
message: error instanceof Error ? error.message : "Authorization could not be completed.",
|
|
84
|
+
...(input.pending?.returnTo ? { returnTo: input.pending.returnTo } : {})
|
|
85
|
+
});
|
|
86
|
+
if (input.popupAttempt)
|
|
87
|
+
closeCallbackWindow();
|
|
88
|
+
throw error;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function writeCompletion(input, completion) {
|
|
92
|
+
input.storage.setItem(authorizationCompletionKey(input.storagePrefix, input.state), JSON.stringify(completion));
|
|
93
|
+
}
|
|
94
|
+
function authorizationCompletionKey(storagePrefix, state) {
|
|
95
|
+
return `${storagePrefix}:completion:${state}`;
|
|
96
|
+
}
|
|
97
|
+
function closeCallbackWindow() {
|
|
98
|
+
if (typeof window !== "undefined" && typeof window.close === "function")
|
|
99
|
+
window.close();
|
|
100
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { JsonObject } from "@mdbase-dev/connect-protocol";
|
|
2
|
+
import { type CollectionQueryProblemCode, type ConnectOutcome } from "./outcomes.js";
|
|
3
|
+
import type { ConnectRequestOptions, QueryInput, QueryPage, QueryPagesOptions, QueryResult } from "./operation-types.js";
|
|
4
|
+
type QueryOperation<Frontmatter extends JsonObject> = (input: QueryInput, options?: ConnectRequestOptions) => Promise<ConnectOutcome<QueryResult<Frontmatter>, CollectionQueryProblemCode>>;
|
|
5
|
+
export declare function coordinatedQueryPages<Frontmatter extends JsonObject>(query: QueryOperation<Frontmatter>, releaseQueryCursor: (cursor: string) => Promise<void>, input?: QueryInput, options?: QueryPagesOptions<Frontmatter>): AsyncGenerator<ConnectOutcome<QueryPage<Frontmatter>, CollectionQueryProblemCode>>;
|
|
6
|
+
export {};
|