@arcblock/did-connect-service 4.1.29 → 4.1.31

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 (46) hide show
  1. package/dist/_generated/asset-bytes.js +1 -1
  2. package/dist/_generated/asset-manifest.js +1 -1
  3. package/dist/assets/{admin-extra.d12f05bb.js → admin-extra.8243c7f4.js} +12 -3
  4. package/dist/handlers/branding-handler.d.ts.map +1 -1
  5. package/dist/handlers/branding-handler.js +37 -1
  6. package/dist/handlers/branding-handler.js.map +1 -1
  7. package/dist/og/templates.d.ts +4 -0
  8. package/dist/og/templates.d.ts.map +1 -1
  9. package/dist/og/templates.js +313 -34
  10. package/dist/og/templates.js.map +1 -1
  11. package/dist/og/worker.d.ts +29 -0
  12. package/dist/og/worker.d.ts.map +1 -1
  13. package/dist/og/worker.js +79 -2
  14. package/dist/og/worker.js.map +1 -1
  15. package/dist/pages/admin/scripts/cropper.d.ts +1 -1
  16. package/dist/pages/admin/scripts/cropper.d.ts.map +1 -1
  17. package/dist/pages/admin/scripts/cropper.js +12 -3
  18. package/dist/pages/admin/scripts/cropper.js.map +1 -1
  19. package/package.json +5 -5
  20. package/dist/assets/admin-core.1fc3260c.js +0 -1623
  21. package/dist/assets/admin-core.5a2d69b0.js +0 -2067
  22. package/dist/assets/admin-core.9fff6042.js +0 -2083
  23. package/dist/assets/admin-core.a13c2729.js +0 -1461
  24. package/dist/assets/admin-core.a63bbc69.js +0 -1464
  25. package/dist/assets/admin-core.c0b5af61.js +0 -1393
  26. package/dist/assets/admin-core.cbbdbe6d.js +0 -1465
  27. package/dist/assets/admin-core.e83fd379.js +0 -1397
  28. package/dist/assets/admin-extra.143b5774.js +0 -2543
  29. package/dist/assets/admin-extra.35b91f98.js +0 -2543
  30. package/dist/assets/admin-extra.531b187f.js +0 -2552
  31. package/dist/assets/admin-extra.5b309e5e.js +0 -2547
  32. package/dist/assets/admin-extra.7ca9c16b.js +0 -2529
  33. package/dist/assets/admin-extra.841b2bbe.js +0 -2530
  34. package/dist/assets/admin-extra.afcb3651.js +0 -2528
  35. package/dist/assets/admin.c26bb17a.css +0 -2219
  36. package/dist/assets/admin.dfeedbe4.css +0 -2229
  37. package/dist/assets/login.0bf3d739.js +0 -720
  38. package/dist/assets/login.4404e695.js +0 -720
  39. package/dist/assets/login.76c483c2.js +0 -720
  40. package/dist/assets/login.bb9f8b03.js +0 -720
  41. package/dist/assets/login.d3f05790.js +0 -720
  42. package/dist/assets/login.fa25f37a.js +0 -720
  43. package/dist/http/security-headers.d.ts +0 -38
  44. package/dist/http/security-headers.d.ts.map +0 -1
  45. package/dist/http/security-headers.js +0 -67
  46. package/dist/http/security-headers.js.map +0 -1
@@ -8,6 +8,8 @@ export declare const OG_WORKER_FONT_KEYS: {
8
8
  };
9
9
  export type OgWorkerLocale = keyof typeof OG_WORKER_FONT_KEYS;
10
10
  export type OgWorkerCacheStatus = "HIT" | "MISS" | "BYPASS";
