@tearleads/client-sdk 0.1.42 → 0.1.44

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 (224) hide show
  1. package/client/containerDocumentDiscovery.js +71 -29
  2. package/client/containerDocumentDiscovery.js.map +1 -1
  3. package/client/deviceFirst.js +4 -5
  4. package/client/deviceFirst.js.map +1 -1
  5. package/data/blobs/transferPool.js +35 -8
  6. package/data/blobs/transferPool.js.map +1 -1
  7. package/data/containers/shared/projection.js +12 -0
  8. package/data/containers/shared/projection.js.map +1 -1
  9. package/data/documents/blob/shared/types.d.ts +2 -3
  10. package/data/documents/blob/shared/types.js.map +1 -1
  11. package/data/documents/shared/events.js +0 -1
  12. package/data/documents/shared/events.js.map +1 -1
  13. package/data/persistence/container-contents/containerContentsPersistence.js +6 -22
  14. package/data/persistence/container-contents/containerContentsPersistence.js.map +1 -1
  15. package/data/persistence/container-contents/containerMetadataMutationPersistence.js +5 -15
  16. package/data/persistence/container-contents/containerMetadataMutationPersistence.js.map +1 -1
  17. package/data/persistence/container-contents/containerPendingUpdatePersistence.js +6 -15
  18. package/data/persistence/container-contents/containerPendingUpdatePersistence.js.map +1 -1
  19. package/data/persistence/container-contents/containerRecoveryPersistence.js +3 -4
  20. package/data/persistence/container-contents/containerRecoveryPersistence.js.map +1 -1
  21. package/data/persistence/container-contents/containerRemovalWork.js +3 -5
  22. package/data/persistence/container-contents/containerRemovalWork.js.map +1 -1
  23. package/data/persistence/container-contents/dormantContainerMetadata.js +1 -5
  24. package/data/persistence/container-contents/dormantContainerMetadata.js.map +1 -1
  25. package/data/persistence/containers/containerSyncWatermarkPersistence.d.ts +11 -3
  26. package/data/persistence/containers/containerSyncWatermarkPersistence.js +46 -58
  27. package/data/persistence/containers/containerSyncWatermarkPersistence.js.map +1 -1
  28. package/data/persistence/documents/documentsPersistence.js +4 -9
  29. package/data/persistence/documents/documentsPersistence.js.map +1 -1
  30. package/data/persistence/documents/internal/discardDocument.js +1 -2
  31. package/data/persistence/documents/internal/discardDocument.js.map +1 -1
  32. package/data/persistence/documents/internal/documentDeletionPersistence.js +1 -2
  33. package/data/persistence/documents/internal/documentDeletionPersistence.js.map +1 -1
  34. package/data/persistence/documents/internal/documentMutationPersistence.js +17 -25
  35. package/data/persistence/documents/internal/documentMutationPersistence.js.map +1 -1
  36. package/data/persistence/documents/internal/orphanSideRows.js +2 -14
  37. package/data/persistence/documents/internal/orphanSideRows.js.map +1 -1
  38. package/data/persistence/documents/internal/syncQueuePersistence.js +3 -3
  39. package/data/persistence/documents/internal/syncQueuePersistence.js.map +1 -1
  40. package/data/sqlite/documentHistoryPersistence.d.ts +9 -3
  41. package/data/sqlite/documentHistoryPersistence.js +31 -8
  42. package/data/sqlite/documentHistoryPersistence.js.map +1 -1
  43. package/data/sqlite/documentPendingUpdatePersistence.d.ts +58 -11
  44. package/data/sqlite/documentPendingUpdatePersistence.js +137 -63
  45. package/data/sqlite/documentPendingUpdatePersistence.js.map +1 -1
  46. package/data/sqlite/documentPersistence.d.ts +1 -1
  47. package/data/sqlite/documentPersistence.js +1 -1
  48. package/data/sqlite/documentPersistence.js.map +1 -1
  49. package/data/sqlite/documentPersistenceTypes.d.ts +2 -2
  50. package/data/sqlite/documentPersistenceTypes.js.map +1 -1
  51. package/data/sqlite/documentRecordPersistence.js +5 -4
  52. package/data/sqlite/documentRecordPersistence.js.map +1 -1
  53. package/data/sqlite/schema.d.ts +167 -517
  54. package/data/sqlite/schema.js +68 -82
  55. package/data/sqlite/schema.js.map +1 -1
  56. package/internal/api-client/ApiClient.d.ts +18 -41
  57. package/internal/api-client/ApiClient.js +9 -14
  58. package/internal/api-client/ApiClient.js.map +1 -1
  59. package/internal/api-client/apiRequestRuntime.d.ts +2 -0
  60. package/internal/api-client/apiRequestRuntime.js +4 -0
  61. package/internal/api-client/apiRequestRuntime.js.map +1 -1
  62. package/internal/api-client/binaryRequestOperationTransport.d.ts +18 -0
  63. package/internal/api-client/index.d.ts +1 -0
  64. package/internal/api-client/index.js +1 -0
  65. package/internal/api-client/index.js.map +1 -1
  66. package/internal/api-client/operationTransportFactory.d.ts +6 -0
  67. package/internal/api-client/requestInternals.js +7 -7
  68. package/internal/api-client/requestInternals.js.map +1 -1
  69. package/internal/api-client/routes/blobs/get.d.ts +7 -0
  70. package/internal/api-client/routes/blobs/get.js.map +1 -1
  71. package/internal/api-client/routes/blobs/multipart.js +1 -11
  72. package/internal/api-client/routes/blobs/multipart.js.map +1 -1
  73. package/internal/api-client/routes/blobs/multipartUpload.d.ts +14 -0
  74. package/internal/api-client/routes/blobs/multipartUpload.js +94 -43
  75. package/internal/api-client/routes/blobs/multipartUpload.js.map +1 -1
  76. package/internal/api-client/routes/containers/reads.d.ts +13 -7
  77. package/internal/api-client/routes/containers/reads.js +36 -15
  78. package/internal/api-client/routes/containers/reads.js.map +1 -1
  79. package/internal/api-client/types.d.ts +1 -5
  80. package/internal/api-client/types.js.map +1 -1
  81. package/internal/validators/containerReadRefinements.js +15 -5
  82. package/internal/validators/containerReadRefinements.js.map +1 -1
  83. package/internal/validators/containerReadSchemas.d.ts +36 -0
  84. package/internal/validators/containerReadSchemas.js +64 -1
  85. package/internal/validators/containerReadSchemas.js.map +1 -1
  86. package/internal/validators/operation/attachments.d.ts +80 -160
  87. package/internal/validators/operation/auth.d.ts +760 -1664
  88. package/internal/validators/operation/blobDownloads.js +1 -1
  89. package/internal/validators/operation/blobDownloads.js.map +1 -1
  90. package/internal/validators/operation/containerMutations.d.ts +416 -856
  91. package/internal/validators/operation/containerReads.d.ts +118 -182
  92. package/internal/validators/operation/containerReads.js +20 -54
  93. package/internal/validators/operation/containerReads.js.map +1 -1
  94. package/internal/validators/operation/documentMutations.d.ts +120 -264
  95. package/internal/validators/operation/documentSync.d.ts +40 -80
  96. package/internal/validators/operation/index.d.ts +2 -2
  97. package/internal/validators/operation/index.js +2 -2
  98. package/internal/validators/operation/index.js.map +1 -1
  99. package/internal/validators/operation/multipartBlobs.d.ts +70 -190
  100. package/internal/validators/operation/multipartBlobs.js +2 -24
  101. package/internal/validators/operation/multipartBlobs.js.map +1 -1
  102. package/internal/validators/operation/multipartPartUploads.d.ts +5 -5
  103. package/internal/validators/operation/multipartPartUploads.js +6 -20
  104. package/internal/validators/operation/multipartPartUploads.js.map +1 -1
  105. package/internal/validators/operation/organizations.d.ts +882 -1906
  106. package/internal/validators/operation/principals.d.ts +120 -240
  107. package/internal/validators/operation/registry.d.ts +3 -4
  108. package/internal/validators/operation/registry.js +3 -4
  109. package/internal/validators/operation/registry.js.map +1 -1
  110. package/internal/validators/request/blob.d.ts +100 -201
  111. package/internal/validators/request/blob.js +6 -13
  112. package/internal/validators/request/blob.js.map +1 -1
  113. package/internal/validators/request/container.d.ts +136 -272
  114. package/internal/validators/request/container.js +16 -10
  115. package/internal/validators/request/container.js.map +1 -1
  116. package/internal/validators/request/containerDocumentLanes.d.ts +23 -0
  117. package/internal/validators/request/containerDocumentLanes.js +23 -0
  118. package/internal/validators/request/containerDocumentLanes.js.map +1 -0
  119. package/internal/validators/request/containerManifestRef.d.ts +54 -0
  120. package/internal/validators/request/containerManifestRef.js +28 -0
  121. package/internal/validators/request/containerManifestRef.js.map +1 -0
  122. package/internal/validators/request/containerMetadata.d.ts +160 -368
  123. package/internal/validators/request/containerParentLanes.js +5 -35
  124. package/internal/validators/request/containerParentLanes.js.map +1 -1
  125. package/internal/validators/request/document.d.ts +100 -245
  126. package/internal/validators/request/document.js +1 -2
  127. package/internal/validators/request/document.js.map +1 -1
  128. package/internal/validators/request/documentSyncSchema.d.ts +42 -109
  129. package/internal/validators/request/documentSyncSchema.js +8 -25
  130. package/internal/validators/request/documentSyncSchema.js.map +1 -1
  131. package/internal/validators/request/index.d.ts +2 -1
  132. package/internal/validators/request/index.js +2 -1
  133. package/internal/validators/request/index.js.map +1 -1
  134. package/internal/validators/request/organization.d.ts +160 -320
  135. package/internal/validators/request/organizationProvisioning.d.ts +2424 -5312
  136. package/internal/validators/request/principal.d.ts +160 -320
  137. package/internal/validators/request/registration.d.ts +760 -1664
  138. package/internal/validators/response/blob.d.ts +48 -27
  139. package/internal/validators/response/blob.js +3 -10
  140. package/internal/validators/response/blob.js.map +1 -1
  141. package/internal/validators/response/containerDocumentLanes.d.ts +82 -0
  142. package/internal/validators/response/containerDocumentLanes.js +35 -0
  143. package/internal/validators/response/containerDocumentLanes.js.map +1 -0
  144. package/internal/validators/response/containerParentLanes.js +3 -15
  145. package/internal/validators/response/containerParentLanes.js.map +1 -1
  146. package/internal/validators/response/index.d.ts +3 -2
  147. package/internal/validators/response/index.js +2 -2
  148. package/internal/validators/response/index.js.map +1 -1
  149. package/internal/validators/util/blob.d.ts +7 -0
  150. package/internal/validators/util/blob.js +7 -0
  151. package/internal/validators/util/blob.js.map +1 -1
  152. package/internal/validators/util/blobTransferSchemas.d.ts +41 -0
  153. package/internal/validators/util/blobTransferSchemas.js +39 -0
  154. package/internal/validators/util/blobTransferSchemas.js.map +1 -0
  155. package/internal/validators/util/containerLimits.d.ts +7 -0
  156. package/internal/validators/util/containerLimits.js +7 -0
  157. package/internal/validators/util/containerLimits.js.map +1 -1
  158. package/internal/validators/util/index.d.ts +2 -1
  159. package/internal/validators/util/index.js +2 -1
  160. package/internal/validators/util/index.js.map +1 -1
  161. package/package.json +1 -1
  162. package/sync/reconciliation/knownContainerSweep.js +57 -54
  163. package/sync/reconciliation/knownContainerSweep.js.map +1 -1
  164. package/sync/reconciliation/reconcileContainer.js +49 -17
  165. package/sync/reconciliation/reconcileContainer.js.map +1 -1
  166. package/sync/reconciliation/service.js +44 -16
  167. package/sync/reconciliation/service.js.map +1 -1
  168. package/sync/reconciliation/serviceTypes.d.ts +23 -2
  169. package/sync/reconciliation/serviceTypes.js.map +1 -1
  170. package/workflows/blobs/multipartFirstParts.js +82 -0
  171. package/workflows/blobs/multipartFirstParts.js.map +1 -0
  172. package/workflows/blobs/multipartStageResolution.js +83 -0
  173. package/workflows/blobs/multipartStageResolution.js.map +1 -0
  174. package/workflows/blobs/multipartUpload.js +45 -89
  175. package/workflows/blobs/multipartUpload.js.map +1 -1
  176. package/workflows/container-contents/containerDocumentListing.js +92 -38
  177. package/workflows/container-contents/containerDocumentListing.js.map +1 -1
  178. package/workflows/container-contents/containerPersistence.d.ts +8 -2
  179. package/workflows/container-contents/containerPersistence.js +6 -7
  180. package/workflows/container-contents/containerPersistence.js.map +1 -1
  181. package/workflows/container-contents/documentDiscovery.d.ts +3 -3
  182. package/workflows/container-contents/documentDiscovery.js +24 -96
  183. package/workflows/container-contents/documentDiscovery.js.map +1 -1
  184. package/workflows/container-contents/documentDiscoveryApply.js +65 -0
  185. package/workflows/container-contents/documentDiscoveryApply.js.map +1 -0
  186. package/workflows/container-contents/documentDiscoveryLanes.js +53 -0
  187. package/workflows/container-contents/documentDiscoveryLanes.js.map +1 -0
  188. package/workflows/container-contents/documentDiscoveryTypes.d.ts +25 -19
  189. package/workflows/container-contents/documentDiscoveryTypes.js.map +1 -1
  190. package/workflows/container-contents/documentPriming.js +2 -1
  191. package/workflows/container-contents/documentPriming.js.map +1 -1
  192. package/workflows/container-contents/documentQueries/sql.js +4 -4
  193. package/workflows/container-contents/documentQueries/sql.js.map +1 -1
  194. package/workflows/container-contents/pendingWrites/deferredTails.js +6 -3
  195. package/workflows/container-contents/pendingWrites/deferredTails.js.map +1 -1
  196. package/workflows/container-contents/pendingWrites/sources.js +2 -1
  197. package/workflows/container-contents/pendingWrites/sources.js.map +1 -1
  198. package/workflows/container-contents/pendingWrites.js +2 -1
  199. package/workflows/container-contents/pendingWrites.js.map +1 -1
  200. package/workflows/container-contents/remoteHydration/laneFetchMarkers.js +11 -17
  201. package/workflows/container-contents/remoteHydration/laneFetchMarkers.js.map +1 -1
  202. package/workflows/containers/child/create.js +3 -3
  203. package/workflows/containers/child/create.js.map +1 -1
  204. package/workflows/containers/child/move.js +2 -2
  205. package/workflows/containers/child/move.js.map +1 -1
  206. package/workflows/containers/child/mutationRequestCore.js +5 -4
  207. package/workflows/containers/child/mutationRequestCore.js.map +1 -1
  208. package/workflows/containers/child/recitePlan.js +3 -2
  209. package/workflows/containers/child/recitePlan.js.map +1 -1
  210. package/workflows/containers/child/sharePlanCore.js +2 -2
  211. package/workflows/containers/child/sharePlanCore.js.map +1 -1
  212. package/workflows/containers/root/create.js +2 -2
  213. package/workflows/containers/root/create.js.map +1 -1
  214. package/workflows/registration/provisioningBootstrapBuilders.d.ts +20 -46
  215. package/workflows/sync/remoteReset.js +9 -9
  216. package/workflows/sync/remoteReset.js.map +1 -1
  217. package/workflows/sync/remoteResetCursorScope.js +10 -18
  218. package/workflows/sync/remoteResetCursorScope.js.map +1 -1
  219. package/workflows/sync/remoteResetPlans.js +6 -3
  220. package/workflows/sync/remoteResetPlans.js.map +1 -1
  221. package/workflows/sync/remoteResetScope.js +4 -11
  222. package/workflows/sync/remoteResetScope.js.map +1 -1
  223. package/internal/validators/operation/blobTransferSchemas.js +0 -11
  224. package/internal/validators/operation/blobTransferSchemas.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"apiRequestRuntime.js","sourceRoot":"","sources":["apiRequestRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n authChallengeSigningBytes,\n canonicalAuthOrigin,\n} from \"@tearleads/crypto\";\nimport {\n apiVersionHeaderName,\n parseApiVersion,\n} from \"@tearleads/validators/operation\";\nimport type { ApiRequestInstrumentation } from \"./apiRequestMetrics\";\nimport { measureApiRequest } from \"./measureApiRequest\";\nimport {\n bindPrototypeMethods,\n describeErrorResponse,\n type ErrorResponseDescription,\n errorMessage,\n hasHeader,\n isSuccessfulResponse,\n normalizeApiBaseUrl,\n requestFailureKey,\n} from \"./requestInternals\";\nimport { responseBodyFailure } from \"./responseBodyFailure\";\nimport { shouldRetryAfterSessionExpired } from \"./sessionRefresh\";\nimport { SessionRenewalTracker } from \"./sessionRenewal\";\nimport type {\n HttpMethod,\n OperationRequestFn,\n OperationRequestResultFn,\n OperationResponseRequestFn,\n RequestBody,\n RequestFailure,\n RequestFailureKind,\n RequestResult,\n RequestResultOptions,\n ResponseRequestValidationFailureInput,\n} from \"./types\";\n\ntype ExpiredHandler = () => boolean | Promise<boolean>;\ntype PaymentRequiredHandler = (organizationId: string | null) => void;\n\nexport class ApiRequestRuntime {\n private authToken: string | null = null;\n private readonly sessionRenewals = new SessionRenewalTracker(\n () => this.authToken,\n );\n private readonly baseUrl: string;\n private onError: ((message: string) => void) | null = null;\n private onNetworkError: (() => void) | null = null;\n private onNetworkSuccess: (() => void) | null = null;\n private onApiVersion: ((version: number) => void) | null = null;\n private onSessionExpired: ExpiredHandler | null = null;\n private onPaymentRequired: PaymentRequiredHandler | null = null;\n private readonly requestFailuresByKey = new Map<string, RequestFailure>();\n readonly request: OperationRequestFn;\n readonly requestResult: OperationRequestResultFn;\n readonly responseRequest: OperationResponseRequestFn;\n\n constructor(\n baseUrl?: string | null,\n private readonly instrumentation?: ApiRequestInstrumentation,\n ) {\n this.baseUrl = normalizeApiBaseUrl(baseUrl);\n bindPrototypeMethods(this, ApiRequestRuntime.prototype);\n this.request = this.makeRequest;\n this.requestResult = this.makeRequestResult;\n this.responseRequest = Object.assign(this.makeResponseRequest, {\n reportFailure: this.reportResponseRequestFailure,\n });\n }\n\n /**\n * The bytes a login challenge is signed as, bound to the API this client\n * addresses. A relative base URL resolves against the page, as its requests\n * do; with neither, there is no API origin to sign for.\n */\n authChallengeBytes(challengeHex: string, fingerprint: string): Uint8Array {\n let apiOrigin: string;\n try {\n apiOrigin = canonicalAuthOrigin(\n new URL(this.baseUrl || \"/\", globalThis.location?.href).href,\n );\n } catch {\n throw new Error(\"The API origin is unavailable for authentication\");\n }\n return authChallengeSigningBytes({ apiOrigin, challengeHex, fingerprint });\n }\n\n setOnError(handler: ((message: string) => void) | null): void {\n this.onError = handler;\n }\n\n setOnNetworkError(handler: (() => void) | null): void {\n this.onNetworkError = handler;\n }\n\n setOnNetworkSuccess(handler: (() => void) | null): void {\n this.onNetworkSuccess = handler;\n }\n\n /** Receives the build named by each response that carries one. */\n setOnApiVersion(handler: ((version: number) => void) | null): void {\n this.onApiVersion = handler;\n }\n\n setOnSessionExpired(handler: ExpiredHandler | null): void {\n this.onSessionExpired = handler;\n }\n\n setOnPaymentRequired(handler: PaymentRequiredHandler | null): void {\n this.onPaymentRequired = handler;\n }\n\n setAuthToken(token: string | null): boolean {\n const changed = this.authToken !== token;\n if (changed) this.sessionRenewals.tokenChanged();\n this.authToken = token;\n return changed;\n }\n\n getAuthToken(): string | null {\n return this.authToken;\n }\n\n getRequestFailure(input: { method: HttpMethod; path: string }) {\n return this.requestFailuresByKey.get(requestFailureKey(input)) ?? null;\n }\n\n private buildHeaders(\n body: RequestBody | undefined,\n headers: Record<string, string> | undefined,\n authToken: string | null,\n ): Record<string, string> {\n return {\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n ...(typeof body === \"string\" && !hasHeader(headers, \"Content-Type\")\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n ...headers,\n };\n }\n\n private async makeRequest<T>(\n path: string,\n validator: (value: unknown) => value is T,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions | undefined,\n failureOperation: Parameters<OperationRequestFn>[5],\n ): Promise<T | null> {\n const result = await this.makeRequestResult(\n path,\n validator,\n method,\n body,\n options,\n failureOperation,\n );\n return result.ok ? result.data : null;\n }\n\n private requestFailure(input: {\n code?: string | undefined;\n kind: RequestFailureKind;\n message: string;\n method: HttpMethod;\n path: string;\n reportErrors: boolean;\n requiredContainerIds?: RequestFailure[\"requiredContainerIds\"];\n stalePrincipalHeads: RequestFailure[\"stalePrincipalHeads\"];\n status: number | null;\n statusText: string;\n }): RequestFailure {\n const failure: RequestFailure = {\n ...(input.code === undefined ? {} : { code: input.code }),\n kind: input.kind,\n message: input.message,\n method: input.method,\n ok: false,\n path: input.path,\n report: () => {\n if (input.kind !== \"cancelled\") this.onError?.(input.message);\n },\n status: input.status,\n statusText: input.statusText,\n ...(input.stalePrincipalHeads\n ? { stalePrincipalHeads: input.stalePrincipalHeads }\n : {}),\n ...(input.requiredContainerIds\n ? { requiredContainerIds: input.requiredContainerIds }\n : {}),\n };\n this.requestFailuresByKey.set(\n requestFailureKey({ method: input.method, path: input.path }),\n failure,\n );\n\n if (input.reportErrors) {\n failure.report();\n }\n\n return failure;\n }\n\n private async makeRequestResult<T>(\n path: string,\n validator: (value: unknown) => value is T,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions = {},\n failureOperation: Parameters<OperationRequestFn>[5],\n ): Promise<RequestResult<T>> {\n const responseResult = await this.makeResponseRequest(\n path,\n method,\n body,\n options,\n [],\n failureOperation,\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const response = responseResult.data;\n const reportErrors = options.reportErrors ?? true;\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n const failure = responseBodyFailure(error, errorMessage(error));\n if (failure.kind === \"network\") {\n this.onNetworkError?.();\n }\n return this.requestFailure({\n kind: failure.kind,\n message: `${method} ${path}: ${failure.message}`,\n method,\n path,\n reportErrors,\n stalePrincipalHeads: undefined,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n if (!validator(data)) {\n return this.requestFailure({\n kind: \"shape\",\n message: `Invalid response shape for ${path}`,\n method,\n path,\n reportErrors,\n stalePrincipalHeads: undefined,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n return { data, ok: true };\n }\n\n private async makeResponseRequest(\n path: string,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions = {},\n additionalSuccessStatuses: readonly number[],\n failureOperation: Parameters<OperationResponseRequestFn>[5],\n ): Promise<RequestResult<Response>> {\n const authToken = this.authToken;\n const responseResult = await this.fetchResponseRequest(\n path,\n method,\n body,\n options,\n authToken,\n failureOperation,\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n const response = responseResult.data;\n if (isSuccessfulResponse(response, additionalSuccessStatuses)) {\n this.requestFailuresByKey.delete(requestFailureKey({ method, path }));\n return { data: response, ok: true };\n }\n\n const errorDescription = await describeErrorResponse(\n response,\n failureOperation,\n options.expectedPaymentRequiredOrganizationId,\n );\n const shouldRetry = await shouldRetryAfterSessionExpired({\n authToken,\n body,\n code: errorDescription.code,\n getCurrentAuthToken: () => this.authToken,\n isKnownSessionRenewal: (from, to) =>\n this.sessionRenewals.isKnown(from, to),\n pendingSessionRenewal: (from) => this.sessionRenewals.pending(from),\n options,\n refreshSession: () => this.sessionRenewals.renew(this.onSessionExpired),\n reportError: (message) => this.onError?.(message),\n responseStatus: response.status,\n });\n const retryAuthToken = this.sessionRenewals.currentToken(authToken);\n // Recheck after the awaited helper and the host's renewal notification.\n if (shouldRetry && retryAuthToken) {\n if (options.retryOnSessionExpired === \"renew-only\")\n return this.httpFailure({\n errorDescription,\n failureOperation,\n method,\n options: {\n ...options,\n reportErrors: method === \"GET\" ? false : options.reportErrors,\n },\n path,\n response,\n });\n const retryResult = await this.fetchResponseRequest(\n path,\n method,\n body,\n options,\n retryAuthToken,\n failureOperation,\n );\n if (!retryResult.ok) return retryResult;\n const retryResponse = retryResult.data;\n if (isSuccessfulResponse(retryResponse, additionalSuccessStatuses)) {\n this.requestFailuresByKey.delete(requestFailureKey({ method, path }));\n return { data: retryResponse, ok: true };\n }\n\n return this.httpFailure({\n errorDescription: await describeErrorResponse(\n retryResponse,\n failureOperation,\n options.expectedPaymentRequiredOrganizationId,\n ),\n failureOperation,\n method,\n options,\n path,\n response: retryResponse,\n });\n }\n\n return this.httpFailure({\n errorDescription,\n failureOperation,\n method,\n options,\n path,\n response,\n });\n }\n\n private async fetchResponseRequest(\n path: string,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions,\n authToken: string | null,\n operation: Parameters<OperationResponseRequestFn>[5],\n ): Promise<RequestResult<Response>> {\n const reportErrors = options.reportErrors ?? true;\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: this.buildHeaders(body, options.headers, authToken),\n ...(options.signal ? { signal: options.signal } : {}),\n };\n if (body !== undefined) {\n init.body = body;\n if (body instanceof ReadableStream) {\n init.duplex = \"half\";\n }\n }\n\n let response: Response;\n try {\n response = await measureApiRequest(\n this.instrumentation,\n operation,\n () => fetch(`${this.baseUrl}${path}`, init),\n options.signal,\n );\n } catch (error) {\n const cancelled = options.signal?.aborted === true;\n if (!cancelled) this.onNetworkError?.();\n return this.requestFailure({\n ...(cancelled ? { code: \"request_aborted\" } : {}),\n kind: cancelled ? \"cancelled\" : \"network\",\n message: `${method} ${path}: ${errorMessage(error)}`,\n method,\n path,\n reportErrors: cancelled ? false : reportErrors,\n stalePrincipalHeads: undefined,\n status: null,\n statusText: \"\",\n });\n }\n\n this.onNetworkSuccess?.();\n const apiVersion = parseApiVersion(\n response.headers.get(apiVersionHeaderName),\n );\n if (apiVersion !== null) this.onApiVersion?.(apiVersion);\n return { data: response, ok: true };\n }\n\n private httpFailure(input: {\n readonly errorDescription: ErrorResponseDescription;\n readonly failureOperation: Parameters<OperationResponseRequestFn>[5];\n readonly method: HttpMethod;\n readonly options: RequestResultOptions;\n readonly path: string;\n readonly response: Response;\n }): RequestFailure {\n const cancelled = input.options.signal?.aborted === true;\n const reportErrors = input.options.reportErrors ?? true;\n if (\n !cancelled &&\n input.response.status === 402 &&\n input.failureOperation.failureResponses?.[402] &&\n input.errorDescription.paymentRequiredOrganizationId !== undefined &&\n input.errorDescription.paymentRequiredOrganizationId ===\n input.options.expectedPaymentRequiredOrganizationId\n ) {\n this.onPaymentRequired?.(\n input.errorDescription.paymentRequiredOrganizationId,\n );\n }\n return this.requestFailure({\n ...(cancelled\n ? { code: \"request_aborted\" }\n : input.errorDescription.code === null\n ? {}\n : { code: input.errorDescription.code }),\n kind: cancelled ? \"cancelled\" : \"http\",\n message: `${input.method} ${input.path}: ${input.response.status} ${input.response.statusText}${input.errorDescription.detail}`,\n method: input.method,\n path: input.path,\n reportErrors: !cancelled && reportErrors,\n requiredContainerIds: input.errorDescription.requiredContainerIds,\n stalePrincipalHeads: input.errorDescription.stalePrincipalHeads,\n status: input.response.status,\n statusText: input.response.statusText,\n });\n }\n\n private reportResponseRequestFailure(\n input: ResponseRequestValidationFailureInput,\n ): RequestFailure {\n if (input.kind === \"network\") {\n this.onNetworkError?.();\n }\n return this.requestFailure({\n ...input,\n reportErrors: input.options?.reportErrors ?? true,\n stalePrincipalHeads: undefined,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"apiRequestRuntime.js","sourceRoot":"","sources":["apiRequestRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n authChallengeSigningBytes,\n canonicalAuthOrigin,\n} from \"@tearleads/crypto\";\nimport {\n apiVersionHeaderName,\n parseApiVersion,\n} from \"@tearleads/validators/operation\";\nimport type { ApiRequestInstrumentation } from \"./apiRequestMetrics\";\nimport { measureApiRequest } from \"./measureApiRequest\";\nimport {\n bindPrototypeMethods,\n describeErrorResponse,\n type ErrorResponseDescription,\n errorMessage,\n hasHeader,\n isSuccessfulResponse,\n normalizeApiBaseUrl,\n requestFailureKey,\n} from \"./requestInternals\";\nimport { responseBodyFailure } from \"./responseBodyFailure\";\nimport { shouldRetryAfterSessionExpired } from \"./sessionRefresh\";\nimport { SessionRenewalTracker } from \"./sessionRenewal\";\nimport type {\n HttpMethod,\n OperationRequestFn,\n OperationRequestResultFn,\n OperationResponseRequestFn,\n RequestBody,\n RequestFailure,\n RequestFailureKind,\n RequestResult,\n RequestResultOptions,\n ResponseRequestValidationFailureInput,\n} from \"./types\";\n\ntype ExpiredHandler = () => boolean | Promise<boolean>;\ntype PaymentRequiredHandler = (organizationId: string | null) => void;\n\nexport class ApiRequestRuntime {\n private authToken: string | null = null;\n private readonly sessionRenewals = new SessionRenewalTracker(\n () => this.authToken,\n );\n private readonly baseUrl: string;\n private onError: ((message: string) => void) | null = null;\n private onNetworkError: (() => void) | null = null;\n private onNetworkSuccess: (() => void) | null = null;\n private onApiVersion: ((version: number) => void) | null = null;\n private onSessionExpired: ExpiredHandler | null = null;\n private onPaymentRequired: PaymentRequiredHandler | null = null;\n private readonly requestFailuresByKey = new Map<string, RequestFailure>();\n readonly request: OperationRequestFn;\n readonly requestResult: OperationRequestResultFn;\n readonly responseRequest: OperationResponseRequestFn;\n\n constructor(\n baseUrl?: string | null,\n private readonly instrumentation?: ApiRequestInstrumentation,\n ) {\n this.baseUrl = normalizeApiBaseUrl(baseUrl);\n bindPrototypeMethods(this, ApiRequestRuntime.prototype);\n this.request = this.makeRequest;\n this.requestResult = this.makeRequestResult;\n this.responseRequest = Object.assign(this.makeResponseRequest, {\n reportFailure: this.reportResponseRequestFailure,\n });\n }\n\n /**\n * The bytes a login challenge is signed as, bound to the API this client\n * addresses. A relative base URL resolves against the page, as its requests\n * do; with neither, there is no API origin to sign for.\n */\n authChallengeBytes(challengeHex: string, fingerprint: string): Uint8Array {\n let apiOrigin: string;\n try {\n apiOrigin = canonicalAuthOrigin(\n new URL(this.baseUrl || \"/\", globalThis.location?.href).href,\n );\n } catch {\n throw new Error(\"The API origin is unavailable for authentication\");\n }\n return authChallengeSigningBytes({ apiOrigin, challengeHex, fingerprint });\n }\n\n setOnError(handler: ((message: string) => void) | null): void {\n this.onError = handler;\n }\n\n /** Reports a failure carried inside a successful batched response. */\n reportError(message: string): void {\n this.onError?.(message);\n }\n\n setOnNetworkError(handler: (() => void) | null): void {\n this.onNetworkError = handler;\n }\n\n setOnNetworkSuccess(handler: (() => void) | null): void {\n this.onNetworkSuccess = handler;\n }\n\n /** Receives the build named by each response that carries one. */\n setOnApiVersion(handler: ((version: number) => void) | null): void {\n this.onApiVersion = handler;\n }\n\n setOnSessionExpired(handler: ExpiredHandler | null): void {\n this.onSessionExpired = handler;\n }\n\n setOnPaymentRequired(handler: PaymentRequiredHandler | null): void {\n this.onPaymentRequired = handler;\n }\n\n setAuthToken(token: string | null): boolean {\n const changed = this.authToken !== token;\n if (changed) this.sessionRenewals.tokenChanged();\n this.authToken = token;\n return changed;\n }\n\n getAuthToken(): string | null {\n return this.authToken;\n }\n\n getRequestFailure(input: { method: HttpMethod; path: string }) {\n return this.requestFailuresByKey.get(requestFailureKey(input)) ?? null;\n }\n\n private buildHeaders(\n body: RequestBody | undefined,\n headers: Record<string, string> | undefined,\n authToken: string | null,\n ): Record<string, string> {\n return {\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n ...(typeof body === \"string\" && !hasHeader(headers, \"Content-Type\")\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n ...headers,\n };\n }\n\n private async makeRequest<T>(\n path: string,\n validator: (value: unknown) => value is T,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions | undefined,\n failureOperation: Parameters<OperationRequestFn>[5],\n ): Promise<T | null> {\n const result = await this.makeRequestResult(\n path,\n validator,\n method,\n body,\n options,\n failureOperation,\n );\n return result.ok ? result.data : null;\n }\n\n private requestFailure(input: {\n code?: string | undefined;\n kind: RequestFailureKind;\n message: string;\n method: HttpMethod;\n path: string;\n reportErrors: boolean;\n requiredContainerIds?: RequestFailure[\"requiredContainerIds\"];\n stalePrincipalHeads: RequestFailure[\"stalePrincipalHeads\"];\n status: number | null;\n statusText: string;\n }): RequestFailure {\n const failure: RequestFailure = {\n ...(input.code === undefined ? {} : { code: input.code }),\n kind: input.kind,\n message: input.message,\n method: input.method,\n ok: false,\n path: input.path,\n report: () => {\n if (input.kind !== \"cancelled\") this.onError?.(input.message);\n },\n status: input.status,\n statusText: input.statusText,\n ...(input.stalePrincipalHeads\n ? { stalePrincipalHeads: input.stalePrincipalHeads }\n : {}),\n ...(input.requiredContainerIds\n ? { requiredContainerIds: input.requiredContainerIds }\n : {}),\n };\n this.requestFailuresByKey.set(\n requestFailureKey({ method: input.method, path: input.path }),\n failure,\n );\n\n if (input.reportErrors) {\n failure.report();\n }\n\n return failure;\n }\n\n private async makeRequestResult<T>(\n path: string,\n validator: (value: unknown) => value is T,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions = {},\n failureOperation: Parameters<OperationRequestFn>[5],\n ): Promise<RequestResult<T>> {\n const responseResult = await this.makeResponseRequest(\n path,\n method,\n body,\n options,\n [],\n failureOperation,\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const response = responseResult.data;\n const reportErrors = options.reportErrors ?? true;\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n const failure = responseBodyFailure(error, errorMessage(error));\n if (failure.kind === \"network\") {\n this.onNetworkError?.();\n }\n return this.requestFailure({\n kind: failure.kind,\n message: `${method} ${path}: ${failure.message}`,\n method,\n path,\n reportErrors,\n stalePrincipalHeads: undefined,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n if (!validator(data)) {\n return this.requestFailure({\n kind: \"shape\",\n message: `Invalid response shape for ${path}`,\n method,\n path,\n reportErrors,\n stalePrincipalHeads: undefined,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n return { data, ok: true };\n }\n\n private async makeResponseRequest(\n path: string,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions = {},\n additionalSuccessStatuses: readonly number[],\n failureOperation: Parameters<OperationResponseRequestFn>[5],\n ): Promise<RequestResult<Response>> {\n const authToken = this.authToken;\n const responseResult = await this.fetchResponseRequest(\n path,\n method,\n body,\n options,\n authToken,\n failureOperation,\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n const response = responseResult.data;\n if (isSuccessfulResponse(response, additionalSuccessStatuses)) {\n this.requestFailuresByKey.delete(requestFailureKey({ method, path }));\n return { data: response, ok: true };\n }\n\n const errorDescription = await describeErrorResponse(\n response,\n failureOperation,\n options.expectedPaymentRequiredOrganizationId,\n );\n const shouldRetry = await shouldRetryAfterSessionExpired({\n authToken,\n body,\n code: errorDescription.code,\n getCurrentAuthToken: () => this.authToken,\n isKnownSessionRenewal: (from, to) =>\n this.sessionRenewals.isKnown(from, to),\n pendingSessionRenewal: (from) => this.sessionRenewals.pending(from),\n options,\n refreshSession: () => this.sessionRenewals.renew(this.onSessionExpired),\n reportError: (message) => this.onError?.(message),\n responseStatus: response.status,\n });\n const retryAuthToken = this.sessionRenewals.currentToken(authToken);\n // Recheck after the awaited helper and the host's renewal notification.\n if (shouldRetry && retryAuthToken) {\n if (options.retryOnSessionExpired === \"renew-only\")\n return this.httpFailure({\n errorDescription,\n failureOperation,\n method,\n options: {\n ...options,\n reportErrors: method === \"GET\" ? false : options.reportErrors,\n },\n path,\n response,\n });\n const retryResult = await this.fetchResponseRequest(\n path,\n method,\n body,\n options,\n retryAuthToken,\n failureOperation,\n );\n if (!retryResult.ok) return retryResult;\n const retryResponse = retryResult.data;\n if (isSuccessfulResponse(retryResponse, additionalSuccessStatuses)) {\n this.requestFailuresByKey.delete(requestFailureKey({ method, path }));\n return { data: retryResponse, ok: true };\n }\n\n return this.httpFailure({\n errorDescription: await describeErrorResponse(\n retryResponse,\n failureOperation,\n options.expectedPaymentRequiredOrganizationId,\n ),\n failureOperation,\n method,\n options,\n path,\n response: retryResponse,\n });\n }\n\n return this.httpFailure({\n errorDescription,\n failureOperation,\n method,\n options,\n path,\n response,\n });\n }\n\n private async fetchResponseRequest(\n path: string,\n method: HttpMethod,\n body: RequestBody | undefined,\n options: RequestResultOptions,\n authToken: string | null,\n operation: Parameters<OperationResponseRequestFn>[5],\n ): Promise<RequestResult<Response>> {\n const reportErrors = options.reportErrors ?? true;\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: this.buildHeaders(body, options.headers, authToken),\n ...(options.signal ? { signal: options.signal } : {}),\n };\n if (body !== undefined) {\n init.body = body;\n if (body instanceof ReadableStream) {\n init.duplex = \"half\";\n }\n }\n\n let response: Response;\n try {\n response = await measureApiRequest(\n this.instrumentation,\n operation,\n () => fetch(`${this.baseUrl}${path}`, init),\n options.signal,\n );\n } catch (error) {\n const cancelled = options.signal?.aborted === true;\n if (!cancelled) this.onNetworkError?.();\n return this.requestFailure({\n ...(cancelled ? { code: \"request_aborted\" } : {}),\n kind: cancelled ? \"cancelled\" : \"network\",\n message: `${method} ${path}: ${errorMessage(error)}`,\n method,\n path,\n reportErrors: cancelled ? false : reportErrors,\n stalePrincipalHeads: undefined,\n status: null,\n statusText: \"\",\n });\n }\n\n this.onNetworkSuccess?.();\n const apiVersion = parseApiVersion(\n response.headers.get(apiVersionHeaderName),\n );\n if (apiVersion !== null) this.onApiVersion?.(apiVersion);\n return { data: response, ok: true };\n }\n\n private httpFailure(input: {\n readonly errorDescription: ErrorResponseDescription;\n readonly failureOperation: Parameters<OperationResponseRequestFn>[5];\n readonly method: HttpMethod;\n readonly options: RequestResultOptions;\n readonly path: string;\n readonly response: Response;\n }): RequestFailure {\n const cancelled = input.options.signal?.aborted === true;\n const reportErrors = input.options.reportErrors ?? true;\n if (\n !cancelled &&\n input.response.status === 402 &&\n input.failureOperation.failureResponses?.[402] &&\n input.errorDescription.paymentRequiredOrganizationId !== undefined &&\n input.errorDescription.paymentRequiredOrganizationId ===\n input.options.expectedPaymentRequiredOrganizationId\n ) {\n this.onPaymentRequired?.(\n input.errorDescription.paymentRequiredOrganizationId,\n );\n }\n return this.requestFailure({\n ...(cancelled\n ? { code: \"request_aborted\" }\n : input.errorDescription.code === null\n ? {}\n : { code: input.errorDescription.code }),\n kind: cancelled ? \"cancelled\" : \"http\",\n message: `${input.method} ${input.path}: ${input.response.status} ${input.response.statusText}${input.errorDescription.detail}`,\n method: input.method,\n path: input.path,\n reportErrors: !cancelled && reportErrors,\n requiredContainerIds: input.errorDescription.requiredContainerIds,\n stalePrincipalHeads: input.errorDescription.stalePrincipalHeads,\n status: input.response.status,\n statusText: input.response.statusText,\n });\n }\n\n private reportResponseRequestFailure(\n input: ResponseRequestValidationFailureInput,\n ): RequestFailure {\n if (input.kind === \"network\") {\n this.onNetworkError?.();\n }\n return this.requestFailure({\n ...input,\n reportErrors: input.options?.reportErrors ?? true,\n stalePrincipalHeads: undefined,\n });\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { BinaryBodySchema } from "../validators/operation/index.js";
