@awiki/dsh-plugin 0.3.17 → 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.
- package/README.md +4 -0
- package/THIRD_PARTY_NOTICES.md +6 -0
- package/lib/client.js +3543 -746
- package/lib/client.js.map +1 -1
- package/lib/index.js +218 -41
- package/lib/{sdk-adapter-DGcTiEZz.mjs → package-version.generated-D0MSDRZn.mjs} +83 -10
- package/lib/provider.js +5 -3
- package/lib/typert.host.js +481 -127
- package/lib/typert.remote-client.d.ts +9 -3
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +481 -127
- package/lib/types/client/AwikiAvatar.d.ts +40 -0
- package/lib/types/client/AwikiAvatar.d.ts.map +1 -0
- package/lib/types/client/AwikiAvatar.js +201 -0
- package/lib/types/client/AwikiAvatar.js.map +1 -0
- package/lib/types/client/AwikiAvatarEditor.d.ts +11 -0
- package/lib/types/client/AwikiAvatarEditor.d.ts.map +1 -0
- package/lib/types/client/AwikiAvatarEditor.js +113 -0
- package/lib/types/client/AwikiAvatarEditor.js.map +1 -0
- package/lib/types/client/AwikiAvatarPreview.d.ts +8 -0
- package/lib/types/client/AwikiAvatarPreview.d.ts.map +1 -0
- package/lib/types/client/AwikiAvatarPreview.js +68 -0
- package/lib/types/client/AwikiAvatarPreview.js.map +1 -0
- package/lib/types/client/AwikiGroupDetails.js +2 -2
- package/lib/types/client/AwikiGroupDetails.js.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.d.ts +1 -0
- package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.js +10 -2
- package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
- package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
- package/lib/types/client/AwikiOverlay.js +92 -27
- package/lib/types/client/AwikiOverlay.js.map +1 -1
- package/lib/types/client/AwikiProfileCard.d.ts +1 -1
- package/lib/types/client/AwikiProfileCard.d.ts.map +1 -1
- package/lib/types/client/AwikiProfileCard.js +6 -2
- package/lib/types/client/AwikiProfileCard.js.map +1 -1
- package/lib/types/client/avatar-cache.d.ts +24 -0
- package/lib/types/client/avatar-cache.d.ts.map +1 -0
- package/lib/types/client/avatar-cache.js +336 -0
- package/lib/types/client/avatar-cache.js.map +1 -0
- package/lib/types/client/avatar-dialog.d.ts +3 -0
- package/lib/types/client/avatar-dialog.d.ts.map +1 -0
- package/lib/types/client/avatar-dialog.js +18 -0
- package/lib/types/client/avatar-dialog.js.map +1 -0
- package/lib/types/client/avatar-image.d.ts +26 -0
- package/lib/types/client/avatar-image.d.ts.map +1 -0
- package/lib/types/client/avatar-image.js +193 -0
- package/lib/types/client/avatar-image.js.map +1 -0
- package/lib/types/client/controller.d.ts +30 -4
- package/lib/types/client/controller.d.ts.map +1 -1
- package/lib/types/client/controller.js +267 -56
- package/lib/types/client/controller.js.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +10 -2
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/slots.d.ts +12 -3
- package/lib/types/client/slots.d.ts.map +1 -1
- package/lib/types/conversation-preferences.d.ts.map +1 -1
- package/lib/types/conversation-preferences.js +27 -0
- package/lib/types/conversation-preferences.js.map +1 -1
- package/lib/types/index.d.ts +8 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +76 -11
- package/lib/types/index.js.map +1 -1
- package/lib/types/listener.d.ts.map +1 -1
- package/lib/types/listener.js +9 -8
- package/lib/types/listener.js.map +1 -1
- package/lib/types/package-version.generated.d.ts +2 -2
- package/lib/types/package-version.generated.js +2 -2
- package/lib/types/provider-api.d.ts +9 -3
- package/lib/types/provider-api.d.ts.map +1 -1
- package/lib/types/provider.d.ts.map +1 -1
- package/lib/types/provider.js +5 -2
- package/lib/types/provider.js.map +1 -1
- package/lib/types/sdk-adapter.d.ts +6 -3
- package/lib/types/sdk-adapter.d.ts.map +1 -1
- package/lib/types/sdk-adapter.js +58 -7
- package/lib/types/sdk-adapter.js.map +1 -1
- package/lib/types/tenant-registry.d.ts +2 -0
- package/lib/types/tenant-registry.d.ts.map +1 -1
- package/lib/types/tenant-registry.js +83 -16
- package/lib/types/tenant-registry.js.map +1 -1
- package/lib/types/types.d.ts +63 -7
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js.map +1 -1
- package/lib/types/update-policy.d.ts +2 -2
- 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 @@
|
|
|
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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"}
|