11
+ /** Why a stored logo was not embedded, for the `og-render` observer event. */
12
+ export type OgWorkerLogoSkipReason = "unsupported-format";
11
13
  export interface OgWorkerFontBucket {
12
14
  get(key: string): Promise<{
13
15
  arrayBuffer(): Promise<ArrayBuffer>;
@@ -17,14 +19,32 @@ export interface OgWorkerCache {
17
19
  match(request: Request): Promise<Response | undefined>;
18
20
  put(request: Request, response: Response): Promise<void>;
19
21
  }
22
+ /** Raw bytes of a stored branding logo, read directly from bucket storage
23
+ * (e.g. CONNECT_BUCKET) — never fetched over the network. */
24
+ export interface OgWorkerLogoAsset {
25
+ bytes: Uint8Array;
26
+ contentType: string;
27
+ }
20
28
  export interface OgWorkerRenderEvent {
21
29
  locale: OgWorkerLocale;
22
30
  cacheStatus: OgWorkerCacheStatus;
23
31
  durationMs: number;
32
+ /** Set when a stored logo existed but could not be embedded — see
33
+ * {@link resolveOgWorkerLogoDataUri}. */
34
+ logoSkipped?: OgWorkerLogoSkipReason;
24
35
  }
25
36
  export interface OgWorkerRenderOptions extends Omit<OgGenerateOptions, "format" | "cacheDir" | "tmpDir"> {
26
37
  locale: string;
27
38
  instanceDid: string;
39
+ /**
40
+ * Lazily reads the instance's branding logo bytes directly from bucket
41
+ * storage — never a network fetch (arc/did#220: `cover`/`background` stay
42
+ * blanked below precisely because THEY can be request-controlled `https://`
43
+ * input; the logo cannot, it is the instance's own branding asset). Called
44
+ * only on a cache MISS so a cache HIT never touches the bucket. Returns
45
+ * null/undefined when no logo is stored for this instance.
46
+ */
47
+ loadLogoAsset?: () => Promise<OgWorkerLogoAsset | null | undefined>;
28
48
  }
29
49
  export interface OgWorkerRenderResult {
30
50
  body: Uint8Array;
@@ -41,5 +61,14 @@ export interface CreateOgWorkerRendererOptions {
41
61
  export declare function normalizeOgLocale(locale: string | undefined): OgWorkerLocale;
42
62
  /** Test isolation for exercising retry after a rejected initialization promise. */
43
63
  export declare function resetOgWorkerWasmForTesting(): void;
64
+ /**
65
+ * Resolves a stored branding-logo asset to a satori/resvg-compatible data
66
+ * URI, or reports why it could not be embedded. Exported so the format
67
+ * decision is unit-testable without a full satori/resvg render.
68
+ */
69
+ export declare function resolveOgWorkerLogoDataUri(asset: OgWorkerLogoAsset | null | undefined): {
70
+ dataUri?: string;
71
+ skipped?: OgWorkerLogoSkipReason;
72
+ };
44
73
  export declare function createOgWorkerRenderer(options: CreateOgWorkerRendererOptions): OgWorkerRenderer;
45
74
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/og/worker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AACzD,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAC9D,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IACvD,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACtG,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACjD;AASD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAe5E;AAYD,mFAAmF;AACnF,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAiCD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,gBAAgB,CAuE/F"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/og/worker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AACzD,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAC9D,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC5D,8EAA8E;AAC9E,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IACvD,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;8DAC8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB;8CAC0C;IAC1C,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACtG,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACjD;AASD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAe5E;AAYD,mFAAmF;AACnF,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAuED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAC1C;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;CAAE,CAcxD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,gBAAgB,CA8F/F"}
package/dist/og/worker.js CHANGED
@@ -71,6 +71,61 @@ function defaultCache() {
71
71
  throw new Error("Cache API unavailable");
72
72
  return cacheStorage.default;
73
73
  }
74
+ // ---------------------------------------------------------------------------
75
+ // Logo format resolution (arc/did#220)
76
+ // ---------------------------------------------------------------------------
77
+ //
78
+ // satori's <img> handling and resvg's rasterizer both decode PNG/JPEG/SVG
79
+ // data URIs — NEITHER decodes WebP. The Worker runtime has no image
80
+ // transcoder (no sharp, no libwebp binding), so a WebP-stored logo can never
81
+ // be repaired here; the format is detected from the ACTUAL bytes (never a
82
+ // possibly-stale `contentType` header) and anything unsupported falls back
83
+ // to the pre-existing transparent placeholder.
84
+ const PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
85
+ const JPEG_MAGIC = [0xff, 0xd8, 0xff];
86
+ function bytesStartWith(bytes, magic) {
87
+ if (bytes.length < magic.length)
88
+ return false;
89
+ for (let i = 0; i < magic.length; i++) {
90
+ if (bytes[i] !== magic[i])
91
+ return false;
92
+ }
93
+ return true;
94
+ }
95
+ /** SVG has no binary magic number — sniff the head as trimmed XML/tag text. */
96
+ function looksLikeSvg(bytes) {
97
+ const head = bytes.subarray(0, Math.min(bytes.length, 512));
98
+ const text = new TextDecoder("utf-8", { fatal: false }).decode(head).trimStart();
99
+ return text.startsWith("<?xml") || /^<svg[\s>]/i.test(text);
100
+ }
101
+ /** Binary-safe bytes → base64, chunk-free (fine for logo-sized assets). */
102
+ function uint8ArrayToBase64(bytes) {
103
+ let binary = "";
104
+ for (let i = 0; i < bytes.length; i++) {
105
+ binary += String.fromCharCode(bytes[i]);
106
+ }
107
+ return btoa(binary);
108
+ }
109
+ /**
110
+ * Resolves a stored branding-logo asset to a satori/resvg-compatible data
111
+ * URI, or reports why it could not be embedded. Exported so the format
112
+ * decision is unit-testable without a full satori/resvg render.
113
+ */
114
+ export function resolveOgWorkerLogoDataUri(asset) {
115
+ if (!asset || asset.bytes.byteLength === 0)
116
+ return {};
117
+ if (bytesStartWith(asset.bytes, PNG_MAGIC)) {
118
+ return { dataUri: `data:image/png;base64,${uint8ArrayToBase64(asset.bytes)}` };
119
+ }
120
+ if (bytesStartWith(asset.bytes, JPEG_MAGIC)) {
121
+ return { dataUri: `data:image/jpeg;base64,${uint8ArrayToBase64(asset.bytes)}` };
122
+ }
123
+ if (looksLikeSvg(asset.bytes)) {
124
+ return { dataUri: `data:image/svg+xml;base64,${uint8ArrayToBase64(asset.bytes)}` };
125
+ }
126
+ // WebP (RIFF….WEBP) or anything else satori/resvg cannot rasterize.
127
+ return { skipped: "unsupported-format" };
128
+ }
74
129
  export function createOgWorkerRenderer(options) {
75
130
  const observer = options.observer ?? (() => undefined);
76
131
  return {
@@ -81,17 +136,29 @@ export function createOgWorkerRenderer(options) {
81
136
  const prepared = prepareOgRender({ ...renderOptions, format: "png" });
82
137
  const params = {
83
138
  ...prepared.params,
84
- // Worker rendering performs no request-controlled remote media fetches.
139
+ // `logo` is resolved below, AFTER the cache check, so a cache HIT
140
+ // never has to read the logo bucket. Its version is carried in the
141
+ // cache key by `logoHash` (see below), not by this placeholder.
85
142
  logo: TRANSPARENT_PNG_DATA_URI,
143
+ // cover/background CAN be request-controlled (arbitrary `https://`
144
+ // input) — Worker rendering performs no request-controlled remote
145
+ // media fetches, so these stay blanked unconditionally.
86
146
  cover: prepared.params.cover ? TRANSPARENT_PNG_DATA_URI : "",
87
147
  background: "",
88
148
  };
89
149
  const instanceDidDigest = await sha256(renderOptions.instanceDid);
150
+ const logoHash = renderOptions.info.logoHash ?? "";
90
151
  const cacheHash = await sha256(stringify({
91
152
  rendererVersion: OG_WORKER_RENDERER_VERSION,
92
153
  fontKey,
93
154
  locale,
94
155
  instanceDidDigest,
156
+ // Versions the cache on the STORED logo's identity (arc/did#220) —
157
+ // derived from the branding r2Key, which changes on every
158
+ // re-upload — rather than on decoded bytes. Cheap on both cache
159
+ // HIT and MISS, and correctly busts across an upload that also
160
+ // changes supported/unsupported format.
161
+ logoHash,
95
162
  params,
96
163
  }));
97
164
  const cacheRequest = new Request(`${CACHE_ORIGIN}/${OG_WORKER_RENDERER_VERSION}/${cacheHash}`);
@@ -104,6 +171,11 @@ export function createOgWorkerRenderer(options) {
104
171
  return { body, contentType: cached.headers.get("content-type") ?? "image/png" };
105
172
  }
106
173
  }
174
+ // Cache MISS (or nocache) only past this point — the logo bucket read
175
+ // is deferred until here so a cache HIT never touches it.
176
+ const logoAsset = await renderOptions.loadLogoAsset?.();
177
+ const { dataUri: logoDataUri, skipped: logoSkipped } = resolveOgWorkerLogoDataUri(logoAsset ?? undefined);
178
+ params.logo = logoDataUri ?? TRANSPARENT_PNG_DATA_URI;
107
179
  const [font] = await Promise.all([loadFont(options.fontBucket, fontKey), ensureWasm()]);
108
180
  const tree = await getTemplate(params);
109
181
  const fontBuffer = font.slice().buffer;
@@ -133,7 +205,12 @@ export function createOgWorkerRenderer(options) {
133
205
  }
134
206
  }
135
207
  const cacheStatus = prepared.nocache ? "BYPASS" : "MISS";
136
- observer({ locale, cacheStatus, durationMs: performance.now() - startedAt });
208
+ observer({
209
+ locale,
210
+ cacheStatus,
211
+ durationMs: performance.now() - startedAt,
212
+ ...(logoSkipped ? { logoSkipped } : {}),
213
+ });
137
214
  return { body, contentType: "image/png" };
138
215
  },
139
216
  };
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/og/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/og/worker.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * Flow: handleLogoFile() → validate → SVG bypass or openCropper() → crop → upload
5
5
  */
6
- export declare const CROPPER_SCRIPT = "\n// \u2500\u2500\u2500 Crop aspect ratios per logo type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar CROP_RATIOS = {\n 'square': 1, 'square-dark': 1, 'favicon': 1,\n 'rect': NaN, 'rect-dark': NaN,\n 'splash-portrait': 9/16, 'splash-landscape': 16/9,\n 'og-image': 40/21\n};\n// Target dimensions and output format per logo type\nvar CROP_OUTPUT = {\n 'square': { maxW: 512, maxH: 512, fmt: 'image/webp', q: 0.9, ext: 'webp' },\n 'square-dark': { maxW: 512, maxH: 512, fmt: 'image/webp', q: 0.9, ext: 'webp' },\n 'favicon': { maxW: 128, maxH: 128, fmt: 'image/png', q: 1, ext: 'png' },\n 'rect': { maxW: 800, maxH: 400, fmt: 'image/webp', q: 0.9, ext: 'webp' },\n 'rect-dark': { maxW: 800, maxH: 400, fmt: 'image/webp', q: 0.9, ext: 'webp' },\n 'og-image': { maxW: 1200, maxH: 630, fmt: 'image/jpeg', q: 0.85, ext: 'jpg' },\n 'splash-portrait': { maxW: 1080, maxH: 1920, fmt: 'image/webp', q: 0.85, ext: 'webp' },\n 'splash-landscape': { maxW: 1920, maxH: 1080, fmt: 'image/webp', q: 0.85, ext: 'webp' }\n};\nvar MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB\nvar ALLOWED_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/svg+xml'];\n\n// \u2500\u2500\u2500 Lazy-load cropperjs from CDN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar __cropperLoaded = false;\nfunction loadCropperJS() {\n if (__cropperLoaded) return Promise.resolve();\n return new Promise(function(resolve, reject) {\n var link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.2/cropper.min.css';\n document.head.appendChild(link);\n var script = document.createElement('script');\n script.src = 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.2/cropper.min.js';\n script.onload = function() { __cropperLoaded = true; resolve(); };\n script.onerror = function() { reject(new Error('CDN load failed')); };\n document.head.appendChild(script);\n });\n}\n\n// \u2500\u2500\u2500 Cropper state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar __cropper = null;\nvar __cropType = null;\n\n// \u2500\u2500\u2500 Handle file selection (entry point from branding tab) \u2500\u2500\u2500\u2500\u2500\nfunction handleLogoFile(type, input) {\n var file = input.files && input.files[0];\n input.value = ''; // reset so same file can be re-selected\n if (!file) return;\n\n // Validate file size\n if (file.size > MAX_FILE_SIZE) {\n showToast(__t('branding.fileTooLarge'), 'error');\n return;\n }\n\n // Validate file type\n if (ALLOWED_TYPES.indexOf(file.type) === -1) {\n showToast(__t('branding.invalidFormat'), 'error');\n return;\n }\n\n // SVG: skip cropper, upload directly\n if (file.type === 'image/svg+xml' || file.name.toLowerCase().endsWith('.svg')) {\n doUploadLogo(type, file);\n return;\n }\n\n // Open cropper\n openCropper(type, file);\n}\n\nfunction openCropper(type, file) {\n __cropType = type;\n\n loadCropperJS().then(function() {\n var reader = new FileReader();\n reader.onload = function(e) {\n var dialog = document.getElementById('crop-dialog');\n var img = document.getElementById('crop-image');\n if (!dialog || !img) return;\n\n img.src = e.target.result;\n\n // Destroy previous cropper instance if any\n if (__cropper) { __cropper.destroy(); __cropper = null; }\n\n dialog.showModal();\n\n // Initialize cropperjs after dialog is visible (needs layout)\n setTimeout(function() {\n var ratio = CROP_RATIOS[type];\n __cropper = new Cropper(img, {\n aspectRatio: isNaN(ratio) ? NaN : ratio,\n viewMode: 1,\n autoCrop: true,\n autoCropArea: 1,\n responsive: true,\n background: false,\n guides: true,\n center: true,\n highlight: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n toggleDragModeOnDblclick: false,\n });\n }, 100);\n };\n reader.readAsDataURL(file);\n }).catch(function(err) {\n // CDN load failed \u2014 fallback to direct upload\n console.warn('Cropper load failed:', err);\n showToast(__t('branding.cropperLoadFailed'), 'error');\n doUploadLogo(type, file);\n });\n}\n\nfunction confirmCrop() {\n if (!__cropper || !__cropType) return;\n var output = CROP_OUTPUT[__cropType] || { maxW: 512, maxH: 512, fmt: 'image/webp', q: 0.9, ext: 'webp' };\n\n // Get cropped canvas at target dimensions (resize during crop for best quality)\n var canvas = __cropper.getCroppedCanvas({\n maxWidth: output.maxW,\n maxHeight: output.maxH,\n imageSmoothingEnabled: true,\n imageSmoothingQuality: 'high',\n });\n if (!canvas) {\n showToast(__t('branding.uploadError'), 'error');\n closeCropDialog();\n return;\n }\n\n // Show uploading state in dialog\n var actions = document.querySelector('#crop-dialog .dialog-actions');\n var content = document.querySelector('#crop-dialog .crop-toolbar');\n if (actions) actions.innerHTML = '<div style=\"display:flex;align-items:center;gap:12px;width:100%;justify-content:center;\"><div class=\"crop-progress\" style=\"flex:1;max-width:200px;\"><div class=\"crop-progress-bar\"></div></div><span style=\"font-size:13px;color:var(--text-secondary);\">' + __t('common.upload') + '...</span></div>';\n if (content) content.style.opacity = '0.5';\n\n canvas.toBlob(function(blob) {\n if (!blob) {\n showToast(__t('branding.uploadError'), 'error');\n closeCropDialog();\n return;\n }\n var file = new File([blob], __cropType + '.' + output.ext, { type: output.fmt });\n doUploadLogo(__cropType, file).then(function() {\n closeCropDialog();\n }).catch(function() {\n closeCropDialog();\n });\n }, output.fmt, output.q);\n}\n\nfunction cancelCrop() {\n closeCropDialog();\n}\n\nfunction closeCropDialog() {\n var dialog = document.getElementById('crop-dialog');\n if (dialog && dialog.open) dialog.close();\n if (__cropper) { __cropper.destroy(); __cropper = null; }\n __cropType = null;\n // Restore dialog actions and toolbar to initial state\n var actions = document.querySelector('#crop-dialog .dialog-actions');\n if (actions) actions.innerHTML = '<button class=\"btn btn-secondary\" onclick=\"cancelCrop()\">' + __t('branding.cropCancel') + '</button><button class=\"btn\" onclick=\"confirmCrop()\">' + __t('branding.cropConfirm') + '</button>';\n var toolbar = document.querySelector('#crop-dialog .crop-toolbar');\n if (toolbar) toolbar.style.opacity = '';\n}\n\n// \u2500\u2500\u2500 Toolbar actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction cropZoomIn() { if (__cropper) __cropper.zoom(0.1); }\nfunction cropZoomOut() { if (__cropper) __cropper.zoom(-0.1); }\nfunction cropRotateLeft() { if (__cropper) __cropper.rotate(-90); }\nfunction cropRotateRight() { if (__cropper) __cropper.rotate(90); }\nfunction cropFlipH() {\n if (!__cropper) return;\n var d = __cropper.getData();\n __cropper.scaleX(d.scaleX === -1 ? 1 : -1);\n}\nfunction cropFlipV() {\n if (!__cropper) return;\n var d = __cropper.getData();\n __cropper.scaleY(d.scaleY === -1 ? 1 : -1);\n}\n";
6
+ export declare const CROPPER_SCRIPT = "\n// \u2500\u2500\u2500 Crop aspect ratios per logo type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar CROP_RATIOS = {\n 'square': 1, 'square-dark': 1, 'favicon': 1,\n 'rect': NaN, 'rect-dark': NaN,\n 'splash-portrait': 9/16, 'splash-landscape': 16/9,\n 'og-image': 40/21\n};\n// Target dimensions and output format per logo type.\n// 'square'/'square-dark' output PNG, not WebP (arc/did#220): they are the\n// only logo variants the og-worker Cloudflare Worker renderer embeds\n// directly into the OG card, and satori/resvg's <img> handling accepts\n// PNG/JPEG/SVG data URIs \u2014 NOT WebP. The Worker has no image-transcoding\n// library (no sharp/libwebp), so a WebP upload can never be repaired at\n// render time; producing PNG here, in the browser, at crop time is the only\n// place in this pipeline where a format conversion is actually free (canvas\n// decodes WebP natively; encoding non-WebP output is what avoids needing\n// the missing decoder later). Every other logo type still ships WebP.\nvar CROP_OUTPUT = {\n 'square': { maxW: 512, maxH: 512, fmt: 'image/png', q: 1, ext: 'png' },\n 'square-dark': { maxW: 512, maxH: 512, fmt: 'image/png', q: 1, ext: 'png' },\n 'favicon': { maxW: 128, maxH: 128, fmt: 'image/png', q: 1, ext: 'png' },\n 'rect': { maxW: 800, maxH: 400, fmt: 'image/webp', q: 0.9, ext: 'webp' },\n 'rect-dark': { maxW: 800, maxH: 400, fmt: 'image/webp', q: 0.9, ext: 'webp' },\n 'og-image': { maxW: 1200, maxH: 630, fmt: 'image/jpeg', q: 0.85, ext: 'jpg' },\n 'splash-portrait': { maxW: 1080, maxH: 1920, fmt: 'image/webp', q: 0.85, ext: 'webp' },\n 'splash-landscape': { maxW: 1920, maxH: 1080, fmt: 'image/webp', q: 0.85, ext: 'webp' }\n};\nvar MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB\nvar ALLOWED_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/svg+xml'];\n\n// \u2500\u2500\u2500 Lazy-load cropperjs from CDN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar __cropperLoaded = false;\nfunction loadCropperJS() {\n if (__cropperLoaded) return Promise.resolve();\n return new Promise(function(resolve, reject) {\n var link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.2/cropper.min.css';\n document.head.appendChild(link);\n var script = document.createElement('script');\n script.src = 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.2/cropper.min.js';\n script.onload = function() { __cropperLoaded = true; resolve(); };\n script.onerror = function() { reject(new Error('CDN load failed')); };\n document.head.appendChild(script);\n });\n}\n\n// \u2500\u2500\u2500 Cropper state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar __cropper = null;\nvar __cropType = null;\n\n// \u2500\u2500\u2500 Handle file selection (entry point from branding tab) \u2500\u2500\u2500\u2500\u2500\nfunction handleLogoFile(type, input) {\n var file = input.files && input.files[0];\n input.value = ''; // reset so same file can be re-selected\n if (!file) return;\n\n // Validate file size\n if (file.size > MAX_FILE_SIZE) {\n showToast(__t('branding.fileTooLarge'), 'error');\n return;\n }\n\n // Validate file type\n if (ALLOWED_TYPES.indexOf(file.type) === -1) {\n showToast(__t('branding.invalidFormat'), 'error');\n return;\n }\n\n // SVG: skip cropper, upload directly\n if (file.type === 'image/svg+xml' || file.name.toLowerCase().endsWith('.svg')) {\n doUploadLogo(type, file);\n return;\n }\n\n // Open cropper\n openCropper(type, file);\n}\n\nfunction openCropper(type, file) {\n __cropType = type;\n\n loadCropperJS().then(function() {\n var reader = new FileReader();\n reader.onload = function(e) {\n var dialog = document.getElementById('crop-dialog');\n var img = document.getElementById('crop-image');\n if (!dialog || !img) return;\n\n img.src = e.target.result;\n\n // Destroy previous cropper instance if any\n if (__cropper) { __cropper.destroy(); __cropper = null; }\n\n dialog.showModal();\n\n // Initialize cropperjs after dialog is visible (needs layout)\n setTimeout(function() {\n var ratio = CROP_RATIOS[type];\n __cropper = new Cropper(img, {\n aspectRatio: isNaN(ratio) ? NaN : ratio,\n viewMode: 1,\n autoCrop: true,\n autoCropArea: 1,\n responsive: true,\n background: false,\n guides: true,\n center: true,\n highlight: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n toggleDragModeOnDblclick: false,\n });\n }, 100);\n };\n reader.readAsDataURL(file);\n }).catch(function(err) {\n // CDN load failed \u2014 fallback to direct upload\n console.warn('Cropper load failed:', err);\n showToast(__t('branding.cropperLoadFailed'), 'error');\n doUploadLogo(type, file);\n });\n}\n\nfunction confirmCrop() {\n if (!__cropper || !__cropType) return;\n var output = CROP_OUTPUT[__cropType] || { maxW: 512, maxH: 512, fmt: 'image/webp', q: 0.9, ext: 'webp' };\n\n // Get cropped canvas at target dimensions (resize during crop for best quality)\n var canvas = __cropper.getCroppedCanvas({\n maxWidth: output.maxW,\n maxHeight: output.maxH,\n imageSmoothingEnabled: true,\n imageSmoothingQuality: 'high',\n });\n if (!canvas) {\n showToast(__t('branding.uploadError'), 'error');\n closeCropDialog();\n return;\n }\n\n // Show uploading state in dialog\n var actions = document.querySelector('#crop-dialog .dialog-actions');\n var content = document.querySelector('#crop-dialog .crop-toolbar');\n if (actions) actions.innerHTML = '<div style=\"display:flex;align-items:center;gap:12px;width:100%;justify-content:center;\"><div class=\"crop-progress\" style=\"flex:1;max-width:200px;\"><div class=\"crop-progress-bar\"></div></div><span style=\"font-size:13px;color:var(--text-secondary);\">' + __t('common.upload') + '...</span></div>';\n if (content) content.style.opacity = '0.5';\n\n canvas.toBlob(function(blob) {\n if (!blob) {\n showToast(__t('branding.uploadError'), 'error');\n closeCropDialog();\n return;\n }\n var file = new File([blob], __cropType + '.' + output.ext, { type: output.fmt });\n doUploadLogo(__cropType, file).then(function() {\n closeCropDialog();\n }).catch(function() {\n closeCropDialog();\n });\n }, output.fmt, output.q);\n}\n\nfunction cancelCrop() {\n closeCropDialog();\n}\n\nfunction closeCropDialog() {\n var dialog = document.getElementById('crop-dialog');\n if (dialog && dialog.open) dialog.close();\n if (__cropper) { __cropper.destroy(); __cropper = null; }\n __cropType = null;\n // Restore dialog actions and toolbar to initial state\n var actions = document.querySelector('#crop-dialog .dialog-actions');\n if (actions) actions.innerHTML = '<button class=\"btn btn-secondary\" onclick=\"cancelCrop()\">' + __t('branding.cropCancel') + '</button><button class=\"btn\" onclick=\"confirmCrop()\">' + __t('branding.cropConfirm') + '</button>';\n var toolbar = document.querySelector('#crop-dialog .crop-toolbar');\n if (toolbar) toolbar.style.opacity = '';\n}\n\n// \u2500\u2500\u2500 Toolbar actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction cropZoomIn() { if (__cropper) __cropper.zoom(0.1); }\nfunction cropZoomOut() { if (__cropper) __cropper.zoom(-0.1); }\nfunction cropRotateLeft() { if (__cropper) __cropper.rotate(-90); }\nfunction cropRotateRight() { if (__cropper) __cropper.rotate(90); }\nfunction cropFlipH() {\n if (!__cropper) return;\n var d = __cropper.getData();\n __cropper.scaleX(d.scaleX === -1 ? 1 : -1);\n}\nfunction cropFlipV() {\n if (!__cropper) return;\n var d = __cropper.getData();\n __cropper.scaleY(d.scaleY === -1 ? 1 : -1);\n}\n";
7
7
  export declare function cropDialogHTML(t: (key: string) => string): string;
8
8
  //# sourceMappingURL=cropper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cropper.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/cropper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,eAAO,MAAM,cAAc,swPAyL1B,CAAC;AAEF,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAsBjE"}
1
+ {"version":3,"file":"cropper.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/cropper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,eAAO,MAAM,cAAc,46QAkM1B,CAAC;AAEF,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAsBjE"}
@@ -18,10 +18,19 @@ var CROP_RATIOS = {
18
18
  'splash-portrait': 9/16, 'splash-landscape': 16/9,
19
19
  'og-image': 40/21
20
20
  };
21
- // Target dimensions and output format per logo type
21
+ // Target dimensions and output format per logo type.
22
+ // 'square'/'square-dark' output PNG, not WebP (arc/did#220): they are the
23
+ // only logo variants the og-worker Cloudflare Worker renderer embeds
24
+ // directly into the OG card, and satori/resvg's <img> handling accepts
25
+ // PNG/JPEG/SVG data URIs — NOT WebP. The Worker has no image-transcoding
26
+ // library (no sharp/libwebp), so a WebP upload can never be repaired at
27
+ // render time; producing PNG here, in the browser, at crop time is the only
28
+ // place in this pipeline where a format conversion is actually free (canvas
29
+ // decodes WebP natively; encoding non-WebP output is what avoids needing
30
+ // the missing decoder later). Every other logo type still ships WebP.
22
31
  var CROP_OUTPUT = {
23
- 'square': { maxW: 512, maxH: 512, fmt: 'image/webp', q: 0.9, ext: 'webp' },
24
- 'square-dark': { maxW: 512, maxH: 512, fmt: 'image/webp', q: 0.9, ext: 'webp' },
32
+ 'square': { maxW: 512, maxH: 512, fmt: 'image/png', q: 1, ext: 'png' },
33
+ 'square-dark': { maxW: 512, maxH: 512, fmt: 'image/png', q: 1, ext: 'png' },
25
34
  'favicon': { maxW: 128, maxH: 128, fmt: 'image/png', q: 1, ext: 'png' },
26
35
  'rect': { maxW: 800, maxH: 400, fmt: 'image/webp', q: 0.9, ext: 'webp' },
27
36
  'rect-dark': { maxW: 800, maxH: 400, fmt: 'image/webp', q: 0.9, ext: 'webp' },
@@ -1 +1 @@
1
- {"version":3,"file":"cropper.js","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/cropper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,2CAA2C;AAC3C,MAAM,YAAY,GAAG,4OAA4O,CAAC;AAClQ,MAAM,aAAa,GAAG,sMAAsM,CAAC;AAC7N,MAAM,gBAAgB,GAAG,mKAAmK,CAAC;AAC7L,MAAM,iBAAiB,GAAG,wKAAwK,CAAC;AACnM,MAAM,WAAW,GAAG,iMAAiM,CAAC;AACtN,MAAM,WAAW,GAAG,iMAAiM,CAAC;AAEtN,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyLtC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO,UAAU,CAAC;;;sCAGkB,CAAC,CAAC,oBAAoB,CAAC;;;;;2FAK8B,YAAY;6FACV,aAAa;mGACP,gBAAgB;qGACd,iBAAiB;kGACpB,WAAW;gGACb,WAAW;;;;+DAI5C,CAAC,CAAC,qBAAqB,CAAC;kDACrC,CAAC,CAAC,sBAAsB,CAAC;;UAEjE,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"cropper.js","sourceRoot":"","sources":["../../../../src/pages/admin/scripts/cropper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,2CAA2C;AAC3C,MAAM,YAAY,GAAG,4OAA4O,CAAC;AAClQ,MAAM,aAAa,GAAG,sMAAsM,CAAC;AAC7N,MAAM,gBAAgB,GAAG,mKAAmK,CAAC;AAC7L,MAAM,iBAAiB,GAAG,wKAAwK,CAAC;AACnM,MAAM,WAAW,GAAG,iMAAiM,CAAC;AACtN,MAAM,WAAW,GAAG,iMAAiM,CAAC;AAEtN,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkMtC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO,UAAU,CAAC;;;sCAGkB,CAAC,CAAC,oBAAoB,CAAC;;;;;2FAK8B,YAAY;6FACV,aAAa;mGACP,gBAAgB;qGACd,iBAAiB;kGACpB,WAAW;gGACb,WAAW;;;;+DAI5C,CAAC,CAAC,qBAAqB,CAAC;kDACrC,CAAC,CAAC,sBAAsB,CAAC;;UAEjE,CAAC;AACX,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/did-connect-service",
3
- "version": "4.1.29",
3
+ "version": "4.1.31",
4
4
  "description": "Multi-runtime authentication service framework — Passkey, DID Connect, OAuth, Email, Team, RBAC",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -58,13 +58,11 @@
58
58
  "fast-json-stable-stringify": "^2.1.0",
59
59
  "hono": "^4.13.5",
60
60
  "satori": "^0.26.0",
61
- "satori-html": "^0.3.2",
62
61
  "sharp": "^0.35.4",
63
62
  "ufo": "^1.6.4",
64
- "ultrahtml": "^1.6.0",
65
63
  "valibot": "^1.4.2",
66
- "@arcblock/did-connect-core": "^4.1.29",
67
- "@arcblock/did-connect-js": "^4.1.29"
64
+ "@arcblock/did-connect-core": "^4.1.31",
65
+ "@arcblock/did-connect-js": "^4.1.31"
68
66
  },
69
67
  "optionalDependencies": {
70
68
  "@aigne/afs": "^1.11.0-beta.13"
@@ -74,6 +72,8 @@
74
72
  "@types/better-sqlite3": "^7.6.13",
75
73
  "better-sqlite3": "^12.8.0",
76
74
  "esbuild": "^0.28.1",
75
+ "miniflare": "^4.20260317.0",
76
+ "ultrahtml": "^1.6.0",
77
77
  "vitest": "^4.1.11"
78
78
  },
79
79
  "files": [