2
+ import { type JsonOperationResponse, type JsonOperationResponseEnvelope, type JsonResponseOperation } from "./operationResponse.js";
3
+ import { type OperationRequestInput } from "./operationTransport.js";
4
+ import type { OperationResponseRequestFn, RequestResult, RequestResultOptions } from "./types.js";
5
+ export interface BinaryRequestOperation extends JsonResponseOperation {
6
+ readonly body: typeof BinaryBodySchema;
7
+ readonly requestMediaType: "application/octet-stream";
8
+ }
9
+ export interface BinaryRequestOperationOptions extends RequestResultOptions {
10
+ readonly encodeBody: (body: Blob | BufferSource) => BodyInit;
11
+ }
12
+ export interface BinaryRequestOperationTransport {
13
+ requestBinaryRequest<Operation extends BinaryRequestOperation>(operation: Operation, input: OperationRequestInput<Operation>, options: BinaryRequestOperationOptions): Promise<JsonOperationResponse<Operation> | null>;
14
+ requestBinaryRequestResult<Operation extends BinaryRequestOperation>(operation: Operation, input: OperationRequestInput<Operation>, options: BinaryRequestOperationOptions): Promise<RequestResult<JsonOperationResponse<Operation>>>;
15
+ requestBinaryRequestResponse<Operation extends BinaryRequestOperation>(operation: Operation, input: OperationRequestInput<Operation>, options: BinaryRequestOperationOptions): Promise<JsonOperationResponseEnvelope<Operation> | null>;
16
+ requestBinaryRequestResponseResult<Operation extends BinaryRequestOperation>(operation: Operation, input: OperationRequestInput<Operation>, options: BinaryRequestOperationOptions): Promise<RequestResult<JsonOperationResponseEnvelope<Operation>>>;
17
+ }
18
+ export declare function createBinaryRequestOperationTransport(responseRequest: OperationResponseRequestFn): BinaryRequestOperationTransport;
@@ -3,5 +3,6 @@ export { type ApiRequestCounts, type ApiRequestEndpointCounts, ApiRequestMetrics
3
3
  export type { PrincipalPolicyPageCurrent, PrincipalPolicyPageReadOptions, PrincipalPolicyPageResume, } from "./principalPolicyPages.js";
4
4
  export type { ProjectionPolicyHistoryReadOptions } from "./projectionPolicyHistoryPages.js";
5
5
  export type { BlobBytesResponse, UploadMultipartBlobPartBytesRequest, } from "./routes/blobs/get.js";
6
+ export { describeMultipartBlobPart } from "./routes/blobs/multipartUpload.js";
6
7
  export type { HttpMethod, ListDocumentEditAttributionRangesOptions, RequestFailure, RequestFailureKind, RequestResult, RequestResultOptions, RequestSuccess, } from "./types.js";
7
8
  export type { VerifiedManifestCitations, WriterProjectionTarget, } from "./verifiedManifestCitations.js";
@@ -1,3 +1,4 @@
1
1
  export { ApiClient } from "./ApiClient.js";
2
2
  export { ApiRequestMetrics, } from "./apiRequestMetrics.js";
3
+ export { describeMultipartBlobPart } from "./routes/blobs/multipartUpload.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAGL,iBAAiB,GAElB,MAAM,qBAAqB,CAAC","sourcesContent":["export { ApiClient } from \"./ApiClient\";\nexport {\n type ApiRequestCounts,\n type ApiRequestEndpointCounts,\n ApiRequestMetrics,\n type ApiRequestMetricsSnapshot,\n} from \"./apiRequestMetrics\";\nexport type {\n PrincipalPolicyPageCurrent,\n PrincipalPolicyPageReadOptions,\n PrincipalPolicyPageResume,\n} from \"./principalPolicyPages\";\nexport type { ProjectionPolicyHistoryReadOptions } from \"./projectionPolicyHistoryPages\";\nexport type {\n BlobBytesResponse,\n UploadMultipartBlobPartBytesRequest,\n} from \"./routes/blobs/get\";\nexport type {\n HttpMethod,\n ListDocumentEditAttributionRangesOptions,\n RequestFailure,\n RequestFailureKind,\n RequestResult,\n RequestResultOptions,\n RequestSuccess,\n} from \"./types\";\nexport type {\n VerifiedManifestCitations,\n WriterProjectionTarget,\n} from \"./verifiedManifestCitations\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAGL,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { ApiClient } from \"./ApiClient\";\nexport {\n type ApiRequestCounts,\n type ApiRequestEndpointCounts,\n ApiRequestMetrics,\n type ApiRequestMetricsSnapshot,\n} from \"./apiRequestMetrics\";\nexport type {\n PrincipalPolicyPageCurrent,\n PrincipalPolicyPageReadOptions,\n PrincipalPolicyPageResume,\n} from \"./principalPolicyPages\";\nexport type { ProjectionPolicyHistoryReadOptions } from \"./projectionPolicyHistoryPages\";\nexport type {\n BlobBytesResponse,\n UploadMultipartBlobPartBytesRequest,\n} from \"./routes/blobs/get\";\nexport { describeMultipartBlobPart } from \"./routes/blobs/multipartUpload\";\nexport type {\n HttpMethod,\n ListDocumentEditAttributionRangesOptions,\n RequestFailure,\n RequestFailureKind,\n RequestResult,\n RequestResultOptions,\n RequestSuccess,\n} from \"./types\";\nexport type {\n VerifiedManifestCitations,\n WriterProjectionTarget,\n} from \"./verifiedManifestCitations\";\n"]}
@@ -0,0 +1,6 @@
1
+ import { type BinaryRequestOperationTransport } from "./binaryRequestOperationTransport.js";
2
+ import { type BinaryResponseOperationTransport } from "./binaryResponseOperationTransport.js";
3
+ import { type JsonOperationTransport } from "./operationTransport.js";
4
+ import type { OperationResponseRequestFn } from "./types.js";
5
+ export type OperationTransport = BinaryRequestOperationTransport & JsonOperationTransport & BinaryResponseOperationTransport & Pick<OperationResponseRequestFn, "reportFailure">;
6
+ export declare function createOperationTransport(responseRequest: OperationResponseRequestFn): OperationTransport;
@@ -154,13 +154,13 @@ export function listContainerParentLanesRequestKey(input) {
154
154
  watermark: syncWatermarkRequestKey(lane.watermark),
155
155
  })));
