@powerhousedao/connect 6.2.2-dev.7 → 6.2.2-dev.71
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/assets/document-icon-192x192.png +0 -0
- package/assets/document-icon-512x512.png +0 -0
- package/assets/pwa-192x192.png +0 -0
- package/assets/pwa-512x512-maskable.png +0 -0
- package/assets/pwa-512x512.png +0 -0
- package/dist/{AddDriveModal-MMHlkJBJ.js → AddDriveModal-Bw0YuxZg.js} +5 -5
- package/dist/AddDriveModal-Bw0YuxZg.js.map +1 -0
- package/dist/{ClearStorageModal-BxOW6Sr6.js → ClearStorageModal-DmiwJfjx.js} +4 -4
- package/dist/{ClearStorageModal-BxOW6Sr6.js.map → ClearStorageModal-DmiwJfjx.js.map} +1 -1
- package/dist/ConfirmDocumentUpgradeModal-9AaaQJTs.js +114 -0
- package/dist/ConfirmDocumentUpgradeModal-9AaaQJTs.js.map +1 -0
- package/dist/{CookiesPolicyModal-CkcUKPLb.js → CookiesPolicyModal-CQ-zHJdw.js} +3 -3
- package/dist/{CookiesPolicyModal-CkcUKPLb.js.map → CookiesPolicyModal-CQ-zHJdw.js.map} +1 -1
- package/dist/{CreateDocumentModal-CvsTh0HM.js → CreateDocumentModal-NNi4p6EI.js} +7 -5
- package/dist/CreateDocumentModal-NNi4p6EI.js.map +1 -0
- package/dist/{DebugSettingsModal-BGB0gcLr.js → DebugSettingsModal-D2q-1Xby.js} +6 -6
- package/dist/{DebugSettingsModal-BGB0gcLr.js.map → DebugSettingsModal-D2q-1Xby.js.map} +1 -1
- package/dist/{DeleteDriveModal-DSTK8FYk.js → DeleteDriveModal-C7fnXMsR.js} +4 -4
- package/dist/{DeleteDriveModal-DSTK8FYk.js.map → DeleteDriveModal-C7fnXMsR.js.map} +1 -1
- package/dist/{DeleteItemModal-B2nJmjsP.js → DeleteItemModal-BK_Y8Thj.js} +4 -4
- package/dist/{DeleteItemModal-B2nJmjsP.js.map → DeleteItemModal-BK_Y8Thj.js.map} +1 -1
- package/dist/{DisclaimerModal-D5FO34u9.js → DisclaimerModal-DJPHCnFY.js} +3 -3
- package/dist/{DisclaimerModal-D5FO34u9.js.map → DisclaimerModal-DJPHCnFY.js.map} +1 -1
- package/dist/DocumentVersionUnsupportedModal-tBHLK6b1.js +32 -0
- package/dist/DocumentVersionUnsupportedModal-tBHLK6b1.js.map +1 -0
- package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js → DownloadDocumentWithErrorsModal-sWu46HVB.js} +3 -3
- package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js.map → DownloadDocumentWithErrorsModal-sWu46HVB.js.map} +1 -1
- package/dist/DriveAuthRequiredModal-D3IPAst0.js +36 -0
- package/dist/DriveAuthRequiredModal-D3IPAst0.js.map +1 -0
- package/dist/{DriveSettingsModal-kR3hQnh4.js → DriveSettingsModal-7OKx8foy.js} +3 -3
- package/dist/{DriveSettingsModal-kR3hQnh4.js.map → DriveSettingsModal-7OKx8foy.js.map} +1 -1
- package/dist/{InspectorModal-C8APjWYF.js → InspectorModal-BgApx7ur.js} +6 -6
- package/dist/{InspectorModal-C8APjWYF.js.map → InspectorModal-BgApx7ur.js.map} +1 -1
- package/dist/LoginModal-Cd2wGgG4.js +75 -0
- package/dist/LoginModal-Cd2wGgG4.js.map +1 -0
- package/dist/{MissingPackageModal-BQcCQbOn.js → MissingPackageModal-DyP2-Ojb.js} +18 -6
- package/dist/MissingPackageModal-DyP2-Ojb.js.map +1 -0
- package/dist/OpenFileDocumentsModal-CAFbXTmx.js +311 -0
- package/dist/OpenFileDocumentsModal-CAFbXTmx.js.map +1 -0
- package/dist/{SettingsModal-BFck2YNG.js → SettingsModal-BZnjF_A6.js} +26 -13
- package/dist/SettingsModal-BZnjF_A6.js.map +1 -0
- package/dist/{UpgradeDriveModal-BZGSE9_r.js → UpgradeDriveModal-wo5oO9mg.js} +3 -3
- package/dist/{UpgradeDriveModal-BZGSE9_r.js.map → UpgradeDriveModal-wo5oO9mg.js.map} +1 -1
- package/dist/app-loader-Ch-e1R89.js +4 -0
- package/dist/{app-loader-BI9LbEnT.js → app-loader-vZLUx3U8.js} +458 -89
- package/dist/app-loader-vZLUx3U8.js.map +1 -0
- package/dist/{build-info-B8h78xbQ.js → build-info-fcQg8qgk.js} +5 -5
- package/dist/{build-info-B8h78xbQ.js.map → build-info-fcQg8qgk.js.map} +1 -1
- package/dist/components-BDoJ49ZU.js +5 -0
- package/dist/{connect.config-vgUeFoNp.js → connect.config-C-b_Yhd6.js} +9 -4
- package/dist/connect.config-C-b_Yhd6.js.map +1 -0
- package/dist/{connection-state-DO_2lAEJ.js → connection-state-KCa1yljA.js} +4 -4
- package/dist/{connection-state-DO_2lAEJ.js.map → connection-state-KCa1yljA.js.map} +1 -1
- package/dist/{load-_dpLo8DZ.js → load-DFeCrWSo.js} +10 -10
- package/dist/{load-_dpLo8DZ.js.map → load-DFeCrWSo.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-B9IyLCZE.js → package-BgL6OawM.js} +10 -5
- package/dist/package-BgL6OawM.js.map +1 -0
- package/dist/{pglite-seed-z3B1JA38.js → pglite-seed-DRXPe7p-.js} +4 -4
- package/dist/{pglite-seed-z3B1JA38.js.map → pglite-seed-DRXPe7p-.js.map} +1 -1
- package/dist/pwa-manifest-link-CG8UajMz.js +34 -0
- package/dist/pwa-manifest-link-CG8UajMz.js.map +1 -0
- package/dist/{reactor-DpVQKcX7.js → reactor-nQjmz4AJ.js} +179 -40
- package/dist/reactor-nQjmz4AJ.js.map +1 -0
- package/dist/reactor.worker.js +11 -6
- package/dist/reactor.worker.js.map +1 -1
- package/dist/{registerServiceWorker-nJIc0yEY.js → registerServiceWorker-Bn1KWmk0.js} +6 -4
- package/dist/registerServiceWorker-Bn1KWmk0.js.map +1 -0
- package/dist/{reload-connect-toast-D1Iqw9E_.js → reload-connect-toast-DDQEupCN.js} +23 -5
- package/dist/{reload-connect-toast-D1Iqw9E_.js.map → reload-connect-toast-DDQEupCN.js.map} +1 -1
- package/dist/start-connect.js +1 -1
- package/dist/style.css +100 -7
- package/dist/{toast-4t-VimvD.js → toast-CO6ChlzE.js} +8 -5
- package/dist/toast-CO6ChlzE.js.map +1 -0
- package/dist/use-renown-login-BtGljnB4.js +52 -0
- package/dist/use-renown-login-BtGljnB4.js.map +1 -0
- package/dist/useRegistryPackages-DMhCvTWq.js +314 -0
- package/dist/useRegistryPackages-DMhCvTWq.js.map +1 -0
- package/package.json +18 -13
- package/dist/AddDriveModal-MMHlkJBJ.js.map +0 -1
- package/dist/CreateDocumentModal-CvsTh0HM.js.map +0 -1
- package/dist/DriveAuthRequiredModal-BA2vS3oF.js +0 -40
- package/dist/DriveAuthRequiredModal-BA2vS3oF.js.map +0 -1
- package/dist/MissingPackageModal-BQcCQbOn.js.map +0 -1
- package/dist/SettingsModal-BFck2YNG.js.map +0 -1
- package/dist/app-loader-BAjPPbXx.js +0 -4
- package/dist/app-loader-BI9LbEnT.js.map +0 -1
- package/dist/components-D5-Rnhml.js +0 -5
- package/dist/connect.config-vgUeFoNp.js.map +0 -1
- package/dist/package-B9IyLCZE.js.map +0 -1
- package/dist/reactor-DpVQKcX7.js.map +0 -1
- package/dist/registerServiceWorker-nJIc0yEY.js.map +0 -1
- package/dist/toast-4t-VimvD.js.map +0 -1
- package/dist/useRegistryPackages-BaYtekjQ.js +0 -179
- package/dist/useRegistryPackages-BaYtekjQ.js.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ba8bf22d-5244-5de2-9ac8-dd11a020fe00")}catch(e){}}();
|
|
3
3
|
import { r as loadRuntimeConfig, t as applyConnectBranding } from "./runtime-config-DL3QjcfM.js";
|
|
4
|
-
import { r as setUser, t as ReloadConnectToast } from "./reload-connect-toast-
|
|
5
|
-
import { t as package_default } from "./package-
|
|
6
|
-
import { r as connectConfig } from "./connect.config-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { n as
|
|
10
|
-
import {
|
|
4
|
+
import { r as setUser, t as ReloadConnectToast } from "./reload-connect-toast-DDQEupCN.js";
|
|
5
|
+
import { t as package_default } from "./package-BgL6OawM.js";
|
|
6
|
+
import { r as connectConfig } from "./connect.config-C-b_Yhd6.js";
|
|
7
|
+
import { n as createReactor } from "./reactor-nQjmz4AJ.js";
|
|
8
|
+
import { a as detectReactorPgMajor, i as detectMigrationMajor } from "./connection-state-KCa1yljA.js";
|
|
9
|
+
import { n as seedPendingPgVersion } from "./pglite-seed-DRXPe7p-.js";
|
|
10
|
+
import { r as toast } from "./toast-CO6ChlzE.js";
|
|
11
11
|
import { createElement, useEffect } from "react";
|
|
12
12
|
import { initTheme, useUser } from "@powerhousedao/reactor-browser";
|
|
13
13
|
import { logger } from "document-model";
|
|
@@ -96,5 +96,5 @@ async function loadComponent(localPackage) {
|
|
|
96
96
|
//#endregion
|
|
97
97
|
export { loadComponent };
|
|
98
98
|
|
|
99
|
-
//# sourceMappingURL=load-
|
|
100
|
-
//# debugId=
|
|
99
|
+
//# sourceMappingURL=load-DFeCrWSo.js.map
|
|
100
|
+
//# debugId=ba8bf22d-5244-5de2-9ac8-dd11a020fe00
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-
|
|
1
|
+
{"version":3,"file":"load-DFeCrWSo.js","sources":["../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { isLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { logger } from \"document-model\";\nimport { createElement, useEffect } from \"react\";\nimport { ReloadConnectToast } from \"../components/reload-connect-toast.js\";\n\nexport const useCheckLatestVersion = () => {\n async function checkLatestVersion() {\n const result = await isLatestVersion();\n if (result === null) return;\n // ignore dev/staging versions\n if (result.isLatest || result.currentVersion.includes(\"-\")) {\n return true;\n }\n\n if (\n import.meta.env.MODE === \"development\" ||\n connectConfig.studioMode ||\n !connectConfig.warnOutdatedApp\n ) {\n logger.warn(\n \"Connect is outdated: \\nCurrent: @currentVersion\\nLatest: @latestVersion\",\n result.currentVersion,\n result.latestVersion,\n );\n } else {\n toast(createElement(ReloadConnectToast), {\n type: \"connect-warning\",\n toastId: \"outdated-app\",\n autoClose: false,\n });\n }\n }\n\n useEffect(() => {\n checkLatestVersion().catch(console.error);\n }, []);\n};\n","import { packageJson } from \"../utils/package-json.js\";\n\nexport const isMac = window.navigator.appVersion.includes(\"Mac\");\n\nconst urlBranchMap: Record<string, string> = {\n \"staging/makerdao\": \"deployments/staging/makerdao\",\n \"staging/arbitrum\": \"arb-ltip\",\n \"staging/powerhouse\": \"staging\",\n makerdao: \"deployments/makerdao\",\n arbitrum: \"deployments/arbitrum\",\n arbgrants: \"deployments/arbitrum\",\n localhost: \"develop\",\n};\n\nconst getGithubLinkFromUrl = () => {\n const githubLink = \"https://raw.githubusercontent.com/powerhouse-inc/connect\";\n const url = window.location.href;\n\n const env = Object.keys(urlBranchMap).find((env) => url.includes(env));\n const value = env ? urlBranchMap[env] : undefined;\n if (!value) {\n return undefined;\n } else {\n return `${githubLink}/${value}/package.json`;\n }\n};\n\nconst fetchLatestVersion = async () => {\n const link = getGithubLinkFromUrl();\n if (!link) {\n return undefined;\n }\n const result = await fetch(link);\n const data = (await result.json()) as { version: string };\n const { version } = data;\n return version;\n};\n\nexport const isLatestVersion = async () => {\n const currentVersion = packageJson.version;\n const deployed = await fetchLatestVersion();\n\n if (deployed) {\n return {\n isLatest: deployed === currentVersion,\n currentVersion,\n latestVersion: deployed,\n };\n }\n\n return null;\n};\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\nimport { setUser as setSentryUser } from \"../services/sentry.js\";\n\nexport function useSetSentryUser() {\n const user = useUser();\n useEffect(() => {\n let sentryUser: SentryUser | null = null;\n if (user) {\n // saves the user info except the credential\n const { credential: _credential, ...rest } = user;\n sentryUser = { id: rest.did, username: rest.ens?.name, ...rest };\n }\n setSentryUser(sentryUser);\n }, [user]);\n}\n","import { useCheckLatestVersion } from \"@powerhousedao/connect/hooks\";\nimport \"@powerhousedao/connect/i18n\";\nimport { createReactor, useSetSentryUser } from \"@powerhousedao/connect/store\";\nimport {\n detectMigrationMajor,\n detectReactorPgMajor,\n seedPendingPgVersion,\n} from \"@powerhousedao/connect/utils\";\nimport { initTheme } from \"@powerhousedao/reactor-browser\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\nimport { applyConnectBranding, loadRuntimeConfig } from \"../runtime-config.js\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await seedPendingPgVersion();\n await Promise.all([detectReactorPgMajor(), detectMigrationMajor()]);\n const runtimeConfig = await loadRuntimeConfig();\n applyConnectBranding(runtimeConfig);\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n initTheme();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSetSentryUser();\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"names":["packageJson"],"mappings":";;;;;;;;;;;;;;AAOA,MAAa,8BAA8B;CACzC,eAAe,qBAAqB;EAClC,MAAM,SAAS,MAAM,iBAAiB;AACtC,MAAI,WAAW,KAAM;AAErB,MAAI,OAAO,YAAY,OAAO,eAAe,SAAS,IAAI,CACxD,QAAO;AAGT,MACE,OAAO,KAAK,IAAI,SAAS,iBACzB,cAAc,cACd,CAAC,cAAc,gBAEf,QAAO,KACL,2EACA,OAAO,gBACP,OAAO,cACR;MAED,OAAM,cAAc,mBAAmB,EAAE;GACvC,MAAM;GACN,SAAS;GACT,WAAW;GACZ,CAAC;;AAIN,iBAAgB;AACd,sBAAoB,CAAC,MAAM,QAAQ,MAAM;IACxC,EAAE,CAAC;;ACnCa,OAAO,UAAU,WAAW,SAAS,MAAM;AAEhE,MAAM,eAAuC;CAC3C,oBAAoB;CACpB,oBAAoB;CACpB,sBAAsB;CACtB,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACZ;AAED,MAAM,6BAA6B;CACjC,MAAM,aAAa;CACnB,MAAM,MAAM,OAAO,SAAS;CAE5B,MAAM,MAAM,OAAO,KAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,SAAS,IAAI,CAAC;CACtE,MAAM,QAAQ,MAAM,aAAa,OAAO,KAAA;AACxC,KAAI,CAAC,MACH;KAEA,QAAO,GAAG,WAAW,GAAG,MAAM;;AAIlC,MAAM,qBAAqB,YAAY;CACrC,MAAM,OAAO,sBAAsB;AACnC,KAAI,CAAC,KACH;CAIF,MAAM,EAAE,YADM,OADC,MAAM,MAAM,KAAK,EACL,MAAM;AAEjC,QAAO;;AAGT,MAAa,kBAAkB,YAAY;CACzC,MAAM,iBAAiBA,gBAAY;CACnC,MAAM,WAAW,MAAM,oBAAoB;AAE3C,KAAI,SACF,QAAO;EACL,UAAU,aAAa;EACvB;EACA,eAAe;EAChB;AAGH,QAAO;;;;AC7CT,SAAgB,mBAAmB;CACjC,MAAM,OAAO,SAAS;AACtB,iBAAgB;EACd,IAAI,aAAgC;AACpC,MAAI,MAAM;GAER,MAAM,EAAE,YAAY,aAAa,GAAG,SAAS;AAC7C,gBAAa;IAAE,IAAI,KAAK;IAAK,UAAU,KAAK,KAAK;IAAM,GAAG;IAAM;;AAElE,UAAc,WAAW;IACxB,CAAC,KAAK,CAAC;;;;ACFZ,eAAsB,cAAc,cAAiC;AACnE,OAAM,sBAAsB;AAC5B,OAAM,QAAQ,IAAI,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CAAC;AAEnE,sBADsB,MAAM,mBAAmB,CACZ;AACnC,OAAM,cAAc,aAAa;AACjC,QAAO,EACL,UAAU,EAAE,eAAyC;AACnD,aAAW;AAEX,oBAAkB;AAElB,yBAAuB;AACvB,SAAO;IAEV","debug_id":"ba8bf22d-5244-5de2-9ac8-dd11a020fe00"}
|
package/dist/main.js
CHANGED
|
@@ -6,7 +6,7 @@ import { jsx } from "react/jsx-runtime";
|
|
|
6
6
|
//#region main.tsx
|
|
7
7
|
if (!window.ph) window.ph = {};
|
|
8
8
|
await loadRuntimeConfig();
|
|
9
|
-
const { AppLoader } = await import("./app-loader-
|
|
9
|
+
const { AppLoader } = await import("./app-loader-Ch-e1R89.js");
|
|
10
10
|
createRoot(document.getElementById("root")).render(/* @__PURE__ */ jsx(AppLoader, {}));
|
|
11
11
|
//#endregion
|
|
12
12
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
//#region package.json
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2b694242-5deb-5f82-8440-1d54ba9ee0ab")}catch(e){}}();
|
|
4
4
|
var package_default = {
|
|
5
5
|
name: "@powerhousedao/connect",
|
|
6
6
|
productName: "Powerhouse-Connect",
|
|
7
|
-
version: "6.2.2-dev.
|
|
7
|
+
version: "6.2.2-dev.71",
|
|
8
8
|
description: "Powerhouse Connect",
|
|
9
9
|
main: "dist/index.html",
|
|
10
10
|
type: "module",
|
|
@@ -56,7 +56,7 @@ var package_default = {
|
|
|
56
56
|
"build": "pnpm run build:bundle && pnpm run build:css",
|
|
57
57
|
"build:bundle": "tsdown",
|
|
58
58
|
"build:css": "pnpm exec tailwindcss -i style.css -o dist/style.css",
|
|
59
|
-
"build:debug": "PH_DEBUG_BUILD=true vite build",
|
|
59
|
+
"build:debug": "cross-env PH_DEBUG_BUILD=true vite build",
|
|
60
60
|
"preview": "vite preview",
|
|
61
61
|
"cy:open": "cypress open",
|
|
62
62
|
"docker:build": "docker build -f ./Dockerfile --tag connect-test-dev --build-arg TAG=dev .",
|
|
@@ -77,8 +77,11 @@ var package_default = {
|
|
|
77
77
|
"@powerhousedao/reactor-browser": "workspace:*",
|
|
78
78
|
"@powerhousedao/shared": "workspace:*",
|
|
79
79
|
"@powerhousedao/vetra": "workspace:*",
|
|
80
|
+
"@privy-io/react-auth": "3.35.0",
|
|
81
|
+
"@rainbow-me/rainbowkit": "^2.2.11",
|
|
80
82
|
"@renown/sdk": "workspace:*",
|
|
81
83
|
"@sentry/react": "^10.17.0",
|
|
84
|
+
"@tanstack/react-query": "^5.90.2",
|
|
82
85
|
"document-model": "workspace:*",
|
|
83
86
|
"i18next": "^25.5.3",
|
|
84
87
|
"kysely": "catalog:",
|
|
@@ -92,9 +95,11 @@ var package_default = {
|
|
|
92
95
|
"react-router-dom": "^6.11.2",
|
|
93
96
|
"tailwind-merge": "catalog:",
|
|
94
97
|
"usehooks-ts": "^3.1.1",
|
|
98
|
+
"wagmi": "2.19.5",
|
|
95
99
|
"zod": "catalog:"
|
|
96
100
|
},
|
|
97
101
|
devDependencies: {
|
|
102
|
+
"cross-env": "catalog:",
|
|
98
103
|
"@tailwindcss/cli": "catalog:",
|
|
99
104
|
"@tailwindcss/vite": "catalog:",
|
|
100
105
|
"@testing-library/dom": "^10.4.0",
|
|
@@ -123,5 +128,5 @@ var package_default = {
|
|
|
123
128
|
//#endregion
|
|
124
129
|
export { package_default as t };
|
|
125
130
|
|
|
126
|
-
//# sourceMappingURL=package-
|
|
127
|
-
//# debugId=
|
|
131
|
+
//# sourceMappingURL=package-BgL6OawM.js.map
|
|
132
|
+
//# debugId=2b694242-5deb-5f82-8440-1d54ba9ee0ab
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-BgL6OawM.js","sources":["../package.json"],"sourcesContent":[""],"names":[],"mappings":"","debug_id":"2b694242-5deb-5f82-8440-1d54ba9ee0ab"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
-
import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8f8cb813-98e0-5cee-93aa-17aa54301236")}catch(e){}}();
|
|
3
|
+
import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-KCa1yljA.js";
|
|
4
4
|
//#region src/utils/pglite-seed.ts
|
|
5
5
|
const PENDING_PG_SEED_KEY = "ph:pending-pg-seed";
|
|
6
6
|
/**
|
|
@@ -45,5 +45,5 @@ async function seedPendingPgVersion() {
|
|
|
45
45
|
//#endregion
|
|
46
46
|
export { seedPendingPgVersion as n, PENDING_PG_SEED_KEY as t };
|
|
47
47
|
|
|
48
|
-
//# sourceMappingURL=pglite-seed-
|
|
49
|
-
//# debugId=
|
|
48
|
+
//# sourceMappingURL=pglite-seed-DRXPe7p-.js.map
|
|
49
|
+
//# debugId=8f8cb813-98e0-5cee-93aa-17aa54301236
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pglite-seed-
|
|
1
|
+
{"version":3,"file":"pglite-seed-DRXPe7p-.js","sources":["../src/utils/pglite-seed.ts"],"sourcesContent":["import { invalidateReactorPgMajorCache } from \"./pglite-runtime.js\";\nimport { REACTOR_PGLITE_NAME } from \"./storage-namespace.js\";\n\nexport const PENDING_PG_SEED_KEY = \"ph:pending-pg-seed\";\n\n/**\n * If the Debug Inspector requested a forced PG version reset, this runs\n * before the reactor is created on the subsequent page load: opens a fresh\n * PGlite of the requested major against the reactor data dir, lets `initdb`\n * populate `PG_VERSION`, then closes. The next step of app boot then\n * detects this fresh data dir and picks the matching runtime.\n */\nexport async function seedPendingPgVersion(): Promise<void> {\n const raw = localStorage.getItem(PENDING_PG_SEED_KEY);\n if (!raw) return;\n\n const major = parseInt(raw, 10);\n console.info(`[pglite-seed] Seeding fresh PG${major} data dir...`);\n\n try {\n if (major === 16) {\n const { PGlite } = await import(\"pglite-legacy-02\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else if (major === 17) {\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else {\n console.warn(`[pglite-seed] Unsupported version ${raw}, skipping`);\n return;\n }\n console.info(`[pglite-seed] Seeded PG${major} data dir.`);\n } finally {\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n invalidateReactorPgMajorCache();\n }\n}\n"],"names":[],"mappings":";;;;AAGA,MAAa,sBAAsB;;;;;;;;AASnC,eAAsB,uBAAsC;CAC1D,MAAM,MAAM,aAAa,QAAQ,oBAAoB;AACrD,KAAI,CAAC,IAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC/B,SAAQ,KAAK,iCAAiC,MAAM,cAAc;AAElE,KAAI;AACF,MAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,sBAAsB;AACrD,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;aAET,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,sBAAsB;AACrD,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;SAEb;AACL,WAAQ,KAAK,qCAAqC,IAAI,YAAY;AAClE;;AAEF,UAAQ,KAAK,0BAA0B,MAAM,YAAY;WACjD;AACR,eAAa,WAAW,oBAAoB;AAC5C,iCAA+B","debug_id":"8f8cb813-98e0-5cee-93aa-17aa54301236"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/utils/pwa-manifest-link.ts
|
|
2
|
+
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6816b9f8-4e0c-55d2-a369-54d2e597ace3")}catch(e){}}();
|
|
4
|
+
let manifestRevision = 0;
|
|
5
|
+
/**
|
|
6
|
+
* Force the browser to re-consume `manifest.webmanifest` by replacing the
|
|
7
|
+
* `<link rel="manifest">` element with a fresh, cache-busting one. No-op when
|
|
8
|
+
* there is no DOM or no manifest link (dev mode / offline disabled — the build
|
|
9
|
+
* only injects the link when the service worker is enabled).
|
|
10
|
+
*/
|
|
11
|
+
function refreshPwaManifestLink() {
|
|
12
|
+
if (typeof document === "undefined") return;
|
|
13
|
+
const existing = document.querySelector("link[rel=\"manifest\"]");
|
|
14
|
+
if (!existing) return;
|
|
15
|
+
if (!existing.getAttribute("href")) return;
|
|
16
|
+
let href;
|
|
17
|
+
try {
|
|
18
|
+
const url = new URL(existing.href, document.baseURI);
|
|
19
|
+
url.searchParams.set("ph-manifest-rev", String(++manifestRevision));
|
|
20
|
+
href = url.toString();
|
|
21
|
+
} catch {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const link = document.createElement("link");
|
|
25
|
+
link.rel = "manifest";
|
|
26
|
+
if (existing.crossOrigin) link.crossOrigin = existing.crossOrigin;
|
|
27
|
+
link.href = href;
|
|
28
|
+
existing.replaceWith(link);
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { refreshPwaManifestLink as t };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=pwa-manifest-link-CG8UajMz.js.map
|
|
34
|
+
//# debugId=6816b9f8-4e0c-55d2-a369-54d2e597ace3
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pwa-manifest-link-CG8UajMz.js","sources":["../src/utils/pwa-manifest-link.ts"],"sourcesContent":["// After a runtime package install/removal updates the PWA fragment in\n// IndexedDB (BrowserPackageManager.#syncPwaFragments), the service worker\n// already serves an up-to-date `manifest.webmanifest` — it reads IndexedDB\n// fresh on every request. But the browser only parsed `<link rel=\"manifest\">`\n// ONCE, at page load, so its in-memory manifest (the install prompt, and the\n// manifest's declared fields as the browser reads them — visible in\n// DevTools → Application → Manifest) stays frozen until something makes it\n// re-consume. That \"something\" used to be a manual reload / service-worker\n// update.\n//\n// Re-attaching the manifest `<link>` with a fresh, cache-busting href triggers\n// Chromium's manifest-change invalidation (it recomputes the manifest URL and\n// notifies its consumers), so the install pipeline / DevTools re-fetch the\n// (dynamically served) manifest on demand — no full page reload. The SW route\n// matches on the pathname, so the extra query param doesn't change which\n// response is served, and `start_url`/`scope`/`id` are unaffected (they resolve\n// to the same directory, dropping the query).\n//\n// Caveat (unavoidable, not app-fixable): the OS-level registrations the manifest\n// drives — file associations and launch_handler — are snapshotted by the OS at\n// install time and only re-read on the browser's own throttled manifest-update\n// schedule, so those still lag. The reliable, immediate signal is the served\n// manifest itself (DevTools → Application → Manifest).\n\n// Monotonic per-session revision so each re-attach uses a distinct href (a\n// counter, not a timestamp — deterministic and dependency-free).\nlet manifestRevision = 0;\n\n/**\n * Force the browser to re-consume `manifest.webmanifest` by replacing the\n * `<link rel=\"manifest\">` element with a fresh, cache-busting one. No-op when\n * there is no DOM or no manifest link (dev mode / offline disabled — the build\n * only injects the link when the service worker is enabled).\n */\nexport function refreshPwaManifestLink(): void {\n if (typeof document === \"undefined\") return;\n const existing = document.querySelector<HTMLLinkElement>(\n 'link[rel=\"manifest\"]',\n );\n if (!existing) return;\n // An absent/empty href would resolve to the document URL (new URL(\"\", base)\n // does not throw), producing a manifest link pointing at the HTML page. Bail.\n if (!existing.getAttribute(\"href\")) return;\n\n let href: string;\n try {\n const url = new URL(existing.href, document.baseURI);\n url.searchParams.set(\"ph-manifest-rev\", String(++manifestRevision));\n href = url.toString();\n } catch {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"manifest\";\n // Preserve crossorigin (vite-plugin-pwa sets it when useCredentials is on).\n if (existing.crossOrigin) link.crossOrigin = existing.crossOrigin;\n link.href = href;\n existing.replaceWith(link);\n}\n"],"names":[],"mappings":";;;AA0BA,IAAI,mBAAmB;;;;;;;AAQvB,SAAgB,yBAA+B;AAC7C,KAAI,OAAO,aAAa,YAAa;CACrC,MAAM,WAAW,SAAS,cACxB,yBACD;AACD,KAAI,CAAC,SAAU;AAGf,KAAI,CAAC,SAAS,aAAa,OAAO,CAAE;CAEpC,IAAI;AACJ,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,SAAS,MAAM,SAAS,QAAQ;AACpD,MAAI,aAAa,IAAI,mBAAmB,OAAO,EAAE,iBAAiB,CAAC;AACnE,SAAO,IAAI,UAAU;SACf;AACN;;CAGF,MAAM,OAAO,SAAS,cAAc,OAAO;AAC3C,MAAK,MAAM;AAEX,KAAI,SAAS,YAAa,MAAK,cAAc,SAAS;AACtD,MAAK,OAAO;AACZ,UAAS,YAAY,KAAK","debug_id":"6816b9f8-4e0c-55d2-a369-54d2e597ace3"}
|
|
@@ -1,24 +1,104 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8c97280c-99f4-5190-8b2e-0b4822a0aadf")}catch(e){}}();
|
|
3
3
|
import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
|
|
4
4
|
import { a as resolvePgMajorForRuntime, r as loadPGliteModule } from "./pglite-major-B39aOEiE.js";
|
|
5
|
-
import { r as getVersion, t as getGitSha } from "./build-info-
|
|
6
|
-
import { n as buildPHGlobalConfig, o as phGlobalConfig } from "./connect.config-
|
|
7
|
-
import {
|
|
8
|
-
import { n as
|
|
5
|
+
import { r as getVersion, t as getGitSha } from "./build-info-fcQg8qgk.js";
|
|
6
|
+
import { n as buildPHGlobalConfig, o as phGlobalConfig } from "./connect.config-C-b_Yhd6.js";
|
|
7
|
+
import { t as refreshPwaManifestLink } from "./pwa-manifest-link-CG8UajMz.js";
|
|
8
|
+
import { a as detectReactorPgMajor, h as RELATIONAL_PGLITE_NAME, m as REACTOR_PGLITE_NAME, n as setWorkerConnectionStatus, o as detectRelationalPgMajor, p as REACTOR_INSTANCE_NAMESPACE } from "./connection-state-KCa1yljA.js";
|
|
9
|
+
import { r as toast } from "./toast-CO6ChlzE.js";
|
|
10
|
+
import { PWA_IDB_KEY, PWA_IDB_NAME, PWA_IDB_STORE, PWA_IDB_VERSION, mergePwaConfig, withInferredCategory } from "@powerhousedao/shared/connect";
|
|
9
11
|
import { createRelationalDb } from "@powerhousedao/shared/processors";
|
|
10
|
-
import { DocumentModelRegistry, DocumentModelResolver, ReactorEventTypes } from "@powerhousedao/reactor";
|
|
12
|
+
import { DocumentModelRegistry, DocumentModelResolver, ReactorEventTypes, createReactorHostModuleBase } from "@powerhousedao/reactor";
|
|
11
13
|
import { MessageRouter, RPC_PROTOCOL_VERSION, SyncManagerProxy, connectReactorClient, createInspectorProxy, createPortTransport, createReactorEventBusProxy, createRelationalPgliteProxy, createWorkerAdminClient, postReactorIdentity } from "@powerhousedao/reactor-browser/rpc";
|
|
12
14
|
import { Kysely } from "kysely";
|
|
13
15
|
import { PGliteDialect } from "kysely-pglite-dialect";
|
|
14
16
|
import { BrowserLocalStorage, ChannelScheme as ChannelScheme$1, DRIVE_DOCUMENT_TYPES, DocumentCache, DocumentChangeType, ReactorBuilder as ReactorBuilder$1, ReactorClientBuilder as ReactorClientBuilder$1, RegistryClient, addPHEventHandlers, addRemoteDrive, createAnalyticsStore, extractDriveSlugFromPath, extractNodeSlugFromPath, getDrives, isDriveAuthError, login, refreshReactorDataClient, setAttachmentService, setDefaultPHGlobalConfig, setDocumentCache, setDriveMetadata, setDrives, setFeatures, setPGliteDB, setPHToast, setPackageDiscoveryService, setReactorClient, setReactorClientModule, setRenown, setSelectedDrive, setSelectedNode, setVetraPackageManager, waitForDocumentReady } from "@powerhousedao/reactor-browser";
|
|
15
17
|
import { ConsoleLogger, logger, setLogLevel as setLogLevel$1 } from "document-model";
|
|
16
18
|
import { BrowserKeyStorage, RenownBuilder, RenownCryptoBuilder, createSignatureVerifier } from "@renown/sdk";
|
|
17
|
-
import {
|
|
19
|
+
import { PwaConfigSchema } from "@powerhousedao/shared/document-model";
|
|
20
|
+
import { createAttachmentClient, createRemoteAttachmentService, createXhrUploadTransport } from "@powerhousedao/reactor-attachments/client";
|
|
18
21
|
import { OpenFeature } from "@openfeature/web-sdk";
|
|
19
22
|
import * as common from "@powerhousedao/powerhouse-vetra-packages";
|
|
20
23
|
import commonPkg from "@powerhousedao/powerhouse-vetra-packages/package.json" with { type: "json" };
|
|
24
|
+
import { toCdnUrl } from "@powerhousedao/shared/registry/urls";
|
|
21
25
|
import vetraPkg from "@powerhousedao/vetra/package.json" with { type: "json" };
|
|
26
|
+
//#region src/utils/pwa-idb.ts
|
|
27
|
+
function openPwaIdb() {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const req = indexedDB.open(PWA_IDB_NAME, PWA_IDB_VERSION);
|
|
30
|
+
req.onupgradeneeded = () => {
|
|
31
|
+
if (!req.result.objectStoreNames.contains(PWA_IDB_STORE)) req.result.createObjectStore(PWA_IDB_STORE);
|
|
32
|
+
};
|
|
33
|
+
req.onerror = () => reject(req.error ?? /* @__PURE__ */ new Error("ph-pwa open failed"));
|
|
34
|
+
req.onblocked = () => reject(/* @__PURE__ */ new Error("ph-pwa open blocked"));
|
|
35
|
+
req.onsuccess = () => resolve(req.result);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Write (replace) the single merged fragment record. Best-effort: a failure to
|
|
39
|
+
* mirror the manifest must never break package installation, so callers ignore
|
|
40
|
+
* rejections. No-op when IndexedDB is unavailable (SSR/tests). */
|
|
41
|
+
async function writeMergedPwaFragment(fragment) {
|
|
42
|
+
if (typeof indexedDB === "undefined") return;
|
|
43
|
+
const db = await openPwaIdb();
|
|
44
|
+
try {
|
|
45
|
+
await new Promise((resolve, reject) => {
|
|
46
|
+
const tx = db.transaction(PWA_IDB_STORE, "readwrite");
|
|
47
|
+
tx.oncomplete = () => resolve();
|
|
48
|
+
tx.onerror = () => reject(tx.error ?? /* @__PURE__ */ new Error("PWA fragment write failed"));
|
|
49
|
+
tx.objectStore(PWA_IDB_STORE).put({
|
|
50
|
+
version: 1,
|
|
51
|
+
fragment,
|
|
52
|
+
updatedAt: Date.now()
|
|
53
|
+
}, PWA_IDB_KEY);
|
|
54
|
+
});
|
|
55
|
+
} finally {
|
|
56
|
+
db.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Resolve `src` against the package `baseUrl`, absolute srcs passing through.
|
|
60
|
+
* `baseUrl` may itself be relative (e.g. a same-origin-proxied registry, or the
|
|
61
|
+
* dev `/node_modules/…` path), so it is first made absolute against the app
|
|
62
|
+
* origin — `new URL(src, relativeBase)` would otherwise throw and silently
|
|
63
|
+
* leave the src unresolved. A malformed src is left untouched. */
|
|
64
|
+
function toAbsoluteAssetUrl(src, baseUrl) {
|
|
65
|
+
try {
|
|
66
|
+
const origin = typeof location !== "undefined" ? location.href : "http://localhost/";
|
|
67
|
+
return new URL(src, new URL(baseUrl, origin)).toString();
|
|
68
|
+
} catch {
|
|
69
|
+
return src;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function resolveIconSrc(icon, baseUrl) {
|
|
73
|
+
return {
|
|
74
|
+
...icon,
|
|
75
|
+
src: toAbsoluteAssetUrl(icon.src, baseUrl)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Rewrite a package fragment's relative asset srcs (manifest icons and
|
|
80
|
+
* file-handler icons) to absolute URLs against the package's base — a runtime
|
|
81
|
+
* package's assets live on the registry CDN, not the app origin, so the served
|
|
82
|
+
* manifest must point there. `baseUrl` null (a local/bundled package whose
|
|
83
|
+
* assets are app-origin-relative) leaves srcs untouched.
|
|
84
|
+
*/
|
|
85
|
+
function resolveFragmentAssetUrls(config, baseUrl) {
|
|
86
|
+
if (!baseUrl || !config.manifest) return config;
|
|
87
|
+
const m = config.manifest;
|
|
88
|
+
const resolveIcons = (icons) => icons?.map((icon) => resolveIconSrc(icon, baseUrl));
|
|
89
|
+
return {
|
|
90
|
+
...config,
|
|
91
|
+
manifest: {
|
|
92
|
+
...m,
|
|
93
|
+
icons: resolveIcons(m.icons),
|
|
94
|
+
file_handlers: m.file_handlers?.map((handler) => ({
|
|
95
|
+
...handler,
|
|
96
|
+
icons: resolveIcons(handler.icons)
|
|
97
|
+
}))
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
22
102
|
//#region src/pglite.db.ts
|
|
23
103
|
async function createMainThreadPGlite(major, dbName) {
|
|
24
104
|
const { PGlite } = await loadPGliteModule(major);
|
|
@@ -73,7 +153,7 @@ async function getDb() {
|
|
|
73
153
|
* Creates a Reactor that plugs into legacy storage but syncs through the new
|
|
74
154
|
* Reactor GQL API.
|
|
75
155
|
*/
|
|
76
|
-
async function createBrowserReactor(documentModelModules, upgradeManifests, renown, documentModelLoader) {
|
|
156
|
+
async function createBrowserReactor(documentModelModules, upgradeManifests, renown, featureFlags, documentModelLoader) {
|
|
77
157
|
const signerConfig = {
|
|
78
158
|
signer: renown.signer,
|
|
79
159
|
verifier: createSignatureVerifier()
|
|
@@ -84,7 +164,7 @@ async function createBrowserReactor(documentModelModules, upgradeManifests, reno
|
|
|
84
164
|
};
|
|
85
165
|
const pg = await getReactorPGlite();
|
|
86
166
|
const logger = new ConsoleLogger(["reactor-client"]);
|
|
87
|
-
const builder = new ReactorClientBuilder$1().withLogger(logger).withSigner(signerConfig).withReactorBuilder(new ReactorBuilder$1().withDocumentModelSources(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme$1.CONNECT).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
|
|
167
|
+
const builder = new ReactorClientBuilder$1().withLogger(logger).withSigner(signerConfig).withReactorBuilder(new ReactorBuilder$1().withDocumentModelSources(documentModelModules).withUpgradeManifests(upgradeManifests).withChannelScheme(ChannelScheme$1.CONNECT).withExecutorConfig({ featureFlags }).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
|
|
88
168
|
if (documentModelLoader) builder.withDocumentModelLoader(documentModelLoader);
|
|
89
169
|
const module = await builder.buildModule();
|
|
90
170
|
return {
|
|
@@ -127,7 +207,7 @@ async function addDefaultDrivesForNewReactor(drives) {
|
|
|
127
207
|
}
|
|
128
208
|
}
|
|
129
209
|
if (driveId && (drive.name || drive.icon)) try {
|
|
130
|
-
const reactorClient = window.ph?.
|
|
210
|
+
const reactorClient = window.ph?.reactorClientModule?.client;
|
|
131
211
|
if (reactorClient) await waitForDocumentReady(reactorClient, driveId, { timeoutMs: 15e3 });
|
|
132
212
|
await setDriveMetadata(driveId, {
|
|
133
213
|
name: drive.name,
|
|
@@ -601,14 +681,14 @@ var BrowserPackageManager = class {
|
|
|
601
681
|
#cdnUrl;
|
|
602
682
|
#localPackageVersion;
|
|
603
683
|
#localPackageNames = new Set([LOCAL_PACKAGE_NAME]);
|
|
684
|
+
#pwaSyncTimer;
|
|
685
|
+
/** Serialized last-mirrored PWA fragment; lets a sync skip the IndexedDB
|
|
686
|
+
* write + manifest re-attach when nothing PWA-relevant changed. */
|
|
687
|
+
#lastSyncedFragmentJson;
|
|
604
688
|
constructor(namespace, registryUrl) {
|
|
605
689
|
this.#storage = new BrowserLocalStorage(namespace + ":PH_PACKAGES");
|
|
606
690
|
this.registryUrl = registryUrl;
|
|
607
|
-
this.#cdnUrl = registryUrl !== null ?
|
|
608
|
-
}
|
|
609
|
-
#toCdnUrl(baseUrl) {
|
|
610
|
-
if (baseUrl.includes("/-/cdn")) return baseUrl;
|
|
611
|
-
return `${baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl}/-/cdn`;
|
|
691
|
+
this.#cdnUrl = registryUrl !== null ? toCdnUrl(registryUrl) : null;
|
|
612
692
|
}
|
|
613
693
|
async init(localPackage, localPackageVersion, studioMode) {
|
|
614
694
|
this.addLocalPackage(common.manifest.name, common, commonPkg.version);
|
|
@@ -829,6 +909,53 @@ var BrowserPackageManager = class {
|
|
|
829
909
|
this.#subscribers.forEach((handler) => {
|
|
830
910
|
handler({ packages });
|
|
831
911
|
});
|
|
912
|
+
this.#schedulePwaSync();
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* Debounced mirror of every loaded package's PWA fragment into IndexedDB, so
|
|
916
|
+
* the service worker can serve a web-app manifest that reflects packages
|
|
917
|
+
* installed AT RUNTIME (a SW can't read localStorage, where the package list
|
|
918
|
+
* lives). Debounced because `init()` rehydrates many packages in a burst;
|
|
919
|
+
* coalescing collapses that into a single write.
|
|
920
|
+
*/
|
|
921
|
+
#schedulePwaSync() {
|
|
922
|
+
if (typeof indexedDB === "undefined") return;
|
|
923
|
+
clearTimeout(this.#pwaSyncTimer);
|
|
924
|
+
this.#pwaSyncTimer = setTimeout(() => {
|
|
925
|
+
this.#syncPwaFragments();
|
|
926
|
+
}, 50);
|
|
927
|
+
}
|
|
928
|
+
async #syncPwaFragments() {
|
|
929
|
+
const contributions = [];
|
|
930
|
+
for (const [name, loadedPackage] of this.#packages) {
|
|
931
|
+
const manifest = loadedPackage.manifest;
|
|
932
|
+
let config = {};
|
|
933
|
+
if (manifest.pwa) {
|
|
934
|
+
const parsed = PwaConfigSchema.safeParse(manifest.pwa);
|
|
935
|
+
if (parsed.success) {
|
|
936
|
+
const importUrl = this.#storage.get(name)?.importUrl ?? null;
|
|
937
|
+
const baseUrl = importUrl ? importUrl.replace(/browser\/index\.js$/, "") : null;
|
|
938
|
+
config = resolveFragmentAssetUrls(parsed.data, baseUrl);
|
|
939
|
+
} else console.warn(`[Connect][PWA] "${name}" ships an invalid pwa fragment; skipped.`, parsed.error);
|
|
940
|
+
}
|
|
941
|
+
config = withInferredCategory(config, manifest.category);
|
|
942
|
+
if (Object.keys(config).length === 0) continue;
|
|
943
|
+
contributions.push({
|
|
944
|
+
source: name,
|
|
945
|
+
config
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
const merged = mergePwaConfig(contributions);
|
|
949
|
+
const mergedJson = JSON.stringify(merged);
|
|
950
|
+
if (mergedJson === this.#lastSyncedFragmentJson) return;
|
|
951
|
+
try {
|
|
952
|
+
await writeMergedPwaFragment(merged);
|
|
953
|
+
} catch (error) {
|
|
954
|
+
console.debug("[Connect][PWA] fragment mirror to IndexedDB failed:", error);
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
this.#lastSyncedFragmentJson = mergedJson;
|
|
958
|
+
refreshPwaManifestLink();
|
|
832
959
|
}
|
|
833
960
|
};
|
|
834
961
|
//#endregion
|
|
@@ -855,6 +982,10 @@ function bumpWorkerGen(namespace, gen) {
|
|
|
855
982
|
const PING_INTERVAL_MS = 2e3;
|
|
856
983
|
const PING_DEADLINE_MS = 3e3;
|
|
857
984
|
const MAX_MISSED_PINGS = 2;
|
|
985
|
+
/** Sorted so the same set always produces the same fingerprint. */
|
|
986
|
+
function enabledFlagList(flags) {
|
|
987
|
+
return Object.entries(flags).filter(([, enabled]) => enabled).map(([name]) => name).sort().join(",");
|
|
988
|
+
}
|
|
858
989
|
function toReactorIdentity(user) {
|
|
859
990
|
if (!user) return null;
|
|
860
991
|
return {
|
|
@@ -890,14 +1021,17 @@ function createWorkerReactorClientModule(args) {
|
|
|
890
1021
|
models: args.documentModelModules.map((m) => ({
|
|
891
1022
|
id: m.documentModel.global.id,
|
|
892
1023
|
version: m.version ?? 1
|
|
893
|
-
}))
|
|
1024
|
+
})),
|
|
1025
|
+
featureFlags: enabledFlagList(args.featureFlags)
|
|
894
1026
|
},
|
|
895
1027
|
construct: {
|
|
896
1028
|
namespace: args.namespace,
|
|
897
1029
|
relationalNamespace: args.relationalNamespace,
|
|
898
1030
|
cdnUrl: args.cdnUrl,
|
|
899
1031
|
packageSpecs: args.packageSpecs,
|
|
900
|
-
studioMode: args.studioMode
|
|
1032
|
+
studioMode: args.studioMode,
|
|
1033
|
+
renownChainId: args.renownChainId,
|
|
1034
|
+
featureFlags: args.featureFlags
|
|
901
1035
|
},
|
|
902
1036
|
packages: args.packageSpecs
|
|
903
1037
|
}, args.onReload, documentModelRegistry);
|
|
@@ -1004,29 +1138,23 @@ var NullAttachmentService = class {
|
|
|
1004
1138
|
get() {
|
|
1005
1139
|
return Promise.reject(/* @__PURE__ */ new Error("NullAttachmentService: no attachment service configured"));
|
|
1006
1140
|
}
|
|
1141
|
+
getDownloadTarget() {
|
|
1142
|
+
return Promise.reject(/* @__PURE__ */ new Error("NullAttachmentService: no attachment service configured"));
|
|
1143
|
+
}
|
|
1007
1144
|
};
|
|
1008
1145
|
async function createProcessorHostModule(reactorClient, readModels, attachmentService) {
|
|
1009
1146
|
try {
|
|
1010
1147
|
const { pgLite, relationalDb } = await getDb();
|
|
1011
1148
|
const { store: analyticsStore } = await createAnalyticsStore({ pgLite });
|
|
1012
1149
|
return {
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
id: jobInfo.id,
|
|
1022
|
-
status: jobInfo.status
|
|
1023
|
-
};
|
|
1024
|
-
} },
|
|
1025
|
-
getReadModel(name) {
|
|
1026
|
-
const model = readModels.find((m) => m.name === name);
|
|
1027
|
-
if (!model) throw new Error(`Read model "${name}" not found`);
|
|
1028
|
-
return model;
|
|
1029
|
-
}
|
|
1150
|
+
...createReactorHostModuleBase({
|
|
1151
|
+
client: reactorClient,
|
|
1152
|
+
readModels,
|
|
1153
|
+
relationalDb,
|
|
1154
|
+
analyticsStore,
|
|
1155
|
+
processorApp: "connect"
|
|
1156
|
+
}),
|
|
1157
|
+
attachments: createAttachmentClient(attachmentService ?? new NullAttachmentService())
|
|
1030
1158
|
};
|
|
1031
1159
|
} catch (error) {
|
|
1032
1160
|
console.error(`Failed to initialize processor host module:`);
|
|
@@ -1120,11 +1248,16 @@ async function createReactor(localPackage) {
|
|
|
1120
1248
|
setPHToast(toast);
|
|
1121
1249
|
const features = await initFeatureFlags();
|
|
1122
1250
|
logger.info("Features: @features", JSON.stringify(Object.fromEntries(features), null, 2));
|
|
1251
|
+
const renownChainId = getRuntimeConfig().connect.renown?.chainId;
|
|
1123
1252
|
const keyPairStorage = await BrowserKeyStorage.create();
|
|
1124
|
-
const
|
|
1253
|
+
const cryptoBuilder = new RenownCryptoBuilder().withKeyPairStorage(keyPairStorage);
|
|
1254
|
+
if (renownChainId !== void 0) cryptoBuilder.withChainId(renownChainId);
|
|
1255
|
+
const renownCrypto = await cryptoBuilder.build();
|
|
1125
1256
|
const renown = await new RenownBuilder("connect", {
|
|
1126
1257
|
basename: getRuntimeConfig().connect.renown?.namespace ?? phGlobalConfig.routerBasename,
|
|
1127
|
-
baseUrl: phGlobalConfig.renownUrl
|
|
1258
|
+
baseUrl: phGlobalConfig.renownUrl,
|
|
1259
|
+
switchboardUrl: phGlobalConfig.switchboardUrl,
|
|
1260
|
+
chainId: renownChainId
|
|
1128
1261
|
}).withCrypto(renownCrypto).build();
|
|
1129
1262
|
const runtimeConfig = getRuntimeConfig();
|
|
1130
1263
|
const packageManager = new BrowserPackageManager(phGlobalConfig.routerBasename ?? "", runtimeConfig.packageRegistryUrl ?? null);
|
|
@@ -1146,6 +1279,9 @@ async function createReactor(localPackage) {
|
|
|
1146
1279
|
storageKey: phGlobalConfig.routerBasename ?? ""
|
|
1147
1280
|
}) : new NoRegistryDiscoveryService(packageManager);
|
|
1148
1281
|
setPackageDiscoveryService(discoveryService);
|
|
1282
|
+
const reactorFeatureFlags = runtimeConfig.connect?.reactor?.featureFlags ?? {};
|
|
1283
|
+
const enabledReactorFlags = Object.entries(reactorFeatureFlags).filter(([, enabled]) => enabled).map(([name]) => name);
|
|
1284
|
+
if (enabledReactorFlags.length > 0) logger.info(`Reactor feature flags: ${enabledReactorFlags.join(", ")}`);
|
|
1149
1285
|
let reactorClientModule;
|
|
1150
1286
|
if (isReactorWorkerEnabled()) {
|
|
1151
1287
|
const packageSpecs = packageManager.getRegistryPackages().map((p) => p.version ? `${p.name}@${p.version}` : p.name);
|
|
@@ -1156,6 +1292,8 @@ async function createReactor(localPackage) {
|
|
|
1156
1292
|
cdnUrl: packageManager.cdnUrl ?? "",
|
|
1157
1293
|
packageSpecs,
|
|
1158
1294
|
studioMode: phGlobalConfig.studioMode,
|
|
1295
|
+
renownChainId,
|
|
1296
|
+
featureFlags: reactorFeatureFlags,
|
|
1159
1297
|
documentModelModules,
|
|
1160
1298
|
upgradeManifests,
|
|
1161
1299
|
documentModelLoader: { async load(documentType) {
|
|
@@ -1183,7 +1321,7 @@ async function createReactor(localPackage) {
|
|
|
1183
1321
|
logger.error("Reactor worker failed to start: @error", error);
|
|
1184
1322
|
throw error;
|
|
1185
1323
|
}
|
|
1186
|
-
} else reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, discoveryService);
|
|
1324
|
+
} else reactorClientModule = await createBrowserReactor(documentModelModules, upgradeManifests, renown, reactorFeatureFlags, discoveryService);
|
|
1187
1325
|
const drives = await getDrives(reactorClientModule.client);
|
|
1188
1326
|
await login(getDidFromUrl(), renown);
|
|
1189
1327
|
const documentCache = new DocumentCache(reactorClientModule.client);
|
|
@@ -1206,7 +1344,8 @@ async function createReactor(localPackage) {
|
|
|
1206
1344
|
};
|
|
1207
1345
|
setAttachmentService(createRemoteAttachmentService({
|
|
1208
1346
|
remoteUrl: switchboardOrigin,
|
|
1209
|
-
jwtHandler: attachmentJwtHandler
|
|
1347
|
+
jwtHandler: attachmentJwtHandler,
|
|
1348
|
+
uploadTransport: createXhrUploadTransport()
|
|
1210
1349
|
}));
|
|
1211
1350
|
}
|
|
1212
1351
|
}
|
|
@@ -1278,5 +1417,5 @@ function getDriveUrl() {
|
|
|
1278
1417
|
//#endregion
|
|
1279
1418
|
export { createReactor as n, clearReactorStorage as t };
|
|
1280
1419
|
|
|
1281
|
-
//# sourceMappingURL=reactor-
|
|
1282
|
-
//# debugId=
|
|
1420
|
+
//# sourceMappingURL=reactor-nQjmz4AJ.js.map
|
|
1421
|
+
//# debugId=8c97280c-99f4-5190-8b2e-0b4822a0aadf
|