@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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +696 -0
  3. package/dist/advanced.d.ts +9 -0
  4. package/dist/advanced.js +6 -0
  5. package/dist/application-contract.d.ts +22 -0
  6. package/dist/application-contract.js +75 -0
  7. package/dist/application-identity.d.ts +34 -0
  8. package/dist/application-identity.js +148 -0
  9. package/dist/application-session.d.ts +167 -0
  10. package/dist/application-session.js +722 -0
  11. package/dist/async.d.ts +1 -0
  12. package/dist/async.js +19 -0
  13. package/dist/authority-proof.d.ts +3 -0
  14. package/dist/authority-proof.js +24 -0
  15. package/dist/authority-sync-request.d.ts +3 -0
  16. package/dist/authority-sync-request.js +20 -0
  17. package/dist/authorization-refresh.d.ts +14 -0
  18. package/dist/authorization-refresh.js +41 -0
  19. package/dist/authorization-types.d.ts +7 -0
  20. package/dist/authorization-types.js +1 -0
  21. package/dist/authorization-url.d.ts +5 -0
  22. package/dist/authorization-url.js +34 -0
  23. package/dist/base64.d.ts +3 -0
  24. package/dist/base64.js +21 -0
  25. package/dist/browser/integrity.json +4 -0
  26. package/dist/browser/mdbase-connect.min.js +3 -0
  27. package/dist/browser/mdbase-connect.min.js.sha384 +1 -0
  28. package/dist/browser.d.ts +3 -0
  29. package/dist/browser.js +5 -0
  30. package/dist/capabilities.d.ts +24 -0
  31. package/dist/capabilities.js +91 -0
  32. package/dist/collection-client.d.ts +66 -0
  33. package/dist/collection-client.js +686 -0
  34. package/dist/connect-authorization-helpers.d.ts +4 -0
  35. package/dist/connect-authorization-helpers.js +25 -0
  36. package/dist/connect-options.d.ts +35 -0
  37. package/dist/connect-options.js +1 -0
  38. package/dist/connect.d.ts +66 -0
  39. package/dist/connect.js +711 -0
  40. package/dist/connection-file-transport.d.ts +34 -0
  41. package/dist/connection-file-transport.js +85 -0
  42. package/dist/connection-index.d.ts +3 -0
  43. package/dist/connection-index.js +20 -0
  44. package/dist/connection-notifications.d.ts +31 -0
  45. package/dist/connection-notifications.js +197 -0
  46. package/dist/connection-transport-internals.d.ts +24 -0
  47. package/dist/connection-transport-internals.js +1 -0
  48. package/dist/connection-transport.d.ts +64 -0
  49. package/dist/connection-transport.js +725 -0
  50. package/dist/connection-types.d.ts +38 -0
  51. package/dist/connection-types.js +1 -0
  52. package/dist/connection.d.ts +175 -0
  53. package/dist/connection.js +606 -0
  54. package/dist/crypto-entry.d.ts +7 -0
  55. package/dist/crypto-entry.js +4 -0
  56. package/dist/crypto.d.ts +63 -0
  57. package/dist/crypto.js +409 -0
  58. package/dist/direct-access.d.ts +3 -0
  59. package/dist/direct-access.js +29 -0
  60. package/dist/errors.d.ts +45 -0
  61. package/dist/errors.js +142 -0
  62. package/dist/external-store.d.ts +10 -0
  63. package/dist/external-store.js +10 -0
  64. package/dist/file-crypto.d.ts +25 -0
  65. package/dist/file-crypto.js +132 -0
  66. package/dist/file-sha256.d.ts +12 -0
  67. package/dist/file-sha256.js +143 -0
  68. package/dist/file-stream-source.d.ts +17 -0
  69. package/dist/file-stream-source.js +157 -0
  70. package/dist/file-transfer-internals.d.ts +23 -0
  71. package/dist/file-transfer-internals.js +228 -0
  72. package/dist/files.d.ts +115 -0
  73. package/dist/files.js +563 -0
  74. package/dist/fresh-encrypted-request.d.ts +4 -0
  75. package/dist/fresh-encrypted-request.js +28 -0
  76. package/dist/grant-key-leases.d.ts +24 -0
  77. package/dist/grant-key-leases.js +144 -0
  78. package/dist/hosted-file-request.d.ts +6 -0
  79. package/dist/hosted-file-request.js +63 -0
  80. package/dist/hosted-operation-response.d.ts +5 -0
  81. package/dist/hosted-operation-response.js +26 -0
  82. package/dist/index.d.ts +27 -0
  83. package/dist/index.js +10 -0
  84. package/dist/internal-types.d.ts +100 -0
  85. package/dist/internal-types.js +1 -0
  86. package/dist/local-file-transport.d.ts +37 -0
  87. package/dist/local-file-transport.js +457 -0
  88. package/dist/mdbase-connect.d.ts +28 -0
  89. package/dist/mdbase-connect.js +53 -0
  90. package/dist/notifications.d.ts +48 -0
  91. package/dist/notifications.js +52 -0
  92. package/dist/operation-helpers.d.ts +27 -0
  93. package/dist/operation-helpers.js +144 -0
  94. package/dist/operation-types.d.ts +707 -0
  95. package/dist/operation-types.js +1 -0
  96. package/dist/outcomes.d.ts +51 -0
  97. package/dist/outcomes.js +194 -0
  98. package/dist/pending-mutation-store.d.ts +13 -0
  99. package/dist/pending-mutation-store.js +64 -0
  100. package/dist/pending-recovery-transports.d.ts +5 -0
  101. package/dist/pending-recovery-transports.js +52 -0
  102. package/dist/popup-authorization.d.ts +31 -0
  103. package/dist/popup-authorization.js +100 -0
  104. package/dist/query-pagination.d.ts +6 -0
  105. package/dist/query-pagination.js +119 -0
  106. package/dist/request-budget.d.ts +34 -0
  107. package/dist/request-budget.js +104 -0
  108. package/dist/request-coordinator.d.ts +29 -0
  109. package/dist/request-coordinator.js +213 -0
  110. package/dist/retired-grant-keys.d.ts +9 -0
  111. package/dist/retired-grant-keys.js +56 -0
  112. package/dist/runtime-utils.d.ts +52 -0
  113. package/dist/runtime-utils.js +368 -0
  114. package/dist/saved-view-pagination.d.ts +6 -0
  115. package/dist/saved-view-pagination.js +76 -0
  116. package/dist/selection.d.ts +48 -0
  117. package/dist/selection.js +112 -0
  118. package/dist/session.d.ts +114 -0
  119. package/dist/session.js +569 -0
  120. package/dist/shared-operation.d.ts +7 -0
  121. package/dist/shared-operation.js +41 -0
  122. package/dist/stored-token.d.ts +10 -0
  123. package/dist/stored-token.js +64 -0
  124. package/dist/structured-readiness.d.ts +77 -0
  125. package/dist/structured-readiness.js +126 -0
  126. package/dist/token-response.d.ts +12 -0
  127. package/dist/token-response.js +81 -0
  128. package/dist/transient-retry.d.ts +22 -0
  129. package/dist/transient-retry.js +59 -0
  130. package/dist/watch-policy.d.ts +8 -0
  131. package/dist/watch-policy.js +12 -0
  132. package/package.json +51 -0
