@awiki/dsh-plugin 0.3.16 → 0.3.18

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 (87) hide show
  1. package/README.md +4 -0
  2. package/THIRD_PARTY_NOTICES.md +6 -0
  3. package/lib/client.js +3543 -746
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +218 -41
  6. package/lib/{sdk-adapter-DGcTiEZz.mjs → package-version.generated-D0MSDRZn.mjs} +83 -10
  7. package/lib/provider.js +5 -3
  8. package/lib/typert.host.js +481 -127
  9. package/lib/typert.remote-client.d.ts +9 -3
  10. package/lib/typert.remote-client.d.ts.map +1 -1
  11. package/lib/typert.remote-client.js +481 -127
  12. package/lib/types/client/AwikiAvatar.d.ts +40 -0
  13. package/lib/types/client/AwikiAvatar.d.ts.map +1 -0
  14. package/lib/types/client/AwikiAvatar.js +201 -0
  15. package/lib/types/client/AwikiAvatar.js.map +1 -0
  16. package/lib/types/client/AwikiAvatarEditor.d.ts +11 -0
  17. package/lib/types/client/AwikiAvatarEditor.d.ts.map +1 -0
  18. package/lib/types/client/AwikiAvatarEditor.js +113 -0
  19. package/lib/types/client/AwikiAvatarEditor.js.map +1 -0
  20. package/lib/types/client/AwikiAvatarPreview.d.ts +8 -0
  21. package/lib/types/client/AwikiAvatarPreview.d.ts.map +1 -0
  22. package/lib/types/client/AwikiAvatarPreview.js +68 -0
  23. package/lib/types/client/AwikiAvatarPreview.js.map +1 -0
  24. package/lib/types/client/AwikiGroupDetails.js +2 -2
  25. package/lib/types/client/AwikiGroupDetails.js.map +1 -1
  26. package/lib/types/client/AwikiIdentityAccess.d.ts +1 -0
  27. package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
  28. package/lib/types/client/AwikiIdentityAccess.js +10 -2
  29. package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
  30. package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
  31. package/lib/types/client/AwikiOverlay.js +92 -27
  32. package/lib/types/client/AwikiOverlay.js.map +1 -1
  33. package/lib/types/client/AwikiProfileCard.d.ts +1 -1
  34. package/lib/types/client/AwikiProfileCard.d.ts.map +1 -1
  35. package/lib/types/client/AwikiProfileCard.js +6 -2
  36. package/lib/types/client/AwikiProfileCard.js.map +1 -1
  37. package/lib/types/client/avatar-cache.d.ts +24 -0
  38. package/lib/types/client/avatar-cache.d.ts.map +1 -0
  39. package/lib/types/client/avatar-cache.js +336 -0
  40. package/lib/types/client/avatar-cache.js.map +1 -0
  41. package/lib/types/client/avatar-dialog.d.ts +3 -0
  42. package/lib/types/client/avatar-dialog.d.ts.map +1 -0
  43. package/lib/types/client/avatar-dialog.js +18 -0
  44. package/lib/types/client/avatar-dialog.js.map +1 -0
  45. package/lib/types/client/avatar-image.d.ts +26 -0
  46. package/lib/types/client/avatar-image.d.ts.map +1 -0
  47. package/lib/types/client/avatar-image.js +193 -0
  48. package/lib/types/client/avatar-image.js.map +1 -0
  49. package/lib/types/client/controller.d.ts +30 -4
  50. package/lib/types/client/controller.d.ts.map +1 -1
  51. package/lib/types/client/controller.js +267 -56
  52. package/lib/types/client/controller.js.map +1 -1
  53. package/lib/types/client/index.d.ts.map +1 -1
  54. package/lib/types/client/index.js +10 -2
  55. package/lib/types/client/index.js.map +1 -1
  56. package/lib/types/client/slots.d.ts +12 -3
  57. package/lib/types/client/slots.d.ts.map +1 -1
  58. package/lib/types/conversation-preferences.d.ts.map +1 -1
  59. package/lib/types/conversation-preferences.js +27 -0
  60. package/lib/types/conversation-preferences.js.map +1 -1
  61. package/lib/types/index.d.ts +8 -2
  62. package/lib/types/index.d.ts.map +1 -1
  63. package/lib/types/index.js +76 -11
  64. package/lib/types/index.js.map +1 -1
  65. package/lib/types/listener.d.ts.map +1 -1
  66. package/lib/types/listener.js +9 -8
  67. package/lib/types/listener.js.map +1 -1
  68. package/lib/types/package-version.generated.d.ts +2 -2
  69. package/lib/types/package-version.generated.js +2 -2
  70. package/lib/types/provider-api.d.ts +9 -3
  71. package/lib/types/provider-api.d.ts.map +1 -1
  72. package/lib/types/provider.d.ts.map +1 -1
  73. package/lib/types/provider.js +5 -2
  74. package/lib/types/provider.js.map +1 -1
  75. package/lib/types/sdk-adapter.d.ts +6 -3
  76. package/lib/types/sdk-adapter.d.ts.map +1 -1
  77. package/lib/types/sdk-adapter.js +58 -7
  78. package/lib/types/sdk-adapter.js.map +1 -1
  79. package/lib/types/tenant-registry.d.ts +2 -0
  80. package/lib/types/tenant-registry.d.ts.map +1 -1
  81. package/lib/types/tenant-registry.js +83 -16
  82. package/lib/types/tenant-registry.js.map +1 -1
  83. package/lib/types/types.d.ts +63 -7
  84. package/lib/types/types.d.ts.map +1 -1
  85. package/lib/types/types.js.map +1 -1
  86. package/lib/types/update-policy.d.ts +2 -2
  87. package/package.json +33 -34
