@everfur/sdk 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +703 -4
- package/README.md +63 -23
- package/consent/package.json +8 -0
- package/dist/Chat-BZZ-Py5l.d.ts +128 -0
- package/dist/Chat-Dq4fffIO.d.cts +128 -0
- package/dist/DepthViews-BG3E25MD.d.ts +16 -0
- package/dist/DepthViews-B_hIypI6.d.cts +19 -0
- package/dist/DepthViews-CL75jyRA.d.cts +16 -0
- package/dist/DepthViews-CkYri51q.d.ts +19 -0
- package/dist/ErrorPolicyPort-CNf4uQZP.d.cts +22 -0
- package/dist/ErrorPolicyPort-CwbfmxzJ.d.ts +22 -0
- package/dist/{EverfurResult-D92-uL82.d.cts → EverfurResult-DN9pL2Ab.d.cts} +11 -10
- package/dist/{EverfurResult-D92-uL82.d.ts → EverfurResult-DN9pL2Ab.d.ts} +11 -10
- package/dist/{PhotoController-BItt5M7u.d.cts → PhotoController-3l7MT9jA.d.cts} +1 -1
- package/dist/{PhotoController-D8zMTdcW.d.ts → PhotoController-vzY5bfY_.d.ts} +1 -1
- package/dist/animations/index.cjs +1 -1997
- package/dist/animations/index.d.cts +35 -35
- package/dist/animations/index.d.ts +35 -35
- package/dist/animations/index.js +1 -1972
- package/dist/attachments-BorG422I.d.cts +146 -0
- package/dist/attachments-BrUWQYNK.d.ts +257 -0
- package/dist/attachments-D_SECjr1.d.cts +257 -0
- package/dist/attachments-DpldrvIW.d.ts +146 -0
- package/dist/bookingCopy-CqtDYvCR.d.ts +732 -0
- package/dist/bookingCopy-SREvkG19.d.cts +732 -0
- package/dist/branding-CsRdeNwK.d.cts +566 -0
- package/dist/branding-CsRdeNwK.d.ts +566 -0
- package/dist/callCopy-DoQKG3-L.d.cts +40 -0
- package/dist/callCopy-DoQKG3-L.d.ts +40 -0
- package/dist/casesRepository-DwtZVsbj.d.cts +51 -0
- package/dist/casesRepository-v6QczS9N.d.ts +51 -0
- package/dist/chat/index.cjs +1 -1170
- package/dist/chat/index.d.cts +32 -53
- package/dist/chat/index.d.ts +32 -53
- package/dist/chat/index.js +1 -1167
- package/dist/client/index.cjs +9 -2315
- package/dist/client/index.d.cts +80 -16
- package/dist/client/index.d.ts +80 -16
- package/dist/client/index.js +9 -2215
- package/dist/{config-CiJ0PVBB.d.ts → config--Wu1Umhd.d.cts} +64 -26
- package/dist/{config-BSjBdxrZ.d.cts → config-C7eb_IMD.d.ts} +64 -26
- package/dist/consent/index.cjs +1 -0
- package/dist/consent/index.d.cts +33 -0
- package/dist/consent/index.d.ts +33 -0
- package/dist/consent/index.js +1 -0
- package/dist/context-CL3lyuy1.d.cts +159 -0
- package/dist/context-CahAEha8.d.ts +159 -0
- package/dist/copy-DdVFDL01.d.ts +198 -0
- package/dist/copy-UeUJVk8X.d.cts +198 -0
- package/dist/core/index.cjs +13 -3178
- package/dist/core/index.d.cts +164 -29
- package/dist/core/index.d.ts +164 -29
- package/dist/core/index.js +13 -3166
- package/dist/depth-D5HwcvKC.d.cts +533 -0
- package/dist/depth-DvPwPuT_.d.ts +533 -0
- package/dist/entitlementRepository-B7egEdW6.d.ts +43 -0
- package/dist/entitlementRepository-BpJ7tiwl.d.cts +43 -0
- package/dist/{identity-Brl-lDd6.d.cts → identity-C2-08BZW.d.cts} +20 -7
- package/dist/{identity-DK9zORrG.d.ts → identity-CEi9GRFZ.d.ts} +20 -7
- package/dist/{ids-CJ1S6adf.d.cts → ids-B2GAAifq.d.cts} +1 -1
- package/dist/{ids-CJ1S6adf.d.ts → ids-B2GAAifq.d.ts} +1 -1
- package/dist/index.cjs +12 -4494
- package/dist/index.d.cts +30 -121
- package/dist/index.d.ts +30 -121
- package/dist/index.js +12 -4470
- package/dist/models-B-Uh2LTf.d.ts +214 -0
- package/dist/models-D2EUxPZY.d.cts +214 -0
- package/dist/notifications/index.cjs +2 -0
- package/dist/notifications/index.d.cts +17 -0
- package/dist/notifications/index.d.ts +17 -0
- package/dist/notifications/index.js +2 -0
- package/dist/optionalModule-DbJmsq5f.d.cts +21 -0
- package/dist/optionalModule-DbJmsq5f.d.ts +21 -0
- package/dist/pets-DJv2sj2H.d.ts +92 -0
- package/dist/pets-JVCXgRgR.d.cts +92 -0
- package/dist/petsRepository-B_gKbAzJ.d.cts +142 -0
- package/dist/petsRepository-Bk6GDwLs.d.ts +142 -0
- package/dist/photo/index.cjs +1 -2189
- package/dist/photo/index.d.cts +6 -6
- package/dist/photo/index.d.ts +6 -6
- package/dist/photo/index.js +1 -2186
- package/dist/ports-BN6RHF9W.d.cts +48 -0
- package/dist/ports-BN6RHF9W.d.ts +48 -0
- package/dist/ports-BY2ph0_y.d.cts +376 -0
- package/dist/ports-D7YW8qz9.d.ts +376 -0
- package/dist/profile-CSs1wlXT.d.cts +93 -0
- package/dist/profile-CSs1wlXT.d.ts +93 -0
- package/dist/records/depth/index.cjs +2 -0
- package/dist/records/depth/index.d.cts +13 -0
- package/dist/records/depth/index.d.ts +13 -0
- package/dist/records/depth/index.js +2 -0
- package/dist/records/index.cjs +3 -2839
- package/dist/records/index.d.cts +137 -203
- package/dist/records/index.d.ts +137 -203
- package/dist/records/index.js +3 -2833
- package/dist/requestFunnel-BjDpqqvm.d.cts +110 -0
- package/dist/requestFunnel-DFMGcluw.d.ts +110 -0
- package/dist/{resolve-Dq_4_agU.d.ts → resolve-D4Ywz5OS.d.cts} +10 -4
- package/dist/{resolve-Dq_4_agU.d.cts → resolve-D4Ywz5OS.d.ts} +10 -4
- package/dist/{runtime-Bvr8yqXm.d.cts → runtimeTypes-gZEJu-da.d.cts} +104 -132
- package/dist/{runtime-BIYzf9cK.d.ts → runtimeTypes-w5KqBMcs.d.ts} +104 -132
- package/dist/server/events/index.cjs +2 -0
- package/dist/server/events/index.d.cts +550 -0
- package/dist/server/events/index.d.ts +550 -0
- package/dist/server/events/index.js +2 -0
- package/dist/server/index.cjs +2 -533
- package/dist/server/index.d.cts +73 -18
- package/dist/server/index.d.ts +73 -18
- package/dist/server/index.js +2 -530
- package/dist/species-BXAIMh7I.d.cts +9 -0
- package/dist/species-BXAIMh7I.d.ts +9 -0
- package/dist/televet/booking/index.cjs +1 -0
- package/dist/televet/booking/index.d.cts +294 -0
- package/dist/televet/booking/index.d.ts +294 -0
- package/dist/televet/booking/index.js +1 -0
- package/dist/televet/call/index.cjs +1 -0
- package/dist/televet/call/index.d.cts +141 -0
- package/dist/televet/call/index.d.ts +141 -0
- package/dist/televet/call/index.js +1 -0
- package/dist/televet/index.cjs +1 -0
- package/dist/televet/index.d.cts +142 -0
- package/dist/televet/index.d.ts +142 -0
- package/dist/televet/index.js +1 -0
- package/dist/testing/index.cjs +5 -823
- package/dist/testing/index.d.cts +18 -4
- package/dist/testing/index.d.ts +18 -4
- package/dist/testing/index.js +5 -820
- package/dist/testing/rn/index.cjs +1 -449
- package/dist/testing/rn/index.d.cts +18 -29
- package/dist/testing/rn/index.d.ts +18 -29
- package/dist/testing/rn/index.js +1 -444
- package/dist/testing/web/index.cjs +1 -0
- package/dist/testing/web/index.d.cts +132 -0
- package/dist/testing/web/index.d.ts +132 -0
- package/dist/testing/web/index.js +1 -0
- package/dist/timelineRows-C15jxFFH.d.ts +19 -0
- package/dist/timelineRows-odO8g9r2.d.cts +19 -0
- package/dist/typeStyle-CKqVYD6L.d.cts +111 -0
- package/dist/typeStyle-DmoyacDG.d.ts +111 -0
- package/dist/uploadTransport-D0M0T4hN.d.ts +38 -0
- package/dist/uploadTransport-DKJHs3Yj.d.cts +38 -0
- package/dist/useRecordsDepth-C6rjEaLn.d.cts +237 -0
- package/dist/useRecordsDepth-crhBllQK.d.ts +237 -0
- package/dist/useVetVisit-Bc84hWUU.d.cts +187 -0
- package/dist/useVetVisit-CjmMa896.d.ts +187 -0
- package/dist/video/index.cjs +1 -1941
- package/dist/video/index.d.cts +4 -4
- package/dist/video/index.d.ts +4 -4
- package/dist/video/index.js +1 -1938
- package/dist/view-Bxwxp4xD.d.ts +310 -0
- package/dist/view-DyitEO0m.d.cts +310 -0
- package/dist/visitIntent-D7_yVp1I.d.cts +8 -0
- package/dist/visitIntent-D7_yVp1I.d.ts +8 -0
- package/dist/web/consent/index.cjs +1 -0
- package/dist/web/consent/index.d.cts +34 -0
- package/dist/web/consent/index.d.ts +34 -0
- package/dist/web/consent/index.js +1 -0
- package/dist/web/index.cjs +14 -0
- package/dist/web/index.d.cts +218 -0
- package/dist/web/index.d.ts +218 -0
- package/dist/web/index.js +14 -0
- package/dist/web/notifications/index.cjs +2 -0
- package/dist/web/notifications/index.d.cts +213 -0
- package/dist/web/notifications/index.d.ts +213 -0
- package/dist/web/notifications/index.js +2 -0
- package/dist/web/records/depth/index.cjs +2 -0
- package/dist/web/records/depth/index.d.cts +12 -0
- package/dist/web/records/depth/index.d.ts +12 -0
- package/dist/web/records/depth/index.js +2 -0
- package/dist/web/records/index.cjs +4 -0
- package/dist/web/records/index.d.cts +285 -0
- package/dist/web/records/index.d.ts +285 -0
- package/dist/web/records/index.js +4 -0
- package/dist/web/televet/booking/index.cjs +1 -0
- package/dist/web/televet/booking/index.d.cts +349 -0
- package/dist/web/televet/booking/index.d.ts +349 -0
- package/dist/web/televet/booking/index.js +1 -0
- package/dist/web/televet/call/index.cjs +1 -0
- package/dist/web/televet/call/index.d.cts +142 -0
- package/dist/web/televet/call/index.d.ts +142 -0
- package/dist/web/televet/call/index.js +1 -0
- package/dist/web/televet/index.cjs +1 -0
- package/dist/web/televet/index.d.cts +136 -0
- package/dist/web/televet/index.d.ts +136 -0
- package/dist/web/televet/index.js +1 -0
- package/notifications/package.json +8 -0
- package/package.json +266 -10
- package/records/depth/package.json +8 -0
- package/server/events/device-blocked.cjs +15 -0
- package/server/events/package.json +9 -0
- package/televet/booking/package.json +8 -0
- package/televet/call/package.json +8 -0
- package/televet/package.json +8 -0
- package/testing/web/native-blocked.cjs +12 -0
- package/testing/web/package.json +8 -0
- package/web/consent/native-blocked.cjs +12 -0
- package/web/consent/package.json +8 -0
- package/web/native-blocked.cjs +12 -0
- package/web/notifications/native-blocked.cjs +12 -0
- package/web/notifications/package.json +8 -0
- package/web/package.json +8 -0
- package/web/records/depth/native-blocked.cjs +12 -0
- package/web/records/depth/package.json +8 -0
- package/web/records/native-blocked.cjs +12 -0
- package/web/records/package.json +8 -0
- package/web/televet/booking/native-blocked.cjs +12 -0
- package/web/televet/booking/package.json +8 -0
- package/web/televet/call/native-blocked.cjs +12 -0
- package/web/televet/call/package.json +8 -0
- package/web/televet/native-blocked.cjs +12 -0
- package/web/televet/package.json +8 -0
- package/dist/ChatController-CKdBvPj2.d.ts +0 -146
- package/dist/ChatController-CpUMvvZf.d.cts +0 -146
- package/dist/FilePort-BabWrv7I.d.cts +0 -22
- package/dist/FilePort-BabWrv7I.d.ts +0 -22
- package/dist/petsRepository-BEGb97M9.d.cts +0 -326
- package/dist/petsRepository-Bu18r2kK.d.ts +0 -326
- package/dist/requestFunnel-DuUH-kAe.d.cts +0 -28
- package/dist/requestFunnel-dio5OmR9.d.ts +0 -28
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { E as EverfurError } from './EverfurResult-DN9pL2Ab.js';
|
|
2
|
+
import { R as RequestFunnel } from './requestFunnel-DFMGcluw.js';
|
|
3
|
+
import { F as FileHandle, U as UploadTransport, a as UploadPolicyWire } from './ports-BN6RHF9W.js';
|
|
4
|
+
import { R as ReadableStore, T as Timers } from './ports-D7YW8qz9.js';
|
|
5
|
+
|
|
6
|
+
/** The image MIME types the chat accepts (the server's `CHAT_ATTACHMENT` rule, plus the `image/jpg` alias). */
|
|
7
|
+
declare const ATTACHMENT_MIME_TYPES: readonly string[];
|
|
8
|
+
/** The `accept` list of a web file input: the MIME types and their extensions. */
|
|
9
|
+
declare const ATTACHMENT_ACCEPT = "image/jpeg,image/png,image/webp,image/heic,image/heif,.jpg,.jpeg,.png,.webp,.heic,.heif";
|
|
10
|
+
/** The server's cap on one attachment (`max_content_length: 10485760`). */
|
|
11
|
+
declare const MAX_ATTACHMENT_BYTES: number;
|
|
12
|
+
/** The server's cap on attachments per message (`image_s3_keys`). */
|
|
13
|
+
declare const MAX_ATTACHMENTS_PER_MESSAGE = 5;
|
|
14
|
+
/** The filename cap after sanitising. */
|
|
15
|
+
declare const MAX_FILENAME_LENGTH = 120;
|
|
16
|
+
/** The route the initiate step posts to. */
|
|
17
|
+
declare const ATTACHMENT_INITIATE_PATH = "/widget/v1/uploads/initiate";
|
|
18
|
+
/** True when `mime` is an accepted image type (case-insensitive). */
|
|
19
|
+
declare function isAttachmentMime(mime: string | undefined): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Sanitise a user-supplied filename so it can sit in a request body, a label or a log line: path separators
|
|
22
|
+
* become spaces, control characters and quotes are dropped, whitespace collapses, and the result is capped at
|
|
23
|
+
* `MAX_FILENAME_LENGTH` keeping the extension. Empty in, `attachment` out.
|
|
24
|
+
*/
|
|
25
|
+
declare function sanitizeFilename(input: string | undefined): string;
|
|
26
|
+
/** `512 B`, `12.3 KB`, `10.0 MB`: the app's byte formatter, for the size copy. */
|
|
27
|
+
declare function formatBytes(bytes: number): string;
|
|
28
|
+
/** The closed set of attachment failures; the React layer maps each to the app's copy. */
|
|
29
|
+
type AttachmentErrorCode = 'too_large' | 'too_many' | 'unsupported_type' | 'network' | 'server' | 'cancelled' | 'rate_limited' | 'quota_exceeded' | 'idempotency_conflict' | 'unknown';
|
|
30
|
+
/** One attachment failure, typed; `retryable` says whether a retry control is honest. */
|
|
31
|
+
interface AttachmentError {
|
|
32
|
+
readonly code: AttachmentErrorCode;
|
|
33
|
+
readonly retryable: boolean;
|
|
34
|
+
/** The sanitised filename the failure is about. */
|
|
35
|
+
readonly filename: string;
|
|
36
|
+
/** For `too_large`: the file's size. */
|
|
37
|
+
readonly sizeBytes?: number;
|
|
38
|
+
/** For `server`: the HTTP status when one is known. */
|
|
39
|
+
readonly httpStatus?: number;
|
|
40
|
+
/** The settled SDK error behind a wire failure, when there is one (`displayMessage` is safe). */
|
|
41
|
+
readonly cause?: EverfurError;
|
|
42
|
+
}
|
|
43
|
+
/** The settle-shaped outcome of every attachment step: `AttachmentError` on the failure branch, never a throw. */
|
|
44
|
+
type AttachmentOutcome<T> = {
|
|
45
|
+
readonly ok: true;
|
|
46
|
+
readonly value: T;
|
|
47
|
+
} | {
|
|
48
|
+
readonly ok: false;
|
|
49
|
+
readonly error: AttachmentError;
|
|
50
|
+
};
|
|
51
|
+
/** A validated file: what the queue uploads. */
|
|
52
|
+
interface ValidatedAttachment {
|
|
53
|
+
readonly file: FileHandle;
|
|
54
|
+
readonly filename: string;
|
|
55
|
+
readonly contentType: string;
|
|
56
|
+
readonly sizeBytes: number;
|
|
57
|
+
}
|
|
58
|
+
/** The byte size of a handle: its `sizeBytes`, else its in-memory `blob`'s size; null when unknown. */
|
|
59
|
+
declare function attachmentSize(file: FileHandle): number | null;
|
|
60
|
+
/**
|
|
61
|
+
* The picker-boundary check: an accepted image type, at most `MAX_ATTACHMENT_BYTES`, a known size (the initiate
|
|
62
|
+
* body needs it), and a sanitised filename. Settles; never throws.
|
|
63
|
+
*/
|
|
64
|
+
declare function validateAttachment(file: FileHandle): AttachmentOutcome<ValidatedAttachment>;
|
|
65
|
+
/** The presigned policy `POST /widget/v1/uploads/initiate` returns, plus the key the send names. */
|
|
66
|
+
interface AttachmentUploadPolicy extends UploadPolicyWire {
|
|
67
|
+
readonly s3_key: string;
|
|
68
|
+
readonly purpose: string | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Step 2: ask for the presigned policy. Settles `ok(policy)` or a typed failure; a malformed policy is a
|
|
72
|
+
* non-retryable `server` failure (retrying cannot change the shape).
|
|
73
|
+
*/
|
|
74
|
+
declare function initiateAttachmentUpload(funnel: RequestFunnel, attachment: ValidatedAttachment, opts?: {
|
|
75
|
+
readonly signal?: AbortSignal;
|
|
76
|
+
}): Promise<AttachmentOutcome<AttachmentUploadPolicy>>;
|
|
77
|
+
/**
|
|
78
|
+
* Step 3: stage the bytes on S3 through the injected transport (the policy fields first, `file` last). A
|
|
79
|
+
* rejection is a retryable `server` failure, an abort a `cancelled` one; nothing here throws.
|
|
80
|
+
*/
|
|
81
|
+
declare function uploadAttachmentBytes(transport: UploadTransport, policy: AttachmentUploadPolicy, attachment: ValidatedAttachment, opts?: {
|
|
82
|
+
readonly signal?: AbortSignal;
|
|
83
|
+
readonly onProgress?: (fraction: number) => void;
|
|
84
|
+
}): Promise<AttachmentOutcome<void>>;
|
|
85
|
+
declare const ATTACHMENT_QUEUE_CONCURRENCY = 2;
|
|
86
|
+
declare const ATTACHMENT_MAX_ATTEMPTS = 3;
|
|
87
|
+
declare const ATTACHMENT_BACKOFF_MS: readonly number[];
|
|
88
|
+
type AttachmentStatus = 'uploading' | 'uploaded' | 'failed';
|
|
89
|
+
/** One attachment as a composer renders it. `s3Key` is set once `status === 'uploaded'`. */
|
|
90
|
+
interface AttachmentState {
|
|
91
|
+
readonly id: string;
|
|
92
|
+
readonly filename: string;
|
|
93
|
+
/** What the thumbnail shows: the handle's `uri` (an object URL on the web, the local file on native). */
|
|
94
|
+
readonly previewUri: string;
|
|
95
|
+
readonly contentType: string;
|
|
96
|
+
readonly sizeBytes: number;
|
|
97
|
+
readonly status: AttachmentStatus;
|
|
98
|
+
readonly s3Key: string | null;
|
|
99
|
+
readonly error: AttachmentError | null;
|
|
100
|
+
/** 0..1 while uploading (the transport may report completion only). */
|
|
101
|
+
readonly progress: number;
|
|
102
|
+
}
|
|
103
|
+
/** The queue's frozen snapshot: the attachments in the order they were added. */
|
|
104
|
+
interface AttachmentQueueSnapshot {
|
|
105
|
+
readonly attachments: readonly AttachmentState[];
|
|
106
|
+
}
|
|
107
|
+
interface AttachmentQueueDeps {
|
|
108
|
+
/** The request funnel of the current scope (the initiate hop). */
|
|
109
|
+
readonly funnel: RequestFunnel;
|
|
110
|
+
/** The host's upload transport (`EverfurConfig.uploadTransport`); the absent sentinel means uploads cannot run. */
|
|
111
|
+
readonly transport: UploadTransport;
|
|
112
|
+
/** The cap on attachments in the queue (the composer's slots); default `MAX_ATTACHMENTS_PER_MESSAGE`. */
|
|
113
|
+
readonly maxPerMessage?: number;
|
|
114
|
+
readonly concurrency?: number;
|
|
115
|
+
readonly maxAttempts?: number;
|
|
116
|
+
readonly backoffMs?: readonly number[];
|
|
117
|
+
/** Injected clock for deterministic backoff in tests. */
|
|
118
|
+
readonly timers?: Timers;
|
|
119
|
+
/** Injected id factory for deterministic tests. */
|
|
120
|
+
readonly newId?: () => string;
|
|
121
|
+
}
|
|
122
|
+
interface AttachmentQueue extends ReadableStore<AttachmentQueueSnapshot> {
|
|
123
|
+
/** True when the host wired an upload transport; a surface hides its attach control otherwise. */
|
|
124
|
+
readonly available: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Validate and enqueue one picked file. Settles `ok(state)` (the row, already `uploading`) or the typed
|
|
127
|
+
* failure that kept it out (`too_many`, `unsupported_type`, `too_large`, ...). Never throws.
|
|
128
|
+
*/
|
|
129
|
+
add(file: FileHandle): AttachmentOutcome<AttachmentState>;
|
|
130
|
+
/** Re-run a failed row from the start (a fresh initiate; the same 3-attempt budget). A no-op otherwise. */
|
|
131
|
+
retry(id: string): void;
|
|
132
|
+
/** Drop a row: cancels it when in flight. */
|
|
133
|
+
remove(id: string): void;
|
|
134
|
+
/** Drop every row (after a send, or on unmount). */
|
|
135
|
+
clear(): void;
|
|
136
|
+
/** True while any row is still uploading (the send is blocked meanwhile). */
|
|
137
|
+
readonly uploading: boolean;
|
|
138
|
+
/** The S3 keys of every uploaded row, in order: what `SendOptions.imageS3Keys` takes. */
|
|
139
|
+
readonly s3Keys: readonly string[];
|
|
140
|
+
/** Stop everything and drop every listener. */
|
|
141
|
+
dispose(): void;
|
|
142
|
+
}
|
|
143
|
+
/** Build a queue. Framework-free; a React surface binds it through `useSyncExternalStore`. */
|
|
144
|
+
declare function createAttachmentQueue(deps: AttachmentQueueDeps): AttachmentQueue;
|
|
145
|
+
|
|
146
|
+
export { type AttachmentError as A, MAX_ATTACHMENTS_PER_MESSAGE as M, type ValidatedAttachment as V, type AttachmentErrorCode as a, type AttachmentOutcome as b, type AttachmentQueue as c, type AttachmentState as d, type AttachmentStatus as e, ATTACHMENT_ACCEPT as f, ATTACHMENT_BACKOFF_MS as g, ATTACHMENT_INITIATE_PATH as h, ATTACHMENT_MAX_ATTEMPTS as i, ATTACHMENT_MIME_TYPES as j, ATTACHMENT_QUEUE_CONCURRENCY as k, type AttachmentQueueDeps as l, type AttachmentQueueSnapshot as m, type AttachmentUploadPolicy as n, MAX_ATTACHMENT_BYTES as o, MAX_FILENAME_LENGTH as p, attachmentSize as q, createAttachmentQueue as r, formatBytes as s, initiateAttachmentUpload as t, isAttachmentMime as u, sanitizeFilename as v, uploadAttachmentBytes as w, validateAttachment as x };
|