@@ -0,0 +1,144 @@
1
+ import { isMutatingOperation, mutationFingerprint } from "@mdbase-dev/connect-protocol";
2
+ import { MdbaseConnectError, connectError, serverConnectError } from "./errors.js";
3
+ export function loopbackRequest(init) {
4
+ return { ...init, credentials: "omit", targetAddressSpace: "loopback" };
5
+ }
6
+ export async function localNetworkPermission() {
7
+ if (typeof navigator === "undefined" || !navigator.permissions?.query)
8
+ return null;
9
+ try {
10
+ const status = await navigator.permissions.query({
11
+ name: "local-network-access"
12
+ });
13
+ return status.state;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export function directFallbackStatus(status) {
20
+ return status === 404 || status === 405 || status === 426 || status >= 500;
21
+ }
22
+ export function isMutation(operation, input) {
23
+ return isMutatingOperation(operation, input);
24
+ }
25
+ export function withOperationDeadline(request, deadlineUnixMs) {
26
+ if (request.deadline_unix_ms === deadlineUnixMs)
27
+ return request;
28
+ const { deadline_unix_ms: _previousDeadline, ...identity } = request;
29
+ return {
30
+ ...identity,
31
+ ...(deadlineUnixMs === undefined ? {} : { deadline_unix_ms: deadlineUnixMs })
32
+ };
33
+ }
34
+ export function uniqueOperations(operations) {
35
+ return [...new Set(operations)];
36
+ }
37
+ export function sameAuthorization(left, right) {
38
+ if (left.grantId || right.grantId) {
39
+ return left.grantId === right.grantId
40
+ && left.keyHandle === right.keyHandle
41
+ && left.encryption?.key_id === right.encryption?.key_id;
42
+ }
43
+ return left.accessToken === right.accessToken;
44
+ }
45
+ export function throwIfCancelled(signal) {
46
+ if (!signal?.aborted)
47
+ return;
48
+ throw connectError("operation_cancelled", "The operation was cancelled before it changed the collection.", { operationOutcome: "not_sent", cause: signal.reason });
49
+ }
50
+ export function operationTransportError(error, signal, pendingRequestId, unavailableCode) {
51
+ // Problems raised before transport dispatch already describe the
52
+ // authoritative outcome. Do not overwrite them merely because an older
53
+ // pending mutation also exists in storage.
54
+ if (error instanceof MdbaseConnectError)
55
+ return error;
56
+ if (signal?.aborted) {
57
+ if (pendingRequestId)
58
+ return unknownMutationOutcome(pendingRequestId, error);
59
+ if (signal.reason instanceof MdbaseConnectError)
60
+ return signal.reason;
61
+ return connectError("operation_cancelled", "The operation was cancelled before it changed the collection.", { operationOutcome: "not_sent", cause: error });
62
+ }
63
+ if (pendingRequestId) {
64
+ return unknownMutationOutcome(pendingRequestId, error);
65
+ }
66
+ if (error instanceof TypeError) {
67
+ return connectError(unavailableCode, unavailableCode === "hosted_provider_unavailable"
68
+ ? "The hosted collection provider is unavailable."
69
+ : "The Connect relay is unavailable.", { cause: error });
70
+ }
71
+ return error instanceof Error ? error : new Error(String(error));
72
+ }
73
+ export function encryptedOperationError(problem) {
74
+ return serverConnectError(problem.code === "unknown" ? problem.server_code : problem.code, problem.message, {
75
+ details: problem.details,
76
+ operationOutcome: problem.operation_outcome ?? "rejected",
77
+ traceId: problem.trace_id
78
+ });
79
+ }
80
+ export function fetchOperationRequest(url, accessToken, proof, body, signal) {
81
+ return fetch(url, {
82
+ method: "POST",
83
+ headers: {
84
+ authorization: `Bearer ${accessToken}`,
85
+ "content-type": "application/json",
86
+ ...proof
87
+ },
88
+ body,
89
+ signal
90
+ });
91
+ }
92
+ export function isCancellation(error, signal) {
93
+ return signal?.aborted === true
94
+ || (error instanceof MdbaseConnectError && error.code === "operation_cancelled");
95
+ }
96
+ export function assertRenamePreview(input, preview) {
97
+ if (preview.dryRun !== true || preview.wouldRename !== true
98
+ || preview.from !== input.from || preview.to !== input.to) {
99
+ throw connectError("invalid_preflight", "The rename preview does not match this mutation. Run the preview again.");
100
+ }
101
+ }
102
+ export function assertDeletePreview(input, preview) {
103
+ if (preview.dryRun !== true || preview.wouldDelete !== true || preview.path !== input.path) {
104
+ throw connectError("invalid_preflight", "The delete preview does not match this mutation. Run the preview again.");
105
+ }
106
+ }
107
+ export function renameEstimate(input, preview) {
108
+ if (input.updateRefs === false) {
109
+ return { affectedRecords: 0, totalUnits: 1, warnings: 0 };
110
+ }
111
+ const references = preview.referencesAffected ?? [];
112
+ return {
113
+ affectedRecords: new Set(references.map((reference) => reference.path)).size,
114
+ totalUnits: 1 + references.length,
115
+ warnings: preview.warnings?.length ?? 0
116
+ };
117
+ }
118
+ export function deleteEstimate(preview) {
119
+ return {
120
+ affectedRecords: new Set((preview.brokenLinks ?? []).map((reference) => reference.path)).size,
121
+ totalUnits: 1,
122
+ warnings: 0
123
+ };
124
+ }
125
+ export async function operationFingerprint(operation, input) {
126
+ return mutationFingerprint(operation, input ?? {});
127
+ }
128
+ export function canonicalJson(value) {
129
+ return JSON.stringify(sortJson(value));
130
+ }
131
+ export function sortJson(value) {
132
+ if (Array.isArray(value))
133
+ return value.map((item) => sortJson(item));
134
+ if (value && typeof value === "object") {
135
+ return Object.fromEntries(Object.entries(value)
136
+ .filter(([, item]) => item !== undefined)
137
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
138
+ .map(([key, item]) => [key, sortJson(item)]));
139
+ }
140
+ return value;
141
+ }
142
+ export function unknownMutationOutcome(requestId, cause) {
143
+ 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 });
144
+ }