@@ -0,0 +1,336 @@
1
+ import { avatarImageDimensions } from "./avatar-image.js";
2
+ const DISK_BYTES = 64 * 1024 * 1024;
3
+ const DECODED_BYTES = 16 * 1024 * 1024;
4
+ const DOWNLOAD_BYTES = 5 * 1024 * 1024;
5
+ const WRITE_WINDOW = 4 * 1024 * 1024;
6
+ export function safeAvatarUrl(raw) {
7
+ try {
8
+ const url = new URL(raw ?? '');
9
+ if (url.protocol !== 'https:' || url.username !== '' || url.password !== '' || url.hash !== '' || /\.(svg|html?)$/iu.test(url.pathname))
10
+ return undefined;
11
+ return url.href;
12
+ }
13
+ catch {
14
+ return undefined;
15
+ }
16
+ }
17
+ function result(request) {
18
+ return new Promise((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(new Error('avatar_cache')); });
19
+ }
20
+ function done(transaction) {
21
+ const completion = new Promise((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onerror = transaction.onabort = () => reject(new Error('avatar_cache')); });
22
+ // A request can fail before its caller reaches `await completion`.
23
+ void completion.catch(() => { });
24
+ return completion;
25
+ }
26
+ /** One browser runtime, separate from authenticated attachment caches. */
27
+ export class AvatarCache {
28
+ memory = new Map();
29
+ pending = new Map();
30
+ bytesPending = new Map();
31
+ retryAt = new Map();
32
+ active = new Set();
33
+ waiting = [];
34
+ running = 0;
35
+ generation = 0;
36
+ databasePromise;
37
+ database() {
38
+ return this.databasePromise ??= new Promise(resolve => {
39
+ if (globalThis.indexedDB === undefined) {
40
+ resolve(undefined);
41
+ return;
42
+ }
43
+ const request = indexedDB.open('dsh-awiki-public-avatars-v1', 2);
44
+ request.onupgradeneeded = () => {
45
+ if (!request.result.objectStoreNames.contains('avatars'))
46
+ request.result.createObjectStore('avatars', { keyPath: 'key' });
47
+ request.result.createObjectStore('write-budget');
48
+ };
49
+ request.onsuccess = () => { request.result.onversionchange = () => request.result.close(); resolve(request.result); };
50
+ request.onerror = request.onblocked = () => resolve(undefined);
51
+ });
52
+ }
53
+ async read(key) {
54
+ try {
55
+ const db = await this.database();
56
+ if (db === undefined)
57
+ return undefined;
58
+ const tx = db.transaction('avatars', 'readonly');
59
+ const completion = done(tx);
60
+ const value = await result(tx.objectStore('avatars').get(key));
61
+ await completion;
62
+ return value?.key === key && value.blob instanceof Blob && value.blob.size <= DOWNLOAD_BYTES ? value : undefined;
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ }
68
+ async write(record, generation, downloaded) {
69
+ try {
70
+ const db = await this.database();
71
+ if (db === undefined || generation !== this.generation)
72
+ return;
73
+ // Read/write and prune in one serialized transaction across windows.
74
+ const tx = db.transaction(['avatars', 'write-budget'], 'readwrite');
75
+ const completion = done(tx);
76
+ const store = tx.objectStore('avatars');
77
+ const budgetStore = tx.objectStore('write-budget');
78
+ const budget = await result(budgetStore.get('window'));
79
+ store.put(record);
80
+ // Small persisted headroom counters serialize across browser windows. A
81
+ // disk hit only touches its record; scans are amortized over cold writes.
82
+ const cost = (row) => row.blob.size + new TextEncoder().encode(JSON.stringify({ ...row, blob: undefined })).length;
83
+ const next = { bytes: (budget?.bytes ?? WRITE_WINDOW) + (downloaded ? cost(record) : 0),
84
+ entries: (budget?.entries ?? 64) + (downloaded ? 1 : 0) };
85
+ if (next.bytes > WRITE_WINDOW || next.entries >= 64) {
86
+ const rows = await result(store.getAll());
87
+ let bytes = rows.reduce((sum, row) => sum + cost(row), 0);
88
+ rows.sort((a, b) => a.touched - b.touched);
89
+ let entries = rows.length;
90
+ for (const row of rows) {
91
+ if (bytes <= DISK_BYTES - WRITE_WINDOW && entries <= 4096 - 64)
92
+ break;
93
+ store.delete(row.key);
94
+ bytes -= cost(row);
95
+ entries--;
96
+ }
97
+ next.bytes = 0;
98
+ next.entries = 0;
99
+ }
100
+ budgetStore.put(next, 'window');
101
+ await completion;
102
+ }
103
+ catch { /* Optional acceleration; never fail the visible image. */ }
104
+ }
105
+ async load(owner, raw, edge = 128, force = false, animate = false) {
106
+ const uri = safeAvatarUrl(raw);
107
+ if (uri === undefined)
108
+ return undefined;
109
+ edge = edge <= 128 ? 128 : 512;
110
+ const key = JSON.stringify([owner, uri, edge, animate]);
111
+ const cached = this.memory.get(key);
112
+ if (!force && cached !== undefined && cached.expires > Date.now()) {
113
+ this.memory.delete(key);
114
+ this.memory.set(key, cached);
115
+ return cached.url;
116
+ }
117
+ if (!force && (this.retryAt.get(key) ?? 0) > Date.now())
118
+ return undefined;
119
+ const existing = this.pending.get(key);
120
+ if (existing !== undefined)
121
+ return existing;
122
+ const generation = this.generation;
123
+ const load = this.loadImage(owner, uri, edge, key, generation, force, animate).finally(() => { if (this.pending.get(key) === load)
124
+ this.pending.delete(key); });
125
+ this.pending.set(key, load);
126
+ return load;
127
+ }
128
+ async loadImage(owner, uri, edge, key, generation, force, animate) {
129
+ if (this.running >= 4)
130
+ await new Promise(resolve => { this.waiting.push(resolve); });
131
+ else
132
+ this.running++;
133
+ const byteKey = JSON.stringify([owner, uri]);
134
+ let bytesRequest;
135
+ try {
136
+ if (generation !== this.generation)
137
+ return undefined;
138
+ bytesRequest = this.bytesPending.get(byteKey);
139
+ if (bytesRequest === undefined) {
140
+ bytesRequest = { users: 0, result: (async () => {
141
+ const stored = await this.read(byteKey);
142
+ if (generation !== this.generation)
143
+ throw new Error('avatar_owner_changed');
144
+ if (!force && stored !== undefined && stored.expires > Date.now())
145
+ return { record: stored, downloaded: false };
146
+ try {
147
+ return { record: await this.download(owner, uri, byteKey, stored), downloaded: true };
148
+ }
149
+ catch (error) {
150
+ if (stored === undefined)
151
+ throw error;
152
+ return { record: { ...stored, expires: Date.now() + 30_000 }, downloaded: false };
153
+ }
154
+ })() };
155
+ this.bytesPending.set(byteKey, bytesRequest);
156
+ }
157
+ bytesRequest.users++;
158
+ const { record: stored, downloaded } = await bytesRequest.result;
159
+ if (generation !== this.generation)
160
+ return undefined;
161
+ const previous = this.memory.get(key);
162
+ if (previous !== undefined && stored.etag !== undefined && previous.etag === stored.etag) {
163
+ previous.expires = stored.expires;
164
+ if (stored.canStore !== false)
165
+ await this.write({ ...stored, touched: Date.now() }, generation, downloaded);
166
+ else
167
+ await this.delete(byteKey, generation);
168
+ return generation === this.generation ? previous.url : undefined;
169
+ }
170
+ const bytes = new Uint8Array(await stored.blob.arrayBuffer());
171
+ const info = avatarImageDimensions(bytes, false);
172
+ const cost = animate && info.mime === 'image/gif' ? 2 * info.width * info.height * 4 + stored.blob.size : edge * edge * 4;
173
+ if (cost > DECODED_BYTES)
174
+ throw new Error('avatar_memory_limit');
175
+ let blob;
176
+ if (animate && info.mime === 'image/gif') {
177
+ blob = stored.blob;
178
+ }
179
+ else {
180
+ const scale = Math.min(1, edge / Math.max(info.width, info.height));
181
+ const bitmap = await createImageBitmap(stored.blob, { imageOrientation: 'from-image', colorSpaceConversion: 'default',
182
+ resizeWidth: Math.max(1, Math.round(info.width * scale)), resizeHeight: Math.max(1, Math.round(info.height * scale)), resizeQuality: 'high' });
183
+ const canvas = document.createElement('canvas');
184
+ canvas.width = edge;
185
+ canvas.height = edge;
186
+ try {
187
+ const context = canvas.getContext('2d', { alpha: true, colorSpace: 'srgb' });
188
+ if (context === null)
189
+ throw new Error('avatar_decode');
190
+ const cropEdge = Math.min(bitmap.width, bitmap.height);
191
+ context.drawImage(bitmap, (bitmap.width - cropEdge) / 2, (bitmap.height - cropEdge) / 2, cropEdge, cropEdge, 0, 0, edge, edge);
192
+ blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
193
+ }
194
+ finally {
195
+ bitmap.close();
196
+ canvas.width = 0;
197
+ canvas.height = 0;
198
+ }
199
+ }
200
+ if (blob === null || generation !== this.generation || info.width < 1)
201
+ return undefined;
202
+ const url = URL.createObjectURL(blob);
203
+ const old = this.memory.get(key);
204
+ if (old !== undefined)
205
+ URL.revokeObjectURL(old.url);
206
+ this.memory.delete(key);
207
+ this.memory.set(key, { url, cost, expires: stored.expires, ...stored.etag === undefined ? {} : { etag: stored.etag } });
208
+ let bytesInMemory = [...this.memory.values()].reduce((sum, item) => sum + item.cost, 0);
209
+ for (const [oldKey, value] of this.memory) {
210
+ if (bytesInMemory <= DECODED_BYTES)
211
+ break;
212
+ this.memory.delete(oldKey);
213
+ URL.revokeObjectURL(value.url);
214
+ bytesInMemory -= value.cost;
215
+ }
216
+ // Retain the four-slot bound until the optional write completes, so slow
217
+ // IndexedDB cannot accumulate unlimited pending Blob references.
218
+ if (stored.canStore !== false)
219
+ await this.write({ ...stored, touched: Date.now() }, generation, downloaded);
220
+ else
221
+ await this.delete(byteKey, generation);
222
+ if (generation !== this.generation)
223
+ return undefined;
224
+ return url;
225
+ }
226
+ catch {
227
+ if (generation !== this.generation)
228
+ return undefined;
229
+ this.retryAt.set(key, Date.now() + 30_000);
230
+ if (this.retryAt.size > 512)
231
+ this.retryAt.delete(this.retryAt.keys().next().value);
232
+ return this.memory.get(key)?.url;
233
+ }
234
+ finally {
235
+ // Keep byte requests shared through decode and persistence, including a
236
+ // late subscriber asking for a different size while the first decodes.
237
+ if (bytesRequest !== undefined && --bytesRequest.users === 0 && this.bytesPending.get(byteKey) === bytesRequest)
238
+ this.bytesPending.delete(byteKey);
239
+ const next = this.waiting.shift();
240
+ if (next !== undefined)
241
+ next();
242
+ else
243
+ this.running--;
244
+ }
245
+ }
246
+ async delete(key, generation) {
247
+ try {
248
+ const db = await this.database();
249
+ if (db === undefined || generation !== this.generation)
250
+ return;
251
+ const tx = db.transaction('avatars', 'readwrite');
252
+ const completion = done(tx);
253
+ tx.objectStore('avatars').delete(key);
254
+ await completion;
255
+ }
256
+ catch { /* Optional cache. */ }
257
+ }
258
+ async download(owner, uri, key, previous) {
259
+ const abort = new AbortController();
260
+ this.active.add(abort);
261
+ const timeout = setTimeout(() => { abort.abort(); }, 20_000);
262
+ try {
263
+ const response = await fetch(uri, { credentials: 'omit', referrerPolicy: 'no-referrer', redirect: 'error', signal: abort.signal,
264
+ headers: previous?.etag === undefined ? { Accept: 'image/gif,image/jpeg,image/png,image/webp' } : { Accept: 'image/gif,image/jpeg,image/png,image/webp', 'If-None-Match': previous.etag } });
265
+ const policy = response.headers.get('cache-control')?.toLowerCase() ?? '';
266
+ const age = Number(response.headers.get('age') ?? '0');
267
+ const maxAge = Number(/(?:^|[,\s])max-age=(\d+)/u.exec(policy)?.[1] ?? '300');
268
+ const lifetime = /no-store|no-cache/u.test(policy) ? 0 : Math.max(0, Math.min(604800, maxAge - (Number.isFinite(age) ? age : 0))) * 1000;
269
+ const etag = response.headers.get('etag') ?? (response.status === 304 ? previous?.etag : undefined);
270
+ const metadata = { key, owner, canStore: !policy.includes('no-store'), expires: Date.now() + lifetime, touched: Date.now(), ...etag === undefined || etag.length > 512 ? {} : { etag } };
271
+ if (response.status === 304 && previous !== undefined)
272
+ return { ...metadata, blob: previous.blob };
273
+ if (!response.ok || Number(response.headers.get('content-length') ?? '0') > DOWNLOAD_BYTES || !['image/gif', 'image/jpeg', 'image/png', 'image/webp'].includes(response.headers.get('content-type')?.split(';')[0] ?? ''))
274
+ throw new Error('avatar_response');
275
+ const reader = response.body?.getReader();
276
+ if (reader === undefined)
277
+ throw new Error('avatar_response');
278
+ const chunks = [];
279
+ let total = 0;
280
+ try {
281
+ for (;;) {
282
+ const { value, done } = await reader.read();
283
+ if (done)
284
+ break;
285
+ total += value.length;
286
+ if (total > DOWNLOAD_BYTES)
287
+ throw new Error('avatar_limit');
288
+ chunks.push(new Uint8Array(value));
289
+ }
290
+ }
291
+ finally {
292
+ await reader.cancel().catch(() => undefined);
293
+ reader.releaseLock();
294
+ }
295
+ return { ...metadata, blob: new Blob(chunks, { type: response.headers.get('content-type') }) };
296
+ }
297
+ finally {
298
+ clearTimeout(timeout);
299
+ this.active.delete(abort);
300
+ }
301
+ }
302
+ reset() {
303
+ this.generation++;
304
+ for (const abort of this.active)
305
+ abort.abort();
306
+ for (const value of this.memory.values())
307
+ URL.revokeObjectURL(value.url);
308
+ this.memory.clear();
309
+ this.retryAt.clear();
310
+ this.pending.clear();
311
+ this.bytesPending.clear();
312
+ }
313
+ async clear(owner) {
314
+ this.reset();
315
+ try {
316
+ const db = await this.database();
317
+ if (db === undefined)
318
+ return;
319
+ const tx = db.transaction('avatars', 'readwrite');
320
+ const completion = done(tx);
321
+ const store = tx.objectStore('avatars');
322
+ if (owner === undefined)
323
+ store.clear();
324
+ else {
325
+ const rows = await result(store.getAll());
326
+ for (const row of rows)
327
+ if (row.owner === owner)
328
+ store.delete(row.key);
329
+ }
330
+ await completion;
331
+ }
332
+ catch { /* A disabled browser store must not block sign-out. */ }
333
+ }
334
+ }
335
+ export const avatarCache = new AvatarCache();
336
+ //# sourceMappingURL=avatar-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-cache.js","sourceRoot":"","sources":["../../../src/client/avatar-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** An avatar modal owns Escape before the containing AWiki drawer sees it. */
2
+ export declare function useAvatarDialogEscape(open: boolean, onClose: () => void): void;
3
+ //# sourceMappingURL=avatar-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-dialog.d.ts","sourceRoot":"","sources":["../../../src/client/avatar-dialog.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAY9E"}
@@ -0,0 +1,18 @@
1
+ import { useEffect } from 'react';
2
+ /** An avatar modal owns Escape before the containing AWiki drawer sees it. */
3
+ export function useAvatarDialogEscape(open, onClose) {
4
+ useEffect(() => {
5
+ if (!open)
6
+ return;
7
+ const close = (event) => {
8
+ if (event.key !== 'Escape')
9
+ return;
10
+ event.preventDefault();
11
+ event.stopImmediatePropagation();
12
+ onClose();
13
+ };
14
+ document.addEventListener('keydown', close, true);
15
+ return () => { document.removeEventListener('keydown', close, true); };
16
+ }, [open, onClose]);
17
+ }
18
+ //# sourceMappingURL=avatar-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-dialog.js","sourceRoot":"","sources":["../../../src/client/avatar-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CAAC,IAAa,EAAE,OAAmB;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAM;YAClC,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,KAAK,CAAC,wBAAwB,EAAE,CAAA;YAChC,OAAO,EAAE,CAAA;QACX,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QACjD,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC,CAAA;IACvE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** Public image parsing and browser-owned avatar processing. No authentication. */
2
+ export declare const AVATAR_SOURCE_MAX_BYTES: number;
3
+ export declare const AVATAR_UPLOAD_MAX_BYTES: number;
4
+ export declare function avatarImageDimensions(bytes: Uint8Array, upload?: boolean): {
5
+ width: number;
6
+ height: number;
7
+ mime: string;
8
+ };
9
+ export declare function avatarPreview(file: File): Promise<ImageBitmap>;
10
+ /** Source-pixel square shared by the selection, preview and final JPEG. */
11
+ export interface AvatarCrop {
12
+ readonly edge: number;
13
+ readonly x: number;
14
+ readonly y: number;
15
+ }
16
+ export declare function initialAvatarCrop(source: {
17
+ width: number;
18
+ height: number;
19
+ }): AvatarCrop;
20
+ export declare function avatarCropRectangle(source: {
21
+ width: number;
22
+ height: number;
23
+ }, crop: AvatarCrop): AvatarCrop;
24
+ export declare function drawAvatarCrop(canvas: HTMLCanvasElement, source: ImageBitmap, crop: AvatarCrop): void;
25
+ export declare function avatarJpeg(source: ImageBitmap, crop: AvatarCrop): Promise<string>;
26
+ //# sourceMappingURL=avatar-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-image.d.ts","sourceRoot":"","sources":["../../../src/client/avatar-image.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,QAAmB,CAAA;AACvD,eAAO,MAAM,uBAAuB,QAAa,CAAA;AAEjD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,UAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkDvH;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAYpE;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAGvF;AACD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAI3G;AACD,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAMrG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvF"}
@@ -0,0 +1,193 @@
1
+ /** Public image parsing and browser-owned avatar processing. No authentication. */
2
+ export const AVATAR_SOURCE_MAX_BYTES = 20 * 1024 * 1024;
3
+ export const AVATAR_UPLOAD_MAX_BYTES = 512 * 1024;
4
+ export function avatarImageDimensions(bytes, upload = true) {
5
+ if (bytes.length < 12 || bytes.length > (upload ? AVATAR_SOURCE_MAX_BYTES : 5 * 1024 * 1024))
6
+ throw new Error('图片过大或损坏');
7
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
8
+ const ascii = (offset, length) => String.fromCharCode(...bytes.subarray(offset, offset + length));
9
+ let width = 0, height = 0, mime = '';
10
+ if (ascii(0, 6) === 'GIF89a' || ascii(0, 6) === 'GIF87a') {
11
+ if (upload)
12
+ throw new Error('请选择静态图片');
13
+ return boundedGifDimensions(bytes);
14
+ }
15
+ if (bytes[0] === 0xff && bytes[1] === 0xd8) {
16
+ mime = 'image/jpeg';
17
+ let offset = 2;
18
+ while (offset + 4 <= bytes.length) {
19
+ if (bytes[offset] !== 0xff)
20
+ break;
21
+ while (bytes[offset] === 0xff)
22
+ offset++;
23
+ const marker = bytes[offset++];
24
+ if (marker === 0xd9 || marker === 0xda)
25
+ break;
26
+ if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7))
27
+ continue;
28
+ if (offset + 2 > bytes.length)
29
+ break;
30
+ const size = view.getUint16(offset);
31
+ if (size < 2 || offset + size > bytes.length)
32
+ break;
33
+ if ([0xc0, 0xc1, 0xc2].includes(marker) && size >= 8) {
34
+ height = view.getUint16(offset + 3);
35
+ width = view.getUint16(offset + 5);
36
+ break;
37
+ }
38
+ offset += size;
39
+ }
40
+ }
41
+ else if (view.getUint32(0) === 0x89504e47 && view.getUint32(4) === 0x0d0a1a0a && bytes.length >= 33 && ascii(12, 4) === 'IHDR') {
42
+ mime = 'image/png';
43
+ width = view.getUint32(16);
44
+ height = view.getUint32(20);
45
+ for (let offset = 8; offset + 12 <= bytes.length;) {
46
+ const size = view.getUint32(offset);
47
+ if (offset + size + 12 > bytes.length)
48
+ throw new Error('图片损坏');
49
+ if (ascii(offset + 4, 4) === 'acTL')
50
+ throw new Error('请选择静态图片');
51
+ offset += size + 12;
52
+ }
53
+ }
54
+ else if (ascii(0, 4) === 'RIFF' && ascii(8, 4) === 'WEBP' && bytes.length >= 30) {
55
+ mime = 'image/webp';
56
+ const kind = ascii(12, 4);
57
+ if (kind === 'VP8X') {
58
+ if ((bytes[20] & 2) !== 0)
59
+ throw new Error('请选择静态图片');
60
+ width = 1 + bytes[24] + (bytes[25] << 8) + (bytes[26] << 16);
61
+ height = 1 + bytes[27] + (bytes[28] << 8) + (bytes[29] << 16);
62
+ }
63
+ else if (kind === 'VP8 ' && bytes[23] === 0x9d && bytes[24] === 0x01 && bytes[25] === 0x2a) {
64
+ width = view.getUint16(26, true) & 0x3fff;
65
+ height = view.getUint16(28, true) & 0x3fff;
66
+ }
67
+ else if (kind === 'VP8L' && bytes[20] === 0x2f) {
68
+ const bits = view.getUint32(21, true);
69
+ width = (bits & 0x3fff) + 1;
70
+ height = ((bits >>> 14) & 0x3fff) + 1;
71
+ }
72
+ }
73
+ const edge = upload ? 16384 : 4096, pixels = upload ? 50_000_000 : 16_000_000;
74
+ if (width < 1 || height < 1 || width > edge || height > edge || width * height > pixels)
75
+ throw new Error('请选择尺寸合适的 JPEG、PNG 或静态 WebP 图片');
76
+ return { width, height, mime };
77
+ }
78
+ export async function avatarPreview(file) {
79
+ if (file.size > AVATAR_SOURCE_MAX_BYTES)
80
+ throw new Error('图片不能超过 20 MB');
81
+ const bytes = new Uint8Array(await file.arrayBuffer());
82
+ const info = avatarImageDimensions(bytes);
83
+ const source = await createImageBitmap(new Blob([bytes], { type: info.mime }), {
84
+ imageOrientation: 'from-image', colorSpaceConversion: 'default',
85
+ });
86
+ const scale = Math.min(1, 2048 / Math.max(source.width, source.height));
87
+ if (scale === 1)
88
+ return source;
89
+ try {
90
+ return await createImageBitmap(source, { resizeWidth: Math.max(1, Math.round(source.width * scale)), resizeHeight: Math.max(1, Math.round(source.height * scale)), resizeQuality: 'high' });
91
+ }
92
+ finally {
93
+ source.close();
94
+ }
95
+ }
96
+ export function initialAvatarCrop(source) {
97
+ const edge = Math.min(source.width, source.height);
98
+ return { edge, x: (source.width - edge) / 2, y: (source.height - edge) / 2 };
99
+ }
100
+ export function avatarCropRectangle(source, crop) {
101
+ if (![crop.edge, crop.x, crop.y].every(Number.isFinite))
102
+ throw new Error('裁剪区域无效');
103
+ const edge = Math.max(1, Math.min(source.width, source.height, crop.edge));
104
+ return { edge, x: Math.max(0, Math.min(source.width - edge, crop.x)), y: Math.max(0, Math.min(source.height - edge, crop.y)) };
105
+ }
106
+ export function drawAvatarCrop(canvas, source, crop) {
107
+ const context = canvas.getContext('2d', { alpha: false, colorSpace: 'srgb' });
108
+ if (context === null)
109
+ throw new Error('当前浏览器无法处理图片');
110
+ const { edge, x, y } = avatarCropRectangle(source, crop);
111
+ context.fillStyle = '#fff';
112
+ context.fillRect(0, 0, canvas.width, canvas.height);
113
+ context.drawImage(source, x, y, edge, edge, 0, 0, canvas.width, canvas.height);
114
+ }
115
+ export async function avatarJpeg(source, crop) {
116
+ const canvas = document.createElement('canvas');
117
+ canvas.width = 512;
118
+ canvas.height = 512;
119
+ try {
120
+ drawAvatarCrop(canvas, source, crop);
121
+ for (const quality of [0.9, 0.85, 0.8]) {
122
+ const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/jpeg', quality));
123
+ if (blob === null || blob.size > AVATAR_UPLOAD_MAX_BYTES)
124
+ continue;
125
+ const bytes = new Uint8Array(await blob.arrayBuffer());
126
+ let binary = '';
127
+ for (let offset = 0; offset < bytes.length; offset += 8192)
128
+ binary += String.fromCharCode(...bytes.subarray(offset, offset + 8192));
129
+ return btoa(binary);
130
+ }
131
+ throw new Error('图片压缩失败,请换一张照片');
132
+ }
133
+ finally {
134
+ canvas.width = 0;
135
+ canvas.height = 0;
136
+ }
137
+ }
138
+ /** Scan every GIF block before handing the bounded animation to a browser. */
139
+ function boundedGifDimensions(bytes) {
140
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
141
+ const width = view.getUint16(6, true), height = view.getUint16(8, true);
142
+ if (width < 1 || height < 1 || width > 4096 || height > 4096 || width * height > 16_000_000)
143
+ throw new Error('avatar_dimensions');
144
+ let offset = 13 + ((bytes[10] & 128) === 0 ? 0 : 3 * (1 << ((bytes[10] & 7) + 1)));
145
+ let frames = 0;
146
+ const blocks = () => {
147
+ for (;;) {
148
+ if (offset >= bytes.length)
149
+ throw new Error('avatar_gif_truncated');
150
+ const length = bytes[offset++];
151
+ if (length === 0)
152
+ return;
153
+ offset += length;
154
+ if (offset > bytes.length)
155
+ throw new Error('avatar_gif_truncated');
156
+ }
157
+ };
158
+ while (offset < bytes.length) {
159
+ const marker = bytes[offset++];
160
+ if (marker === 0x3b) {
161
+ if (frames < 1)
162
+ throw new Error('avatar_gif_empty');
163
+ return { width, height, mime: 'image/gif' };
164
+ }
165
+ if (marker === 0x21) {
166
+ if (offset >= bytes.length)
167
+ throw new Error('avatar_gif_truncated');
168
+ offset++;
169
+ blocks();
170
+ }
171
+ else if (marker === 0x2c) {
172
+ if (offset + 9 > bytes.length)
173
+ throw new Error('avatar_gif_truncated');
174
+ const x = view.getUint16(offset, true), y = view.getUint16(offset + 2, true);
175
+ const w = view.getUint16(offset + 4, true), h = view.getUint16(offset + 6, true);
176
+ if (w < 1 || h < 1 || x + w > width || y + h > height)
177
+ throw new Error('avatar_gif_frame');
178
+ const packed = bytes[offset + 8];
179
+ offset += 9 + ((packed & 128) === 0 ? 0 : 3 * (1 << ((packed & 7) + 1)));
180
+ if (offset >= bytes.length || bytes[offset] < 2 || bytes[offset] > 8)
181
+ throw new Error('avatar_gif_lzw');
182
+ offset++;
183
+ blocks();
184
+ frames++;
185
+ if (frames > 120 || width * height * frames > 24_000_000)
186
+ throw new Error('avatar_gif_limit');
187
+ }
188
+ else
189
+ throw new Error('avatar_gif_block');
190
+ }
191
+ throw new Error('avatar_gif_truncated');
192
+ }
193
+ //# sourceMappingURL=avatar-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-image.js","sourceRoot":"","sources":["../../../src/client/avatar-image.ts"],"names":[],"mappings":"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"}