@ai-matrx/media 0.10.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/files/engine/cache/register-service-worker.js +1 -1
- package/dist/files/engine/cache/register-service-worker.js.map +1 -1
- package/dist/files/engine/redux/thunks.js +1 -1
- package/dist/files/engine/redux/thunks.js.map +1 -1
- package/dist/files/engine/support/logger.js +1 -1
- package/dist/files/engine/support/logger.js.map +1 -1
- package/dist/files/engine/upload/tusUpload.js +1 -1
- package/dist/files/engine/upload/tusUpload.js.map +1 -1
- package/dist/files/engine/upload/uploadGuardOpeners.js +1 -1
- package/dist/files/engine/upload/uploadGuardOpeners.js.map +1 -1
- package/dist/react.cjs +3 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +3 -2
- package/dist/react.js.map +1 -1
- package/dist/share.cjs +3 -8
- package/dist/share.cjs.map +1 -1
- package/dist/share.js +3 -8
- package/dist/share.js.map +1 -1
- package/dist/viewers.cjs +3 -2
- package/dist/viewers.cjs.map +1 -1
- package/dist/viewers.js +3 -2
- package/dist/viewers.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @ai-matrx/media
|
|
2
2
|
|
|
3
|
+
## 0.10.1
|
|
4
|
+
|
|
5
|
+
AP-2 (2026-10-07) — the kit and Alchemy doors are the only doors in this package (aidream guard `apps/shared/scripts/check-shared-doors.mjs`). `ViewerCopyButton`, the media share popover and `InlineMediaRef`'s URL copy write through `@ai-matrx/kit/clipboard` `copyText`; a refused copy leaves the button un-flipped. No consumer action.
|
|
6
|
+
|
|
3
7
|
## 0.10.0
|
|
4
8
|
|
|
5
9
|
New subpath `@ai-matrx/media/voices` (P16): the Cartesia read-aloud voice catalogue
|
|
@@ -9,7 +9,7 @@ function registerBlobCacheServiceWorker(args) {
|
|
|
9
9
|
if (typeof window === "undefined" || !("serviceWorker" in navigator)) {
|
|
10
10
|
return null;
|
|
11
11
|
}
|
|
12
|
-
const isProd =
|
|
12
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
13
13
|
const devOptIn = typeof window !== "undefined" && window.localStorage?.getItem("matrx_dev_sw") === "1";
|
|
14
14
|
if (!isProd && !devOptIn && !args.force) {
|
|
15
15
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/files/engine/cache/register-service-worker.ts"],"sourcesContent":["/**\n * features/files/cache/register-service-worker.ts\n *\n * Register the blob-cache Service Worker (`/blob-sw.js`) and push the\n * current backend URL + signed-in user id into it. The SW intercepts\n * cloud-files byte fetches (and registered CDN / share-link URLs) and\n * serves them from IndexedDB when present, falling through to the\n * network otherwise.\n *\n * Called from `app/DeferredSingletons.tsx` (a Client Component) on idle\n * after auth boot, so SSR is unaffected and registration doesn't block\n * the first paint.\n *\n * Dev-mode guards:\n * - Disabled by default in development (`NODE_ENV !== 'production'`)\n * to avoid HMR interference with Next's RSC cache.\n * - Opt-in via `localStorage.matrx_dev_sw = '1'` for local testing.\n *\n * iOS Safari / private-browsing failure modes are tolerated silently —\n * if `navigator.serviceWorker` is undefined or `register()` rejects,\n * the app continues to function with just the in-memory LRU + IDB tiers\n * (no transparent `<img src>` interception).\n */\n\nconst SW_URL = \"/blob-sw.js\";\n\nlet registrationPromise: Promise<ServiceWorkerRegistration | null> | null = null;\n\n/**\n * Register the SW and (when ready) send the initial `set-config` message\n * with the backend URL and signed-in user id. Returns the registration\n * (or null when SW isn't supported / registration failed).\n *\n * Idempotent — subsequent calls reuse the in-flight promise.\n */\nexport function registerBlobCacheServiceWorker(args: {\n backendUrl: string;\n userId: string | null;\n /** When true, force-register even in dev. */\n force?: boolean;\n}): Promise<ServiceWorkerRegistration | null> {\n if (registrationPromise) {\n void postSetConfig(args).catch(() => undefined);\n return registrationPromise;\n }\n registrationPromise = (async () => {\n if (typeof window === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return null;\n }\n const isProd = process.env.NODE_ENV === \"production\";\n const devOptIn =\n typeof window !== \"undefined\" &&\n window.localStorage?.getItem(\"matrx_dev_sw\") === \"1\";\n if (!isProd && !devOptIn && !args.force) {\n return null;\n }\n try {\n const reg = await navigator.serviceWorker.register(SW_URL, {\n scope: \"/\",\n });\n // Push config as soon as we have a controller — covers fresh\n // registrations (where the controller may not be set yet) by also\n // listening on `controllerchange`.\n void postSetConfig(args);\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n void postSetConfig(args);\n });\n return reg;\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[blob-cache-sw] registration failed\", err);\n return null;\n }\n })();\n return registrationPromise;\n}\n\nasync function postSetConfig(args: {\n backendUrl: string;\n userId: string | null;\n}): Promise<void> {\n const target =\n navigator.serviceWorker.controller ??\n (await navigator.serviceWorker.ready.then((r) => r.active));\n if (!target) return;\n // NEXT_PUBLIC_FILES_URL: when set, file/share downloads go to the standalone\n // matrx-files service; tell the SW so it caches those the same as backend\n // downloads. Read from env here so no call site needs to thread it through.\n const filesUrl = (process.env.NEXT_PUBLIC_FILES_URL as string | undefined) || undefined;\n target.postMessage({\n kind: \"set-config\",\n backendUrl: args.backendUrl.replace(/\\/$/, \"\"),\n filesUrl: filesUrl ? filesUrl.replace(/\\/$/, \"\") : undefined,\n userId: args.userId,\n });\n}\n\n/**\n * Imperative invalidation. Drops every cached version of a fileId in the\n * SW's IDB tier. Called from invalidate() in features/files/hooks/blob-cache.ts.\n */\nexport async function postBlobCacheInvalidate(fileId: string): Promise<void> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return;\n }\n const ctrl = navigator.serviceWorker.controller;\n if (!ctrl) return;\n ctrl.postMessage({ kind: \"invalidate\", fileId });\n}\n\n/**\n * Per-user wipe. Called from sign-out.\n */\nexport async function postBlobCacheClearUser(userId: string): Promise<void> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return;\n }\n const ctrl = navigator.serviceWorker.controller;\n if (!ctrl) return;\n ctrl.postMessage({ kind: \"clear-user\", userId });\n}\n\n/**\n * Register a (canonical-URL → fileId+version+checksum) mapping so the SW\n * can recognize a public CDN URL or other byte URL the page has issued\n * and serve it from the same cache entry as the canonical\n * `/files/{id}/download` URL.\n */\nexport async function postBlobCacheRegisterUrlMapping(args: {\n url: string;\n fileId: string;\n version: number | null;\n checksum: string | null;\n}): Promise<void> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return;\n }\n const ctrl = navigator.serviceWorker.controller;\n if (!ctrl) return;\n ctrl.postMessage({\n kind: \"register-url-mapping\",\n url: args.url,\n fileId: args.fileId,\n version: args.version,\n checksum: args.checksum,\n });\n}\n"],"mappings":"AAwBA,MAAM,SAAS;AAEf,IAAI,sBAAwE;AASrE,SAAS,+BAA+B,MAKD;AAC5C,MAAI,qBAAqB;AACvB,SAAK,cAAc,IAAI,EAAE,MAAM,MAAM,MAAS;AAC9C,WAAO;AAAA,EACT;AACA,yBAAuB,YAAY;AACjC,QAAI,OAAO,WAAW,eAAe,EAAE,mBAAmB,YAAY;AACpE,aAAO;AAAA,IACT;AACA,UAAM,SAAS;
|
|
1
|
+
{"version":3,"sources":["../../../../src/files/engine/cache/register-service-worker.ts"],"sourcesContent":["/**\n * features/files/cache/register-service-worker.ts\n *\n * Register the blob-cache Service Worker (`/blob-sw.js`) and push the\n * current backend URL + signed-in user id into it. The SW intercepts\n * cloud-files byte fetches (and registered CDN / share-link URLs) and\n * serves them from IndexedDB when present, falling through to the\n * network otherwise.\n *\n * Called from `app/DeferredSingletons.tsx` (a Client Component) on idle\n * after auth boot, so SSR is unaffected and registration doesn't block\n * the first paint.\n *\n * Dev-mode guards:\n * - Disabled by default in development (`NODE_ENV !== 'production'`)\n * to avoid HMR interference with Next's RSC cache.\n * - Opt-in via `localStorage.matrx_dev_sw = '1'` for local testing.\n *\n * iOS Safari / private-browsing failure modes are tolerated silently —\n * if `navigator.serviceWorker` is undefined or `register()` rejects,\n * the app continues to function with just the in-memory LRU + IDB tiers\n * (no transparent `<img src>` interception).\n */\n\nconst SW_URL = \"/blob-sw.js\";\n\nlet registrationPromise: Promise<ServiceWorkerRegistration | null> | null = null;\n\n/**\n * Register the SW and (when ready) send the initial `set-config` message\n * with the backend URL and signed-in user id. Returns the registration\n * (or null when SW isn't supported / registration failed).\n *\n * Idempotent — subsequent calls reuse the in-flight promise.\n */\nexport function registerBlobCacheServiceWorker(args: {\n backendUrl: string;\n userId: string | null;\n /** When true, force-register even in dev. */\n force?: boolean;\n}): Promise<ServiceWorkerRegistration | null> {\n if (registrationPromise) {\n void postSetConfig(args).catch(() => undefined);\n return registrationPromise;\n }\n registrationPromise = (async () => {\n if (typeof window === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return null;\n }\n const isProd = process.env.NODE_ENV === \"production\";\n const devOptIn =\n typeof window !== \"undefined\" &&\n window.localStorage?.getItem(\"matrx_dev_sw\") === \"1\";\n if (!isProd && !devOptIn && !args.force) {\n return null;\n }\n try {\n const reg = await navigator.serviceWorker.register(SW_URL, {\n scope: \"/\",\n });\n // Push config as soon as we have a controller — covers fresh\n // registrations (where the controller may not be set yet) by also\n // listening on `controllerchange`.\n void postSetConfig(args);\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n void postSetConfig(args);\n });\n return reg;\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[blob-cache-sw] registration failed\", err);\n return null;\n }\n })();\n return registrationPromise;\n}\n\nasync function postSetConfig(args: {\n backendUrl: string;\n userId: string | null;\n}): Promise<void> {\n const target =\n navigator.serviceWorker.controller ??\n (await navigator.serviceWorker.ready.then((r) => r.active));\n if (!target) return;\n // NEXT_PUBLIC_FILES_URL: when set, file/share downloads go to the standalone\n // matrx-files service; tell the SW so it caches those the same as backend\n // downloads. Read from env here so no call site needs to thread it through.\n const filesUrl = (process.env.NEXT_PUBLIC_FILES_URL as string | undefined) || undefined;\n target.postMessage({\n kind: \"set-config\",\n backendUrl: args.backendUrl.replace(/\\/$/, \"\"),\n filesUrl: filesUrl ? filesUrl.replace(/\\/$/, \"\") : undefined,\n userId: args.userId,\n });\n}\n\n/**\n * Imperative invalidation. Drops every cached version of a fileId in the\n * SW's IDB tier. Called from invalidate() in features/files/hooks/blob-cache.ts.\n */\nexport async function postBlobCacheInvalidate(fileId: string): Promise<void> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return;\n }\n const ctrl = navigator.serviceWorker.controller;\n if (!ctrl) return;\n ctrl.postMessage({ kind: \"invalidate\", fileId });\n}\n\n/**\n * Per-user wipe. Called from sign-out.\n */\nexport async function postBlobCacheClearUser(userId: string): Promise<void> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return;\n }\n const ctrl = navigator.serviceWorker.controller;\n if (!ctrl) return;\n ctrl.postMessage({ kind: \"clear-user\", userId });\n}\n\n/**\n * Register a (canonical-URL → fileId+version+checksum) mapping so the SW\n * can recognize a public CDN URL or other byte URL the page has issued\n * and serve it from the same cache entry as the canonical\n * `/files/{id}/download` URL.\n */\nexport async function postBlobCacheRegisterUrlMapping(args: {\n url: string;\n fileId: string;\n version: number | null;\n checksum: string | null;\n}): Promise<void> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return;\n }\n const ctrl = navigator.serviceWorker.controller;\n if (!ctrl) return;\n ctrl.postMessage({\n kind: \"register-url-mapping\",\n url: args.url,\n fileId: args.fileId,\n version: args.version,\n checksum: args.checksum,\n });\n}\n"],"mappings":"AAwBA,MAAM,SAAS;AAEf,IAAI,sBAAwE;AASrE,SAAS,+BAA+B,MAKD;AAC5C,MAAI,qBAAqB;AACvB,SAAK,cAAc,IAAI,EAAE,MAAM,MAAM,MAAS;AAC9C,WAAO;AAAA,EACT;AACA,yBAAuB,YAAY;AACjC,QAAI,OAAO,WAAW,eAAe,EAAE,mBAAmB,YAAY;AACpE,aAAO;AAAA,IACT;AACA,UAAM,SAAS,yBAAyB;AACxC,UAAM,WACJ,OAAO,WAAW,eAClB,OAAO,cAAc,QAAQ,cAAc,MAAM;AACnD,QAAI,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,OAAO;AACvC,aAAO;AAAA,IACT;AACA,QAAI;AACF,YAAM,MAAM,MAAM,UAAU,cAAc,SAAS,QAAQ;AAAA,QACzD,OAAO;AAAA,MACT,CAAC;AAID,WAAK,cAAc,IAAI;AACvB,gBAAU,cAAc,iBAAiB,oBAAoB,MAAM;AACjE,aAAK,cAAc,IAAI;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,KAAK;AAEZ,cAAQ,KAAK,uCAAuC,GAAG;AACvD,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AACH,SAAO;AACT;AAEA,eAAe,cAAc,MAGX;AAChB,QAAM,SACJ,UAAU,cAAc,cACvB,MAAM,UAAU,cAAc,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM;AAC3D,MAAI,CAAC,OAAQ;AAIb,QAAM,WAAY,QAAQ,IAAI,yBAAgD;AAC9E,SAAO,YAAY;AAAA,IACjB,MAAM;AAAA,IACN,YAAY,KAAK,WAAW,QAAQ,OAAO,EAAE;AAAA,IAC7C,UAAU,WAAW,SAAS,QAAQ,OAAO,EAAE,IAAI;AAAA,IACnD,QAAQ,KAAK;AAAA,EACf,CAAC;AACH;AAMA,eAAsB,wBAAwB,QAA+B;AAC3E,MAAI,OAAO,cAAc,eAAe,EAAE,mBAAmB,YAAY;AACvE;AAAA,EACF;AACA,QAAM,OAAO,UAAU,cAAc;AACrC,MAAI,CAAC,KAAM;AACX,OAAK,YAAY,EAAE,MAAM,cAAc,OAAO,CAAC;AACjD;AAKA,eAAsB,uBAAuB,QAA+B;AAC1E,MAAI,OAAO,cAAc,eAAe,EAAE,mBAAmB,YAAY;AACvE;AAAA,EACF;AACA,QAAM,OAAO,UAAU,cAAc;AACrC,MAAI,CAAC,KAAM;AACX,OAAK,YAAY,EAAE,MAAM,cAAc,OAAO,CAAC;AACjD;AAQA,eAAsB,gCAAgC,MAKpC;AAChB,MAAI,OAAO,cAAc,eAAe,EAAE,mBAAmB,YAAY;AACvE;AAAA,EACF;AACA,QAAM,OAAO,UAAU,cAAc;AACrC,MAAI,CAAC,KAAM;AACX,OAAK,YAAY;AAAA,IACf,MAAM;AAAA,IACN,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd,UAAU,KAAK;AAAA,EACjB,CAAC;AACH;","names":[]}
|
|
@@ -443,7 +443,7 @@ const createFolder = createAsyncThunk("cloudFiles/createFolder", async (arg, { d
|
|
|
443
443
|
);
|
|
444
444
|
return folder.id;
|
|
445
445
|
} catch (err) {
|
|
446
|
-
if (
|
|
446
|
+
if (process.env.NODE_ENV !== "production") {
|
|
447
447
|
const e = err;
|
|
448
448
|
console.error("[createFolder] backend error", {
|
|
449
449
|
status: e.status ?? null,
|