156
156
  }
157
- export function listContainerDocumentsRequestKey(containerId, options = {}) {
158
- const { watermark, ...rest } = options;
159
- return JSON.stringify({
160
- containerId,
161
- ...rest,
162
- watermark: syncWatermarkRequestKey(watermark),
163
- });
157
+ export function listContainerDocumentLanesRequestKey(input) {
158
+ return JSON.stringify(input.lanes.map((lane) => ({
159
+ containerId: lane.containerId,
160
+ laneId: lane.laneId,
161
+ limit: lane.limit ?? null,
162
+ watermark: syncWatermarkRequestKey(lane.watermark),
163
+ })));
164
164
  }
165
165
  export function cachedRequest(cache, cacheKey, request) {
166
166
  const cached = cache.get(cacheKey);
@@ -1 +1 @@
1
- {"version":3,"file":"requestInternals.js","sourceRoot":"","sources":["requestInternals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HttpOperation } from \"@tearleads/validators/operation\";\nimport type { ListContainerParentLanesRequest } from \"@tearleads/validators/request\";\nimport type {\n DocumentSyncResponse,\n DocumentWriterProjectionResponse,\n ReferencedPrincipalStateResponse,\n SyncWatermark,\n} from \"@tearleads/validators/response\";\nimport {\n CONTAINER_MUTATION_ERROR_CODES,\n ContainerMutationFailureResponseSchema,\n DocumentSyncErrorResponseSchema,\n isDocumentSyncStateStaleErrorResponse,\n isPaymentRequiredErrorResponse,\n isPrincipalPolicyStaleErrorResponse,\n PaymentRequiredErrorResponseSchema,\n SESSION_ERROR_CODES,\n} from \"@tearleads/validators/response\";\nimport { MAX_ROTATION_CONTAINER_REKEYS } from \"@tearleads/validators/util\";\nimport type { ListContainerDocumentsOptions, RequestBody } from \"./types\";\n\n/**\n * True when a sync response advances the document's write material past what a\n * cached/primed writer projection holds, so the projection must be re-fetched\n * before the next write. Compares the content-key bundle and KEK target hashes\n * the projection authorizes against the ones the server just committed.\n */\nfunction documentSyncInvalidatesWriterProjection(\n projection: DocumentWriterProjectionResponse,\n response: DocumentSyncResponse,\n): boolean {\n return (\n projection.contentKeyBundle?.contentKeyEpoch !==\n response.contentKeyBundle?.contentKeyEpoch ||\n projection.contentKeyBundle?.linkSetManifestHash !==\n response.contentKeyBundle?.linkSetManifestHash ||\n projection.contentKeyBundle?.targetHash !==\n response.contentKeyBundle?.targetHash ||\n projection.documentKekTargets?.linkSetManifestHash !==\n response.documentKekTargets?.linkSetManifestHash ||\n projection.documentKekTargets?.documentKeyTargetHash !==\n response.documentKekTargets?.documentKeyTargetHash\n );\n}\n\n/**\n * Evict a cached/primed document writer projection iff the just-committed sync\n * response moved its write material. Re-checks the cache slot after awaiting so\n * a concurrent invalidation or refetch is not clobbered. `onEvicted` fires\n * whenever an invalidation is issued, so callers can invalidate parallel\n * bookkeeping (e.g. an in-flight result fetch that predates the sync).\n */\nexport async function evictWriterProjectionIfSyncChanged(\n cache: RequestCache<DocumentWriterProjectionResponse>,\n documentId: string,\n response: DocumentSyncResponse,\n onEvicted?: () => void,\n): Promise<void> {\n const cached = cache.get(documentId);\n if (!cached) {\n // No cached projection to compare against, so whether the sync moved the\n // write material is undecidable here — but a concurrent in-flight GET may\n // still predate it. Invalidate conservatively: deleting the (absent) slot\n // bumps the cache's eviction generation so such a fetch's success is not\n // cached, and onEvicted drops a shared in-flight result entry. The cost\n // when nothing is in flight is a skipped cache warm, never wrong data.\n cache.delete(documentId);\n onEvicted?.();\n return;\n }\n const projection = await cached.catch(() => null);\n if (cache.get(documentId) !== cached || !projection) {\n return;\n }\n if (documentSyncInvalidatesWriterProjection(projection, response)) {\n cache.delete(documentId);\n onEvicted?.();\n }\n}\n\nexport interface ErrorResponseDescription {\n readonly code: string | null;\n readonly detail: string;\n readonly error: string | null;\n readonly stalePrincipalHeads?: ReferencedPrincipalStateResponse[] | undefined;\n /** Descendant rekeys a refused rotation must carry, parent-first. */\n readonly requiredContainerIds?: readonly string[] | undefined;\n /** Set on a 402 body — the organization whose billing blocked the sync write. */\n readonly paymentRequiredOrganizationId?: string | undefined;\n}\n\nconst emptyErrorResponseDescription: ErrorResponseDescription = {\n code: null,\n detail: \"\",\n error: null,\n};\n\nconst invalidErrorResponseDescription: ErrorResponseDescription = {\n ...emptyErrorResponseDescription,\n detail: \": Invalid failure response body\",\n};\n\nfunction validatedFailureCode(\n value: object,\n schema: NonNullable<HttpOperation[\"failureResponses\"]>[number] | undefined,\n): string | null {\n if (\n !schema ||\n !(\"code\" in value) ||\n typeof value.code !== \"string\" ||\n value.code.length === 0\n ) {\n return null;\n }\n\n // Loose object schemas retain extension keys. A code is behavior-bearing\n // only when changing that field to an unregistered value breaks the selected\n // status schema, proving that the schema constrains rather than merely\n // preserves it.\n const unregisteredCode = `${value.code}\\u0000unregistered`;\n return schema.safeParse({ ...value, code: unregisteredCode }).success\n ? null\n : value.code;\n}\n\nfunction parsedErrorResponseDescription(\n value: unknown,\n schema?: NonNullable<HttpOperation[\"failureResponses\"]>[number],\n): ErrorResponseDescription | null {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"error\" in value) ||\n typeof value.error !== \"string\"\n ) {\n return null;\n }\n\n const error = value.error.trim();\n const code = validatedFailureCode(value, schema);\n if (error.length === 0 && code === null) {\n return null;\n }\n return {\n code,\n detail: error.length === 0 ? \"\" : `: ${error}`,\n error: error.length === 0 ? null : error,\n // Container mutations and document sync with inline container rekeys can\n // carry advisory heads whose signed evidence can be recovered in pages.\n ...(schema === ContainerMutationFailureResponseSchema &&\n isPrincipalPolicyStaleErrorResponse(value)\n ? { stalePrincipalHeads: value.principalHeads }\n : schema === DocumentSyncErrorResponseSchema &&\n isDocumentSyncStateStaleErrorResponse(value) &&\n value.principalHeads !== undefined\n ? { stalePrincipalHeads: value.principalHeads }\n : {}),\n ...((code === CONTAINER_MUTATION_ERROR_CODES.descendantRekeysRequired ||\n code === CONTAINER_MUTATION_ERROR_CODES.descendantRekeysInaccessible) &&\n \"requiredContainerIds\" in value &&\n Array.isArray(value.requiredContainerIds) &&\n value.requiredContainerIds.length <= MAX_ROTATION_CONTAINER_REKEYS &&\n value.requiredContainerIds.every(\n (containerId: unknown): containerId is string =>\n typeof containerId === \"string\" && containerId.length > 0,\n )\n ? { requiredContainerIds: value.requiredContainerIds }\n : {}),\n // Sync-write 402s carry the target org for the billing prompt.\n ...(schema === PaymentRequiredErrorResponseSchema &&\n isPaymentRequiredErrorResponse(value)\n ? { paymentRequiredOrganizationId: value.organizationId }\n : {}),\n };\n}\n\nexport function bindPrototypeMethods(\n instance: object,\n prototype: object,\n): void {\n for (const propertyName of Object.getOwnPropertyNames(prototype)) {\n if (propertyName === \"constructor\") {\n continue;\n }\n\n const property = Reflect.get(prototype, propertyName);\n if (typeof property === \"function\") {\n Reflect.set(instance, propertyName, property.bind(instance));\n }\n }\n}\n\nexport function normalizeApiBaseUrl(\n baseUrl: string | null | undefined,\n): string {\n const trimmed = (baseUrl ?? \"\").trim();\n if (trimmed === \"\" || trimmed === \"/\") {\n return \"\";\n }\n\n // Scan from the end to avoid regex backtracking over internal slash runs.\n let end = trimmed.length;\n while (end > 0 && trimmed[end - 1] === \"/\") {\n end -= 1;\n }\n return trimmed.slice(0, end);\n}\n\nexport function hasHeader(\n headers: Record<string, string> | undefined,\n name: string,\n): boolean {\n const normalizedName = name.toLowerCase();\n return Object.keys(headers ?? {}).some(\n (headerName) => headerName.toLowerCase() === normalizedName,\n );\n}\n\nexport function requestFailureKey(input: {\n method: string;\n path: string;\n}): string {\n return `${input.method}\\u0000${input.path}`;\n}\n\nfunction syncWatermarkRequestKey(\n watermark: SyncWatermark | null | undefined,\n): string {\n return watermark ? `${watermark.updatedAt}\\u0000${watermark.id}` : \"\";\n}\n\nexport function listContainerParentLanesRequestKey(\n input: ListContainerParentLanesRequest,\n): string {\n return JSON.stringify(\n input.lanes.map((lane) => ({\n laneId: lane.laneId,\n limit: lane.limit ?? null,\n parentId: lane.parentId,\n watermark: syncWatermarkRequestKey(lane.watermark),\n })),\n );\n}\n\nexport function listContainerDocumentsRequestKey(\n containerId: string,\n options: ListContainerDocumentsOptions = {},\n): string {\n const { watermark, ...rest } = options;\n return JSON.stringify({\n containerId,\n ...rest,\n watermark: syncWatermarkRequestKey(watermark),\n });\n}\n\n/**\n * Minimal cache surface shared by `Map` and `ApiCache.BoundedCache`, so the\n * request helpers work with either backing store.\n */\ninterface RequestCache<T> {\n get(key: string): Promise<T | null> | undefined;\n has(key: string): boolean;\n set(key: string, value: Promise<T | null>): unknown;\n delete(key: string): unknown;\n}\n\nexport function cachedRequest<T>(\n cache: RequestCache<T>,\n cacheKey: string,\n request: () => Promise<T | null>,\n): Promise<T | null> {\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n let pending: Promise<T | null>;\n pending = request()\n .then((response) => {\n if (!response && cache.get(cacheKey) === pending) {\n cache.delete(cacheKey);\n }\n return response;\n })\n .catch((error: unknown) => {\n if (cache.get(cacheKey) === pending) {\n cache.delete(cacheKey);\n }\n throw error;\n });\n cache.set(cacheKey, pending);\n return pending;\n}\n\nexport function dedupedRequest<T>(\n cache: RequestCache<T>,\n cacheKey: string,\n request: () => Promise<T | null>,\n): Promise<T | null> {\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n let pending: Promise<T | null>;\n pending = request().finally(() => {\n if (cache.get(cacheKey) === pending) {\n cache.delete(cacheKey);\n }\n });\n cache.set(cacheKey, pending);\n return pending;\n}\n\nexport function isReplayableRequestBody(\n body: RequestBody | undefined,\n): boolean {\n return !(\n typeof ReadableStream === \"function\" && body instanceof ReadableStream\n );\n}\n\nexport function isSuccessfulResponse(\n response: Response,\n additionalSuccessStatuses: readonly number[],\n): boolean {\n return response.ok || additionalSuccessStatuses.includes(response.status);\n}\n\nfunction validatePaymentRequiredTarget(\n schema: NonNullable<HttpOperation[\"failureResponses\"]>[number] | undefined,\n parsed: unknown,\n expectedOrganizationId: string | undefined,\n): { readonly invalid: boolean; readonly organizationId?: string } {\n if (schema !== PaymentRequiredErrorResponseSchema) {\n return { invalid: false };\n }\n if (\n !isPaymentRequiredErrorResponse(parsed) ||\n (expectedOrganizationId !== undefined &&\n parsed.organizationId !== expectedOrganizationId)\n ) {\n return { invalid: true };\n }\n return { invalid: false, organizationId: parsed.organizationId };\n}\n\nfunction paymentRequiredDescription(\n organizationId: string | undefined,\n): ErrorResponseDescription | null {\n return organizationId === undefined\n ? null\n : {\n ...emptyErrorResponseDescription,\n paymentRequiredOrganizationId: organizationId,\n };\n}\n\nexport async function describeErrorResponse(\n response: Response,\n operation?: HttpOperation,\n expectedPaymentRequiredOrganizationId?: string,\n): Promise<ErrorResponseDescription> {\n const schema = operation?.failureResponses?.[response.status];\n if (operation && !schema) {\n // A cloned response can wait for its other branch to finish cancelling.\n // Cleanup must not delay reporting an already-invalid status.\n void response.body?.cancel().catch(() => {});\n return invalidErrorResponseDescription;\n }\n let responseText = \"\";\n\n try {\n responseText = (await response.text()).trim();\n } catch {\n return operation\n ? invalidErrorResponseDescription\n : emptyErrorResponseDescription;\n }\n\n if (responseText.length === 0) {\n return operation\n ? invalidErrorResponseDescription\n : emptyErrorResponseDescription;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n return operation\n ? invalidErrorResponseDescription\n : { ...emptyErrorResponseDescription, detail: `: ${responseText}` };\n }\n\n if (schema) {\n const result = schema.safeParse(parsed);\n if (!result.success) {\n return invalidErrorResponseDescription;\n }\n parsed = result.data;\n }\n\n const paymentTarget = validatePaymentRequiredTarget(\n schema,\n parsed,\n expectedPaymentRequiredOrganizationId,\n );\n if (paymentTarget.invalid) {\n return invalidErrorResponseDescription;\n }\n\n const description =\n parsedErrorResponseDescription(parsed, schema) ??\n paymentRequiredDescription(paymentTarget.organizationId);\n if (description) {\n return description;\n }\n\n return operation\n ? emptyErrorResponseDescription\n : { ...emptyErrorResponseDescription, detail: `: ${responseText}` };\n}\n\nexport function isRefreshableSessionError(\n status: number,\n code: string | null,\n): boolean {\n return status === 401 && code === SESSION_ERROR_CODES.refreshRequired;\n}\n\nexport function errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n // `instanceof Error` fails for errors thrown across realms (web workers,\n // serialized payloads); fall back to a duck-typed string `message`.\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n return String(error);\n}\n"]}
1
+ {"version":3,"file":"requestInternals.js","sourceRoot":"","sources":["requestInternals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HttpOperation } from \"@tearleads/validators/operation\";\nimport type {\n ListContainerDocumentLanesRequest,\n ListContainerParentLanesRequest,\n} from \"@tearleads/validators/request\";\nimport type {\n DocumentSyncResponse,\n DocumentWriterProjectionResponse,\n ReferencedPrincipalStateResponse,\n SyncWatermark,\n} from \"@tearleads/validators/response\";\nimport {\n CONTAINER_MUTATION_ERROR_CODES,\n ContainerMutationFailureResponseSchema,\n DocumentSyncErrorResponseSchema,\n isDocumentSyncStateStaleErrorResponse,\n isPaymentRequiredErrorResponse,\n isPrincipalPolicyStaleErrorResponse,\n PaymentRequiredErrorResponseSchema,\n SESSION_ERROR_CODES,\n} from \"@tearleads/validators/response\";\nimport { MAX_ROTATION_CONTAINER_REKEYS } from \"@tearleads/validators/util\";\nimport type { RequestBody } from \"./types\";\n\n/**\n * True when a sync response advances the document's write material past what a\n * cached/primed writer projection holds, so the projection must be re-fetched\n * before the next write. Compares the content-key bundle and KEK target hashes\n * the projection authorizes against the ones the server just committed.\n */\nfunction documentSyncInvalidatesWriterProjection(\n projection: DocumentWriterProjectionResponse,\n response: DocumentSyncResponse,\n): boolean {\n return (\n projection.contentKeyBundle?.contentKeyEpoch !==\n response.contentKeyBundle?.contentKeyEpoch ||\n projection.contentKeyBundle?.linkSetManifestHash !==\n response.contentKeyBundle?.linkSetManifestHash ||\n projection.contentKeyBundle?.targetHash !==\n response.contentKeyBundle?.targetHash ||\n projection.documentKekTargets?.linkSetManifestHash !==\n response.documentKekTargets?.linkSetManifestHash ||\n projection.documentKekTargets?.documentKeyTargetHash !==\n response.documentKekTargets?.documentKeyTargetHash\n );\n}\n\n/**\n * Evict a cached/primed document writer projection iff the just-committed sync\n * response moved its write material. Re-checks the cache slot after awaiting so\n * a concurrent invalidation or refetch is not clobbered. `onEvicted` fires\n * whenever an invalidation is issued, so callers can invalidate parallel\n * bookkeeping (e.g. an in-flight result fetch that predates the sync).\n */\nexport async function evictWriterProjectionIfSyncChanged(\n cache: RequestCache<DocumentWriterProjectionResponse>,\n documentId: string,\n response: DocumentSyncResponse,\n onEvicted?: () => void,\n): Promise<void> {\n const cached = cache.get(documentId);\n if (!cached) {\n // No cached projection to compare against, so whether the sync moved the\n // write material is undecidable here — but a concurrent in-flight GET may\n // still predate it. Invalidate conservatively: deleting the (absent) slot\n // bumps the cache's eviction generation so such a fetch's success is not\n // cached, and onEvicted drops a shared in-flight result entry. The cost\n // when nothing is in flight is a skipped cache warm, never wrong data.\n cache.delete(documentId);\n onEvicted?.();\n return;\n }\n const projection = await cached.catch(() => null);\n if (cache.get(documentId) !== cached || !projection) {\n return;\n }\n if (documentSyncInvalidatesWriterProjection(projection, response)) {\n cache.delete(documentId);\n onEvicted?.();\n }\n}\n\nexport interface ErrorResponseDescription {\n readonly code: string | null;\n readonly detail: string;\n readonly error: string | null;\n readonly stalePrincipalHeads?: ReferencedPrincipalStateResponse[] | undefined;\n /** Descendant rekeys a refused rotation must carry, parent-first. */\n readonly requiredContainerIds?: readonly string[] | undefined;\n /** Set on a 402 body — the organization whose billing blocked the sync write. */\n readonly paymentRequiredOrganizationId?: string | undefined;\n}\n\nconst emptyErrorResponseDescription: ErrorResponseDescription = {\n code: null,\n detail: \"\",\n error: null,\n};\n\nconst invalidErrorResponseDescription: ErrorResponseDescription = {\n ...emptyErrorResponseDescription,\n detail: \": Invalid failure response body\",\n};\n\nfunction validatedFailureCode(\n value: object,\n schema: NonNullable<HttpOperation[\"failureResponses\"]>[number] | undefined,\n): string | null {\n if (\n !schema ||\n !(\"code\" in value) ||\n typeof value.code !== \"string\" ||\n value.code.length === 0\n ) {\n return null;\n }\n\n // Loose object schemas retain extension keys. A code is behavior-bearing\n // only when changing that field to an unregistered value breaks the selected\n // status schema, proving that the schema constrains rather than merely\n // preserves it.\n const unregisteredCode = `${value.code}\\u0000unregistered`;\n return schema.safeParse({ ...value, code: unregisteredCode }).success\n ? null\n : value.code;\n}\n\nfunction parsedErrorResponseDescription(\n value: unknown,\n schema?: NonNullable<HttpOperation[\"failureResponses\"]>[number],\n): ErrorResponseDescription | null {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"error\" in value) ||\n typeof value.error !== \"string\"\n ) {\n return null;\n }\n\n const error = value.error.trim();\n const code = validatedFailureCode(value, schema);\n if (error.length === 0 && code === null) {\n return null;\n }\n return {\n code,\n detail: error.length === 0 ? \"\" : `: ${error}`,\n error: error.length === 0 ? null : error,\n // Container mutations and document sync with inline container rekeys can\n // carry advisory heads whose signed evidence can be recovered in pages.\n ...(schema === ContainerMutationFailureResponseSchema &&\n isPrincipalPolicyStaleErrorResponse(value)\n ? { stalePrincipalHeads: value.principalHeads }\n : schema === DocumentSyncErrorResponseSchema &&\n isDocumentSyncStateStaleErrorResponse(value) &&\n value.principalHeads !== undefined\n ? { stalePrincipalHeads: value.principalHeads }\n : {}),\n ...((code === CONTAINER_MUTATION_ERROR_CODES.descendantRekeysRequired ||\n code === CONTAINER_MUTATION_ERROR_CODES.descendantRekeysInaccessible) &&\n \"requiredContainerIds\" in value &&\n Array.isArray(value.requiredContainerIds) &&\n value.requiredContainerIds.length <= MAX_ROTATION_CONTAINER_REKEYS &&\n value.requiredContainerIds.every(\n (containerId: unknown): containerId is string =>\n typeof containerId === \"string\" && containerId.length > 0,\n )\n ? { requiredContainerIds: value.requiredContainerIds }\n : {}),\n // Sync-write 402s carry the target org for the billing prompt.\n ...(schema === PaymentRequiredErrorResponseSchema &&\n isPaymentRequiredErrorResponse(value)\n ? { paymentRequiredOrganizationId: value.organizationId }\n : {}),\n };\n}\n\nexport function bindPrototypeMethods(\n instance: object,\n prototype: object,\n): void {\n for (const propertyName of Object.getOwnPropertyNames(prototype)) {\n if (propertyName === \"constructor\") {\n continue;\n }\n\n const property = Reflect.get(prototype, propertyName);\n if (typeof property === \"function\") {\n Reflect.set(instance, propertyName, property.bind(instance));\n }\n }\n}\n\nexport function normalizeApiBaseUrl(\n baseUrl: string | null | undefined,\n): string {\n const trimmed = (baseUrl ?? \"\").trim();\n if (trimmed === \"\" || trimmed === \"/\") {\n return \"\";\n }\n\n // Scan from the end to avoid regex backtracking over internal slash runs.\n let end = trimmed.length;\n while (end > 0 && trimmed[end - 1] === \"/\") {\n end -= 1;\n }\n return trimmed.slice(0, end);\n}\n\nexport function hasHeader(\n headers: Record<string, string> | undefined,\n name: string,\n): boolean {\n const normalizedName = name.toLowerCase();\n return Object.keys(headers ?? {}).some(\n (headerName) => headerName.toLowerCase() === normalizedName,\n );\n}\n\nexport function requestFailureKey(input: {\n method: string;\n path: string;\n}): string {\n return `${input.method}\\u0000${input.path}`;\n}\n\nfunction syncWatermarkRequestKey(\n watermark: SyncWatermark | null | undefined,\n): string {\n return watermark ? `${watermark.updatedAt}\\u0000${watermark.id}` : \"\";\n}\n\nexport function listContainerParentLanesRequestKey(\n input: ListContainerParentLanesRequest,\n): string {\n return JSON.stringify(\n input.lanes.map((lane) => ({\n laneId: lane.laneId,\n limit: lane.limit ?? null,\n parentId: lane.parentId,\n watermark: syncWatermarkRequestKey(lane.watermark),\n })),\n );\n}\n\nexport function listContainerDocumentLanesRequestKey(\n input: ListContainerDocumentLanesRequest,\n): string {\n return JSON.stringify(\n input.lanes.map((lane) => ({\n containerId: lane.containerId,\n laneId: lane.laneId,\n limit: lane.limit ?? null,\n watermark: syncWatermarkRequestKey(lane.watermark),\n })),\n );\n}\n\n/**\n * Minimal cache surface shared by `Map` and `ApiCache.BoundedCache`, so the\n * request helpers work with either backing store.\n */\ninterface RequestCache<T> {\n get(key: string): Promise<T | null> | undefined;\n has(key: string): boolean;\n set(key: string, value: Promise<T | null>): unknown;\n delete(key: string): unknown;\n}\n\nexport function cachedRequest<T>(\n cache: RequestCache<T>,\n cacheKey: string,\n request: () => Promise<T | null>,\n): Promise<T | null> {\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n let pending: Promise<T | null>;\n pending = request()\n .then((response) => {\n if (!response && cache.get(cacheKey) === pending) {\n cache.delete(cacheKey);\n }\n return response;\n })\n .catch((error: unknown) => {\n if (cache.get(cacheKey) === pending) {\n cache.delete(cacheKey);\n }\n throw error;\n });\n cache.set(cacheKey, pending);\n return pending;\n}\n\nexport function dedupedRequest<T>(\n cache: RequestCache<T>,\n cacheKey: string,\n request: () => Promise<T | null>,\n): Promise<T | null> {\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n let pending: Promise<T | null>;\n pending = request().finally(() => {\n if (cache.get(cacheKey) === pending) {\n cache.delete(cacheKey);\n }\n });\n cache.set(cacheKey, pending);\n return pending;\n}\n\nexport function isReplayableRequestBody(\n body: RequestBody | undefined,\n): boolean {\n return !(\n typeof ReadableStream === \"function\" && body instanceof ReadableStream\n );\n}\n\nexport function isSuccessfulResponse(\n response: Response,\n additionalSuccessStatuses: readonly number[],\n): boolean {\n return response.ok || additionalSuccessStatuses.includes(response.status);\n}\n\nfunction validatePaymentRequiredTarget(\n schema: NonNullable<HttpOperation[\"failureResponses\"]>[number] | undefined,\n parsed: unknown,\n expectedOrganizationId: string | undefined,\n): { readonly invalid: boolean; readonly organizationId?: string } {\n if (schema !== PaymentRequiredErrorResponseSchema) {\n return { invalid: false };\n }\n if (\n !isPaymentRequiredErrorResponse(parsed) ||\n (expectedOrganizationId !== undefined &&\n parsed.organizationId !== expectedOrganizationId)\n ) {\n return { invalid: true };\n }\n return { invalid: false, organizationId: parsed.organizationId };\n}\n\nfunction paymentRequiredDescription(\n organizationId: string | undefined,\n): ErrorResponseDescription | null {\n return organizationId === undefined\n ? null\n : {\n ...emptyErrorResponseDescription,\n paymentRequiredOrganizationId: organizationId,\n };\n}\n\nexport async function describeErrorResponse(\n response: Response,\n operation?: HttpOperation,\n expectedPaymentRequiredOrganizationId?: string,\n): Promise<ErrorResponseDescription> {\n const schema = operation?.failureResponses?.[response.status];\n if (operation && !schema) {\n // A cloned response can wait for its other branch to finish cancelling.\n // Cleanup must not delay reporting an already-invalid status.\n void response.body?.cancel().catch(() => {});\n return invalidErrorResponseDescription;\n }\n let responseText = \"\";\n\n try {\n responseText = (await response.text()).trim();\n } catch {\n return operation\n ? invalidErrorResponseDescription\n : emptyErrorResponseDescription;\n }\n\n if (responseText.length === 0) {\n return operation\n ? invalidErrorResponseDescription\n : emptyErrorResponseDescription;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(responseText);\n } catch {\n return operation\n ? invalidErrorResponseDescription\n : { ...emptyErrorResponseDescription, detail: `: ${responseText}` };\n }\n\n if (schema) {\n const result = schema.safeParse(parsed);\n if (!result.success) {\n return invalidErrorResponseDescription;\n }\n parsed = result.data;\n }\n\n const paymentTarget = validatePaymentRequiredTarget(\n schema,\n parsed,\n expectedPaymentRequiredOrganizationId,\n );\n if (paymentTarget.invalid) {\n return invalidErrorResponseDescription;\n }\n\n const description =\n parsedErrorResponseDescription(parsed, schema) ??\n paymentRequiredDescription(paymentTarget.organizationId);\n if (description) {\n return description;\n }\n\n return operation\n ? emptyErrorResponseDescription\n : { ...emptyErrorResponseDescription, detail: `: ${responseText}` };\n}\n\nexport function isRefreshableSessionError(\n status: number,\n code: string | null,\n): boolean {\n return status === 401 && code === SESSION_ERROR_CODES.refreshRequired;\n}\n\nexport function errorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n // `instanceof Error` fails for errors thrown across realms (web workers,\n // serialized payloads); fall back to a duck-typed string `message`.\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n return String(error);\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { MultipartBlobPartUploadSource } from "../../../validators/util/index.js";
1
2
  import type { BinaryResponseOperationTransport } from "../../binaryResponseOperationTransport.js";
2
3
  import type { JsonOperationTransport } from "../../operationTransport.js";
3
4
  import type { OperationResponseRequestFn, RequestResultOptions } from "../../types.js";
@@ -11,6 +12,12 @@ export interface UploadMultipartBlobPartBytesRequest {
11
12
  readonly byteLength: number;
12
13
  readonly encryptedBytes: Blob | BufferSource;
13
14
  readonly sha256: string;
15
+ /**
16
+ * An upload source the stage initiation already issued for this part. The
17
+ * first attempt uses it instead of authorizing; a failed attempt still
18
+ * reauthorizes once, exactly as when no source was issued.
19
+ */
20
+ readonly source?: MultipartBlobPartUploadSource | undefined;
14
21
  readonly uploadId: string;
15
22
  }
16
23
  type BlobDownloadTransport = Pick<JsonOperationTransport, "requestResult"> & Pick<BinaryResponseOperationTransport, "requestBinaryResponse"> & Pick<OperationResponseRequestFn, "reportFailure">;
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","sourceRoot":"","sources":["get.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n blobWireHeaderKeys,\n getBlobBytesOperation,\n getBlobDownloadOperation,\n} from \"@tearleads/validators/operation\";\nimport type { BinaryResponseOperationTransport } from \"../../binaryResponseOperationTransport\";\nimport type { JsonOperationTransport } from \"../../operationTransport\";\nimport type {\n OperationResponseRequestFn,\n RequestResultOptions,\n} from \"../../types\";\nimport { storageFetchOptions } from \"./storageFetchOptions\";\n\nexport interface BlobBytesResponse {\n readonly blobId: string;\n readonly byteLength: number;\n readonly encryptedBytes: ReadableStream<Uint8Array>;\n readonly sha256: string;\n}\n\nexport interface UploadMultipartBlobPartBytesRequest {\n readonly byteLength: number;\n readonly encryptedBytes: Blob | BufferSource;\n readonly sha256: string;\n readonly uploadId: string;\n}\n\ntype BlobDownloadTransport = Pick<JsonOperationTransport, \"requestResult\"> &\n Pick<BinaryResponseOperationTransport, \"requestBinaryResponse\"> &\n Pick<OperationResponseRequestFn, \"reportFailure\">;\n\ntype DownloadFetch = (url: string, init: RequestInit) => Promise<Response>;\n\nexport async function getBlobBytes(\n transport: BlobDownloadTransport,\n blobId: string,\n downloadFetch: DownloadFetch = (url, init) => fetch(url, init),\n options: RequestResultOptions = {},\n): Promise<BlobBytesResponse | null> {\n // Refresh at most once. R2 expiration errors can appear as CORS/network\n // failures in browsers, so both rejected fetches and 403s need a fresh URL.\n for (let attempt = 0; attempt < 2; attempt += 1) {\n if (options.signal?.aborted) return null;\n const result = await transport.requestResult(\n getBlobDownloadOperation,\n { params: { blobId } },\n { ...options, reportErrors: false },\n );\n if (!result.ok) {\n if (result.kind === \"http\" && result.status === 404) {\n return getBlobStream(transport, blobId, options);\n }\n result.report();\n return null;\n }\n const descriptor = result.data;\n if (descriptor.blobId !== blobId) {\n transport.reportFailure({\n kind: \"shape\",\n method: \"GET\",\n path: `/blobs/${blobId}/download`,\n status: 200,\n statusText: \"\",\n message: `Blob ${blobId} download descriptor has the wrong identity`,\n });\n return null;\n }\n if (descriptor.source.kind === \"api\") {\n return getBlobStream(transport, blobId, options);\n }\n try {\n // Never send the application's session or cookies to the object store.\n // Reject redirects and keep bearer URLs out of referrers and errors.\n const response = await downloadFetch(\n descriptor.source.url,\n storageFetchOptions(options),\n );\n if (response.status !== 200) {\n await response.body?.cancel().catch(() => {});\n if (response.status === 403) {\n continue;\n }\n break;\n }\n return await signedBlobResponse(descriptor, response);\n } catch {\n // The downstream SDK still verifies length, hash and authenticated\n // encryption. An error after streaming begins propagates to that reader.\n }\n }\n // Preserve downloads when storage is unreachable or a native HTTP bridge\n // cannot use the signed URL. This endpoint checks current access again.\n // A storage failure alone must not signal that the API is offline.\n return getBlobStream(transport, blobId, options);\n}\n\nasync function signedBlobResponse(\n descriptor: Pick<BlobBytesResponse, \"blobId\" | \"byteLength\" | \"sha256\">,\n response: Response,\n): Promise<BlobBytesResponse> {\n return {\n blobId: descriptor.blobId,\n byteLength: descriptor.byteLength,\n sha256: descriptor.sha256,\n encryptedBytes: response.body\n ? signedDownloadBodyStream(response.body)\n : bufferedResponseBodyStream(await response.arrayBuffer()),\n };\n}\n\nfunction signedDownloadBodyStream(\n stream: ReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n // Native network errors may contain the bearer URL. Keep failures generic\n // before downstream readers log them, without buffering or eager reads.\n return new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n reader.releaseLock();\n } else {\n controller.enqueue(value);\n }\n } catch {\n controller.error(new Error(\"Blob download interrupted\"));\n reader.releaseLock();\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } catch {\n throw new Error(\"Blob download cancellation failed\");\n } finally {\n reader.releaseLock();\n }\n },\n },\n { highWaterMark: 0 },\n );\n}\n\nasync function getBlobStream(\n transport: Pick<BinaryResponseOperationTransport, \"requestBinaryResponse\">,\n blobId: string,\n options: RequestResultOptions,\n): Promise<BlobBytesResponse | null> {\n if (options.signal?.aborted) return null;\n const result = await transport.requestBinaryResponse(\n getBlobBytesOperation,\n {\n params: { blobId },\n },\n options,\n );\n if (!result) {\n return null;\n }\n\n const { headers, response } = result;\n const byteLength = Number(headers[blobWireHeaderKeys.blobByteLength]);\n\n // On the browser / WKWebView-fetch path the body is streamed, so\n // `response.body` is a live ReadableStream. Under a native HTTP bridge\n // (CapacitorHttp — which the Capacitor iOS/Android builds enable so cross-origin\n // API requests reach the backend at all; the WKWebView's own fetch fails from\n // the app's https://localhost origin) the response is buffered natively and\n // `response.body` is null even for a valid 200. So take the bytes either way:\n // the stream when present, otherwise buffer the response and re-wrap it as a\n // one-shot ReadableStream so callers keep a single streaming interface. This\n // does not weaken validation — a truncated or corrupted body is still caught\n // downstream by the X-Tearleads-Blob-Sha256 integrity check; it only stops a\n // buffered-but-valid response from being rejected here as malformed.\n const encryptedBytes =\n response.body ?? bufferedResponseBodyStream(await response.arrayBuffer());\n\n return {\n blobId: headers[blobWireHeaderKeys.blobId],\n byteLength,\n encryptedBytes,\n sha256: headers[blobWireHeaderKeys.blobSha256],\n };\n}\n\n// Wraps a fully-buffered response body as a single-chunk ReadableStream, so a\n// native HTTP bridge that only exposes the buffered bytes (no WHATWG\n// `response.body` stream) can still satisfy the streaming\n// `BlobBytesResponse.encryptedBytes` contract. An empty buffer yields an\n// immediately-closed, zero-chunk stream.\nfunction bufferedResponseBodyStream(\n buffer: ArrayBuffer,\n): ReadableStream<Uint8Array> {\n const bytes = new Uint8Array(buffer);\n return new ReadableStream<Uint8Array>({\n start(controller) {\n if (bytes.byteLength > 0) {\n controller.enqueue(bytes);\n }\n controller.close();\n },\n });\n}\n"]}
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["get.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n blobWireHeaderKeys,\n getBlobBytesOperation,\n getBlobDownloadOperation,\n} from \"@tearleads/validators/operation\";\nimport type { MultipartBlobPartUploadSource } from \"@tearleads/validators/util\";\nimport type { BinaryResponseOperationTransport } from \"../../binaryResponseOperationTransport\";\nimport type { JsonOperationTransport } from \"../../operationTransport\";\nimport type {\n OperationResponseRequestFn,\n RequestResultOptions,\n} from \"../../types\";\nimport { storageFetchOptions } from \"./storageFetchOptions\";\n\nexport interface BlobBytesResponse {\n readonly blobId: string;\n readonly byteLength: number;\n readonly encryptedBytes: ReadableStream<Uint8Array>;\n readonly sha256: string;\n}\n\nexport interface UploadMultipartBlobPartBytesRequest {\n readonly byteLength: number;\n readonly encryptedBytes: Blob | BufferSource;\n readonly sha256: string;\n /**\n * An upload source the stage initiation already issued for this part. The\n * first attempt uses it instead of authorizing; a failed attempt still\n * reauthorizes once, exactly as when no source was issued.\n */\n readonly source?: MultipartBlobPartUploadSource | undefined;\n readonly uploadId: string;\n}\n\ntype BlobDownloadTransport = Pick<JsonOperationTransport, \"requestResult\"> &\n Pick<BinaryResponseOperationTransport, \"requestBinaryResponse\"> &\n Pick<OperationResponseRequestFn, \"reportFailure\">;\n\ntype DownloadFetch = (url: string, init: RequestInit) => Promise<Response>;\n\nexport async function getBlobBytes(\n transport: BlobDownloadTransport,\n blobId: string,\n downloadFetch: DownloadFetch = (url, init) => fetch(url, init),\n options: RequestResultOptions = {},\n): Promise<BlobBytesResponse | null> {\n // Refresh at most once. R2 expiration errors can appear as CORS/network\n // failures in browsers, so both rejected fetches and 403s need a fresh URL.\n for (let attempt = 0; attempt < 2; attempt += 1) {\n if (options.signal?.aborted) return null;\n const result = await transport.requestResult(\n getBlobDownloadOperation,\n { params: { blobId } },\n { ...options, reportErrors: false },\n );\n if (!result.ok) {\n if (result.kind === \"http\" && result.status === 404) {\n return getBlobStream(transport, blobId, options);\n }\n result.report();\n return null;\n }\n const descriptor = result.data;\n if (descriptor.blobId !== blobId) {\n transport.reportFailure({\n kind: \"shape\",\n method: \"GET\",\n path: `/blobs/${blobId}/download`,\n status: 200,\n statusText: \"\",\n message: `Blob ${blobId} download descriptor has the wrong identity`,\n });\n return null;\n }\n if (descriptor.source.kind === \"api\") {\n return getBlobStream(transport, blobId, options);\n }\n try {\n // Never send the application's session or cookies to the object store.\n // Reject redirects and keep bearer URLs out of referrers and errors.\n const response = await downloadFetch(\n descriptor.source.url,\n storageFetchOptions(options),\n );\n if (response.status !== 200) {\n await response.body?.cancel().catch(() => {});\n if (response.status === 403) {\n continue;\n }\n break;\n }\n return await signedBlobResponse(descriptor, response);\n } catch {\n // The downstream SDK still verifies length, hash and authenticated\n // encryption. An error after streaming begins propagates to that reader.\n }\n }\n // Preserve downloads when storage is unreachable or a native HTTP bridge\n // cannot use the signed URL. This endpoint checks current access again.\n // A storage failure alone must not signal that the API is offline.\n return getBlobStream(transport, blobId, options);\n}\n\nasync function signedBlobResponse(\n descriptor: Pick<BlobBytesResponse, \"blobId\" | \"byteLength\" | \"sha256\">,\n response: Response,\n): Promise<BlobBytesResponse> {\n return {\n blobId: descriptor.blobId,\n byteLength: descriptor.byteLength,\n sha256: descriptor.sha256,\n encryptedBytes: response.body\n ? signedDownloadBodyStream(response.body)\n : bufferedResponseBodyStream(await response.arrayBuffer()),\n };\n}\n\nfunction signedDownloadBodyStream(\n stream: ReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n // Native network errors may contain the bearer URL. Keep failures generic\n // before downstream readers log them, without buffering or eager reads.\n return new ReadableStream<Uint8Array>(\n {\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n reader.releaseLock();\n } else {\n controller.enqueue(value);\n }\n } catch {\n controller.error(new Error(\"Blob download interrupted\"));\n reader.releaseLock();\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } catch {\n throw new Error(\"Blob download cancellation failed\");\n } finally {\n reader.releaseLock();\n }\n },\n },\n { highWaterMark: 0 },\n );\n}\n\nasync function getBlobStream(\n transport: Pick<BinaryResponseOperationTransport, \"requestBinaryResponse\">,\n blobId: string,\n options: RequestResultOptions,\n): Promise<BlobBytesResponse | null> {\n if (options.signal?.aborted) return null;\n const result = await transport.requestBinaryResponse(\n getBlobBytesOperation,\n {\n params: { blobId },\n },\n options,\n );\n if (!result) {\n return null;\n }\n\n const { headers, response } = result;\n const byteLength = Number(headers[blobWireHeaderKeys.blobByteLength]);\n\n // On the browser / WKWebView-fetch path the body is streamed, so\n // `response.body` is a live ReadableStream. Under a native HTTP bridge\n // (CapacitorHttp — which the Capacitor iOS/Android builds enable so cross-origin\n // API requests reach the backend at all; the WKWebView's own fetch fails from\n // the app's https://localhost origin) the response is buffered natively and\n // `response.body` is null even for a valid 200. So take the bytes either way:\n // the stream when present, otherwise buffer the response and re-wrap it as a\n // one-shot ReadableStream so callers keep a single streaming interface. This\n // does not weaken validation — a truncated or corrupted body is still caught\n // downstream by the X-Tearleads-Blob-Sha256 integrity check; it only stops a\n // buffered-but-valid response from being rejected here as malformed.\n const encryptedBytes =\n response.body ?? bufferedResponseBodyStream(await response.arrayBuffer());\n\n return {\n blobId: headers[blobWireHeaderKeys.blobId],\n byteLength,\n encryptedBytes,\n sha256: headers[blobWireHeaderKeys.blobSha256],\n };\n}\n\n// Wraps a fully-buffered response body as a single-chunk ReadableStream, so a\n// native HTTP bridge that only exposes the buffered bytes (no WHATWG\n// `response.body` stream) can still satisfy the streaming\n// `BlobBytesResponse.encryptedBytes` contract. An empty buffer yields an\n// immediately-closed, zero-chunk stream.\nfunction bufferedResponseBodyStream(\n buffer: ArrayBuffer,\n): ReadableStream<Uint8Array> {\n const bytes = new Uint8Array(buffer);\n return new ReadableStream<Uint8Array>({\n start(controller) {\n if (bytes.byteLength > 0) {\n controller.enqueue(bytes);\n }\n controller.close();\n },\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { completeMultipartBlobStageOperation, getMultipartBlobStageOperation, initiateMultipartBlobStageOperation, isCompleteMultipartBlobStageOperationRequest, isCompleteMultipartBlobStageOperationResponse, isGetMultipartBlobStageOperationResponse, isInitiateMultipartBlobStageOperationRequest, isInitiateMultipartBlobStageOperationResponse, operationRequestPath, } from "../../../validators/operation/index.js";
1
+ import { getMultipartBlobStageOperation, initiateMultipartBlobStageOperation, isGetMultipartBlobStageOperationResponse, isInitiateMultipartBlobStageOperationRequest, isInitiateMultipartBlobStageOperationResponse, operationRequestPath, } from "../../../validators/operation/index.js";
2
2
  export const initiateMultipartBlobStage = {
3
3
  isRequest: isInitiateMultipartBlobStageOperationRequest,
4
4
  isResponse: isInitiateMultipartBlobStageOperationResponse,
@@ -12,14 +12,4 @@ export const getMultipartBlobStage = {
12
12
  return operationRequestPath(getMultipartBlobStageOperation, { stageId });
13
13
  },
14
14
  };
15
- export const completeMultipartBlobStage = {
16
- isRequest: isCompleteMultipartBlobStageOperationRequest,
17
- isResponse: isCompleteMultipartBlobStageOperationResponse,
18
- method: completeMultipartBlobStageOperation.method,
19
- path(stageId) {
20
- return operationRequestPath(completeMultipartBlobStageOperation, {
21
- stageId,
22
- });
23
- },
24
- };
25
15
  //# sourceMappingURL=multipart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"multipart.js","sourceRoot":"","sources":["multipart.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,8BAA8B,EAC9B,mCAAmC,EACnC,4CAA4C,EAC5C,6CAA6C,EAC7C,wCAAwC,EACxC,4CAA4C,EAC5C,6CAA6C,EAC7C,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,6CAA6C;IACzD,MAAM,EAAE,mCAAmC,CAAC,MAAM;IAClD,IAAI,EAAE,oBAAoB,CAAC,mCAAmC,EAAE,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,wCAAwC;IACpD,MAAM,EAAE,8BAA8B,CAAC,MAAM;IAC7C,IAAI,CAAC,OAAe;QAClB,OAAO,oBAAoB,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,6CAA6C;IACzD,MAAM,EAAE,mCAAmC,CAAC,MAAM;IAClD,IAAI,CAAC,OAAe;QAClB,OAAO,oBAAoB,CAAC,mCAAmC,EAAE;YAC/D,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF,CAAC","sourcesContent":["import {\n completeMultipartBlobStageOperation,\n getMultipartBlobStageOperation,\n initiateMultipartBlobStageOperation,\n isCompleteMultipartBlobStageOperationRequest,\n isCompleteMultipartBlobStageOperationResponse,\n isGetMultipartBlobStageOperationResponse,\n isInitiateMultipartBlobStageOperationRequest,\n isInitiateMultipartBlobStageOperationResponse,\n operationRequestPath,\n} from \"@tearleads/validators/operation\";\n\nexport const initiateMultipartBlobStage = {\n isRequest: isInitiateMultipartBlobStageOperationRequest,\n isResponse: isInitiateMultipartBlobStageOperationResponse,\n method: initiateMultipartBlobStageOperation.method,\n path: operationRequestPath(initiateMultipartBlobStageOperation, {}),\n};\n\nexport const getMultipartBlobStage = {\n isResponse: isGetMultipartBlobStageOperationResponse,\n method: getMultipartBlobStageOperation.method,\n path(stageId: string) {\n return operationRequestPath(getMultipartBlobStageOperation, { stageId });\n },\n};\n\nexport const completeMultipartBlobStage = {\n isRequest: isCompleteMultipartBlobStageOperationRequest,\n isResponse: isCompleteMultipartBlobStageOperationResponse,\n method: completeMultipartBlobStageOperation.method,\n path(stageId: string) {\n return operationRequestPath(completeMultipartBlobStageOperation, {\n stageId,\n });\n },\n};\n"]}
1
+ {"version":3,"file":"multipart.js","sourceRoot":"","sources":["multipart.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,wCAAwC,EACxC,4CAA4C,EAC5C,6CAA6C,EAC7C,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,6CAA6C;IACzD,MAAM,EAAE,mCAAmC,CAAC,MAAM;IAClD,IAAI,EAAE,oBAAoB,CAAC,mCAAmC,EAAE,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,wCAAwC;IACpD,MAAM,EAAE,8BAA8B,CAAC,MAAM;IAC7C,IAAI,CAAC,OAAe;QAClB,OAAO,oBAAoB,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF,CAAC","sourcesContent":["import {\n getMultipartBlobStageOperation,\n initiateMultipartBlobStageOperation,\n isGetMultipartBlobStageOperationResponse,\n isInitiateMultipartBlobStageOperationRequest,\n isInitiateMultipartBlobStageOperationResponse,\n operationRequestPath,\n} from \"@tearleads/validators/operation\";\n\nexport const initiateMultipartBlobStage = {\n isRequest: isInitiateMultipartBlobStageOperationRequest,\n isResponse: isInitiateMultipartBlobStageOperationResponse,\n method: initiateMultipartBlobStageOperation.method,\n path: operationRequestPath(initiateMultipartBlobStageOperation, {}),\n};\n\nexport const getMultipartBlobStage = {\n isResponse: isGetMultipartBlobStageOperationResponse,\n method: getMultipartBlobStageOperation.method,\n path(stageId: string) {\n return operationRequestPath(getMultipartBlobStageOperation, { stageId });\n },\n};\n"]}
@@ -0,0 +1,14 @@
1
+ import type { UploadMultipartBlobPartResponse } from "../../../validators/response/index.js";
2
+ import { type MultipartBlobPartDescriptor } from "../../../validators/util/index.js";
3
+ import type { OperationTransport } from "../../operationTransportFactory.js";
4
+ import type { RequestResultOptions } from "../../types.js";
5
+ import type { UploadMultipartBlobPartBytesRequest } from "./get.js";
6
+ type UploadFetch = (url: string, init: RequestInit) => Promise<Response>;
7
+ /**
8
+ * Describe an encrypted part the way a stage initiation lists the parts it
9
+ * will send first: number, exact length, and the Content-MD5 a signed upload
10
+ * URL binds.
11
+ */
12
+ export declare function describeMultipartBlobPart(partNumber: number, encryptedBytes: Uint8Array): MultipartBlobPartDescriptor;
13
+ export declare function uploadMultipartBlobPartBytes(transport: OperationTransport, stageId: string, partNumber: number, input: UploadMultipartBlobPartBytesRequest, uploadFetch?: UploadFetch, options?: RequestResultOptions): Promise<UploadMultipartBlobPartResponse | null>;
14
+ export {};