@powerhousedao/connect 6.0.0-dev.182 → 6.0.0-dev.183
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/dist/{ClearStorageModal-DQTE4jxw.js → ClearStorageModal-BPNxgYAt.js} +2 -2
- package/dist/{ClearStorageModal-DQTE4jxw.js.map → ClearStorageModal-BPNxgYAt.js.map} +1 -1
- package/dist/{DebugSettingsModal-ZNWhlMQN.js → DebugSettingsModal-BgGapwSF.js} +3 -3
- package/dist/{DebugSettingsModal-ZNWhlMQN.js.map → DebugSettingsModal-BgGapwSF.js.map} +1 -1
- package/dist/{SettingsModal-XJAki0gA.js → SettingsModal-D3zhaUkq.js} +31 -6
- package/dist/SettingsModal-D3zhaUkq.js.map +1 -0
- package/dist/{connect.config-DDu1QWU1.js → connect.config-Cuh0hj_Q.js} +2 -3
- package/dist/{connect.config-DDu1QWU1.js.map → connect.config-Cuh0hj_Q.js.map} +1 -1
- package/dist/load-CRBdgq0Y.js +354 -0
- package/dist/load-CRBdgq0Y.js.map +1 -0
- package/dist/main.js +1 -1
- package/dist/{i18n-Ch408v5-.js → migration-status-B9oFtMAT.js} +19 -2
- package/dist/migration-status-B9oFtMAT.js.map +1 -0
- package/dist/{package-eSVQU0Pd.js → package-B6-PosA0.js} +4 -2
- package/dist/package-B6-PosA0.js.map +1 -0
- package/dist/pglite.worker.js +1 -1
- package/dist/{reactor-XY9bfbn2.js → reactor-f19C1Zwk.js} +21 -38
- package/dist/reactor-f19C1Zwk.js.map +1 -0
- package/dist/{registerServiceWorker-19nMRUMW.js → registerServiceWorker-BzzFXdLM.js} +2 -2
- package/dist/{registerServiceWorker-19nMRUMW.js.map → registerServiceWorker-BzzFXdLM.js.map} +1 -1
- package/dist/{sidebar-BUwM0-xL.js → sidebar-BrdpE9zO.js} +33 -15
- package/dist/sidebar-BrdpE9zO.js.map +1 -0
- package/dist/start-connect.js +1 -1
- package/dist/style.css +39 -0
- package/package.json +12 -10
- package/dist/SettingsModal-XJAki0gA.js.map +0 -1
- package/dist/i18n-Ch408v5-.js.map +0 -1
- package/dist/load-R459v1Yo.js +0 -105
- package/dist/load-R459v1Yo.js.map +0 -1
- package/dist/package-eSVQU0Pd.js.map +0 -1
- package/dist/reactor-XY9bfbn2.js.map +0 -1
- package/dist/sidebar-BUwM0-xL.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as clearReactorStorage } from "./reactor-
|
|
1
|
+
import { t as clearReactorStorage } from "./reactor-f19C1Zwk.js";
|
|
2
2
|
import { closePHModal, setSelectedDrive, setSelectedNode, showPHModal, usePHModal } from "@powerhousedao/reactor-browser";
|
|
3
3
|
import { childLogger } from "document-model";
|
|
4
4
|
import { useState } from "react";
|
|
@@ -41,4 +41,4 @@ function ClearStorageModal() {
|
|
|
41
41
|
//#endregion
|
|
42
42
|
export { ClearStorageModal };
|
|
43
43
|
|
|
44
|
-
//# sourceMappingURL=ClearStorageModal-
|
|
44
|
+
//# sourceMappingURL=ClearStorageModal-BPNxgYAt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClearStorageModal-
|
|
1
|
+
{"version":3,"file":"ClearStorageModal-BPNxgYAt.js","names":["logger"],"sources":["../src/components/modal/modals/ClearStorageModal.tsx"],"sourcesContent":["import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport { ConnectConfirmationModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n setSelectedDrive,\n setSelectedNode,\n showPHModal,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { childLogger } from \"document-model\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nconst logger = childLogger([\"ClearStorage\"]);\n\nexport function ClearStorageModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"clearStorage\";\n const { t } = useTranslation();\n const [loading, setLoading] = useState(false);\n\n function clearStorage() {\n setLoading(true);\n clearReactorStorage()\n .then(() => {\n logger.info(\"Storage cleared\");\n setSelectedDrive(undefined);\n setSelectedNode(undefined);\n window.location.reload();\n })\n .catch((error) => {\n logger.error(\"Error clearing storage: @error\", error);\n setLoading(false);\n });\n }\n\n return (\n <ConnectConfirmationModal\n open={open}\n header={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n title={t(\"modals.connectSettings.clearStorage.confirmation.title\")}\n body={t(\"modals.connectSettings.clearStorage.confirmation.body\")}\n cancelLabel={t(\"common.cancel\")}\n continueLabel={t(\n \"modals.connectSettings.clearStorage.confirmation.clearButton\",\n )}\n onCancel={() => showPHModal({ type: \"settings\" })}\n onContinue={clearStorage}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n continueButtonProps={{\n disabled: loading,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;AAaA,MAAMA,WAAS,YAAY,CAAC,eAAe,CAAC;AAE5C,SAAgB,oBAAoB;CAElC,MAAM,OADU,YAAY,EACN,SAAS;CAC/B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,SAAS,eAAe;AACtB,aAAW,KAAK;AAChB,uBAAqB,CAClB,WAAW;AACV,YAAO,KAAK,kBAAkB;AAC9B,oBAAiB,KAAA,EAAU;AAC3B,mBAAgB,KAAA,EAAU;AAC1B,UAAO,SAAS,QAAQ;IACxB,CACD,OAAO,UAAU;AAChB,YAAO,MAAM,kCAAkC,MAAM;AACrD,cAAW,MAAM;IACjB;;AAGN,QACE,oBAAC,0BAAD;EACQ;EACN,QAAQ,EAAE,yDAAyD;EACnE,OAAO,EAAE,yDAAyD;EAClE,MAAM,EAAE,wDAAwD;EAChE,aAAa,EAAE,gBAAgB;EAC/B,eAAe,EACb,+DACD;EACD,gBAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;EACjD,YAAY;EACZ,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,qBAAqB,EACnB,UAAU,SACX;EACD,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as connectConfig } from "./connect.config-
|
|
2
|
-
import { t as serviceWorkerManager } from "./registerServiceWorker-
|
|
1
|
+
import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
|
|
2
|
+
import { t as serviceWorkerManager } from "./registerServiceWorker-BzzFXdLM.js";
|
|
3
3
|
import { closePHModal, usePHModal } from "@powerhousedao/reactor-browser";
|
|
4
4
|
import { useEffect, useState } from "react";
|
|
5
5
|
import { Combobox, FormInput } from "@powerhousedao/design-system/connect";
|
|
@@ -136,4 +136,4 @@ const DebugSettingsModal = () => {
|
|
|
136
136
|
//#endregion
|
|
137
137
|
export { DebugSettingsModal };
|
|
138
138
|
|
|
139
|
-
//# sourceMappingURL=DebugSettingsModal-
|
|
139
|
+
//# sourceMappingURL=DebugSettingsModal-BgGapwSF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DebugSettingsModal-
|
|
1
|
+
{"version":3,"file":"DebugSettingsModal-BgGapwSF.js","names":[],"sources":["../src/components/modal/modals/DebugSettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { serviceWorkerManager } from \"@powerhousedao/connect/utils\";\nimport { Icon, Modal, PowerhouseButton } from \"@powerhousedao/design-system\";\nimport { Combobox, FormInput } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { useEffect, useState } from \"react\";\n\nexport const DebugSettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"debugSettings\";\n\n const [appVersion, setAppVersion] = useState(connectConfig.appVersion);\n const [serviceWorkerDebugMode, setServiceWorkerDebugMode] = useState({\n label: serviceWorkerManager.debug ? \"Enabled\" : \"Disabled\",\n value: serviceWorkerManager.debug,\n });\n\n useEffect(() => {\n serviceWorkerManager.setDebug(serviceWorkerDebugMode.value);\n }, [serviceWorkerDebugMode]);\n\n return (\n <Modal\n open={open}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n contentProps={{\n className: \"rounded-2xl\",\n }}\n >\n <div className=\"w-[700px] rounded-2xl p-6\">\n <div className=\"mb-6 flex justify-between\">\n <div className=\"text-xl font-bold\">Debug Tools</div>\n <button id=\"close-modal\" onClick={() => closePHModal()}>\n <Icon name=\"Xmark\" size={28} />\n </button>\n </div>\n <div className=\"flex text-sm font-bold\">\n <Icon name=\"Ring\" size={22} />\n <span className=\"ml-2\">App Version: {connectConfig.appVersion}</span>\n </div>\n <div className=\"mt-4 flex text-sm font-bold\">\n <Icon name=\"Hdd\" size={22} />\n <span className=\"ml-2\">Drive Tools:</span>\n </div>\n\n <div className=\"mt-4 flex text-sm font-bold\">\n <Icon name=\"Gear\" size={22} />\n <span className=\"ml-2\">Service Worker Tools:</span>\n </div>\n <div className=\"mt-2 flex items-end justify-between pl-4\">\n <div className=\"w-[400px]\">\n <label htmlFor=\"serviceWorkerDebugMode\" className=\"text-xs\">\n Service Worker Debug Mode:\n </label>\n <Combobox\n id=\"serviceWorkerDebugMode\"\n onChange={(value) => {\n setServiceWorkerDebugMode(\n value as typeof serviceWorkerDebugMode,\n );\n }}\n value={serviceWorkerDebugMode}\n options={[\n { label: \"Enabled\", value: true },\n { label: \"Disabled\", value: false },\n ]}\n />\n </div>\n </div>\n <div className=\"mt-2 flex items-end justify-between pl-4\">\n <div className=\"w-[400px]\">\n <label htmlFor=\"appVersion\" className=\"text-xs\">\n Set invalid app version:\n </label>\n <FormInput\n containerClassName=\"p-1 bg-white border border-gray-200 rounded-md text-sm\"\n inputClassName=\"text-xs font-normal\"\n id=\"appVersion\"\n icon={\n <div className=\"flex h-full items-center text-xs\">Version:</div>\n }\n value={appVersion}\n onChange={(element) => setAppVersion(element.target.value)}\n />\n </div>\n <div className=\"mb-1 flex items-center justify-center\">\n <PowerhouseButton\n color={appVersion === \"\" ? \"light\" : \"red\"}\n size=\"small\"\n disabled={appVersion === \"\"}\n onClick={() => {\n // @ts-expect-error todo add send message method to service worker manager class\n serviceWorkerManager.sendMessage({\n type: \"SET_APP_VERSION\",\n version: appVersion,\n });\n setAppVersion(\"\");\n }}\n >\n Add Invalid App Version\n </PowerhouseButton>\n </div>\n </div>\n </div>\n </Modal>\n );\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,2BAAqC;CAEhD,MAAM,OADU,YAAY,EACN,SAAS;CAE/B,MAAM,CAAC,YAAY,iBAAiB,SAAS,cAAc,WAAW;CACtE,MAAM,CAAC,wBAAwB,6BAA6B,SAAS;EACnE,OAAO,qBAAqB,QAAQ,YAAY;EAChD,OAAO,qBAAqB;EAC7B,CAAC;AAEF,iBAAgB;AACd,uBAAqB,SAAS,uBAAuB,MAAM;IAC1D,CAAC,uBAAuB,CAAC;AAE5B,QACE,oBAAC,OAAD;EACQ;EACN,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,cAAc,EACZ,WAAW,eACZ;YAED,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBAAoB;MAAiB,CAAA,EACpD,oBAAC,UAAD;MAAQ,IAAG;MAAc,eAAe,cAAc;gBACpD,oBAAC,MAAD;OAAM,MAAK;OAAQ,MAAM;OAAM,CAAA;MACxB,CAAA,CACL;;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAO,MAAM;MAAM,CAAA,EAC9B,qBAAC,QAAD;MAAM,WAAU;gBAAhB,CAAuB,iBAAc,cAAc,WAAkB;QACjE;;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAM,MAAM;MAAM,CAAA,EAC7B,oBAAC,QAAD;MAAM,WAAU;gBAAO;MAAmB,CAAA,CACtC;;IAEN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAD;MAAM,MAAK;MAAO,MAAM;MAAM,CAAA,EAC9B,oBAAC,QAAD;MAAM,WAAU;gBAAO;MAA4B,CAAA,CAC/C;;IACN,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,SAAD;OAAO,SAAQ;OAAyB,WAAU;iBAAU;OAEpD,CAAA,EACR,oBAAC,UAAD;OACE,IAAG;OACH,WAAW,UAAU;AACnB,kCACE,MACD;;OAEH,OAAO;OACP,SAAS,CACP;QAAE,OAAO;QAAW,OAAO;QAAM,EACjC;QAAE,OAAO;QAAY,OAAO;QAAO,CACpC;OACD,CAAA,CACE;;KACF,CAAA;IACN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,SAAD;OAAO,SAAQ;OAAa,WAAU;iBAAU;OAExC,CAAA,EACR,oBAAC,WAAD;OACE,oBAAmB;OACnB,gBAAe;OACf,IAAG;OACH,MACE,oBAAC,OAAD;QAAK,WAAU;kBAAmC;QAAc,CAAA;OAElE,OAAO;OACP,WAAW,YAAY,cAAc,QAAQ,OAAO,MAAM;OAC1D,CAAA,CACE;SACN,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,kBAAD;OACE,OAAO,eAAe,KAAK,UAAU;OACrC,MAAK;OACL,UAAU,eAAe;OACzB,eAAe;AAEb,6BAAqB,YAAY;SAC/B,MAAM;SACN,SAAS;SACV,CAAC;AACF,sBAAc,GAAG;;iBAEpB;OAEkB,CAAA;MACf,CAAA,CACF;;IACF;;EACA,CAAA"}
|
|
@@ -1,19 +1,44 @@
|
|
|
1
|
-
import { t as connectConfig } from "./connect.config-
|
|
1
|
+
import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
|
|
2
2
|
import { t as toast$1 } from "./toast-iD-70hL8.js";
|
|
3
3
|
import { t as useRegistryPackages } from "./useRegistryPackages-D-NoyoE4.js";
|
|
4
|
-
import { t as package_default } from "./package-
|
|
4
|
+
import { t as package_default } from "./package-B6-PosA0.js";
|
|
5
5
|
import { closePHModal, deleteDrive, setSelectedDrive, showPHModal, useDrives, usePHModal, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
6
6
|
import { useCallback, useMemo, useState } from "react";
|
|
7
7
|
import { About, DangerZone, DefaultEditor, PackageManager, SettingsModal as SettingsModal$1 } from "@powerhousedao/design-system/connect";
|
|
8
|
-
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
9
|
import { Icon } from "@powerhousedao/design-system";
|
|
10
10
|
import { t } from "i18next";
|
|
11
11
|
//#region src/components/modal/modals/settings/about.tsx
|
|
12
12
|
const About$1 = () => {
|
|
13
|
-
|
|
13
|
+
const onOpenInspector = () => {
|
|
14
|
+
closePHModal();
|
|
15
|
+
showPHModal({ type: "inspector" });
|
|
16
|
+
};
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(About, {
|
|
14
18
|
packageJson: package_default,
|
|
15
19
|
phCliVersion: typeof connectConfig.phCliVersion === "string" ? connectConfig.phCliVersion : void 0
|
|
16
|
-
})
|
|
20
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
className: "bg-white p-3",
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsx("h2", {
|
|
24
|
+
className: "mb-2 font-semibold",
|
|
25
|
+
children: "Inspector"
|
|
26
|
+
}),
|
|
27
|
+
/* @__PURE__ */ jsx("p", {
|
|
28
|
+
className: "mb-3 text-sm font-normal text-gray-600",
|
|
29
|
+
children: "Explore the local database and sync state for debugging."
|
|
30
|
+
}),
|
|
31
|
+
/* @__PURE__ */ jsxs("button", {
|
|
32
|
+
className: "flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-100",
|
|
33
|
+
onClick: onOpenInspector,
|
|
34
|
+
type: "button",
|
|
35
|
+
children: ["Open Inspector ", /* @__PURE__ */ jsx(Icon, {
|
|
36
|
+
name: "CircleInfo",
|
|
37
|
+
size: 16
|
|
38
|
+
})]
|
|
39
|
+
})
|
|
40
|
+
]
|
|
41
|
+
})] });
|
|
17
42
|
};
|
|
18
43
|
//#endregion
|
|
19
44
|
//#region src/components/modal/modals/settings/danger-zone.tsx
|
|
@@ -150,4 +175,4 @@ const SettingsModal = () => {
|
|
|
150
175
|
//#endregion
|
|
151
176
|
export { SettingsModal };
|
|
152
177
|
|
|
153
|
-
//# sourceMappingURL=SettingsModal-
|
|
178
|
+
//# sourceMappingURL=SettingsModal-D3zhaUkq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsModal-D3zhaUkq.js","names":["About","BaseAbout","packageJson","DangerZone","BaseDangerZone","DefaultEditor","BaseDefaultEditor","DefaultEditor","DangerZone","About","SettingsModalV2"],"sources":["../src/components/modal/modals/settings/about.tsx","../src/components/modal/modals/settings/danger-zone.tsx","../src/components/modal/modals/settings/default-editor.tsx","../src/components/modal/modals/settings/package-manager.tsx","../src/components/modal/modals/SettingsModal.tsx"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { packageJson } from \"@powerhousedao/connect/utils\";\nimport { Icon } from \"@powerhousedao/design-system\";\nimport { About as BaseAbout } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, showPHModal } from \"@powerhousedao/reactor-browser\";\n\nexport const About: React.FC = () => {\n const onOpenInspector = () => {\n closePHModal();\n showPHModal({ type: \"inspector\" });\n };\n\n return (\n <div>\n <BaseAbout\n packageJson={packageJson}\n phCliVersion={\n typeof connectConfig.phCliVersion === \"string\"\n ? connectConfig.phCliVersion\n : undefined\n }\n />\n <div className=\"bg-white p-3\">\n <h2 className=\"mb-2 font-semibold\">Inspector</h2>\n <p className=\"mb-3 text-sm font-normal text-gray-600\">\n Explore the local database and sync state for debugging.\n </p>\n <button\n className=\"flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 transition-colors hover:bg-gray-100\"\n onClick={onOpenInspector}\n type=\"button\"\n >\n Open Inspector <Icon name=\"CircleInfo\" size={16} />\n </button>\n </div>\n </div>\n );\n};\n","import { DangerZone as BaseDangerZone } from \"@powerhousedao/design-system/connect\";\nimport {\n deleteDrive,\n setSelectedDrive,\n showPHModal,\n useDrives,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\n\nexport const DangerZone: React.FC = () => {\n const drives = useDrives();\n\n const handleDeleteDrive = async (drive: DocumentDriveDocument) => {\n await deleteDrive(drive.header.id);\n setSelectedDrive(undefined);\n };\n\n const handleClearStorage = () => {\n showPHModal({ type: \"clearStorage\" });\n };\n\n return (\n <BaseDangerZone\n drives={drives ?? []}\n onDeleteDrive={handleDeleteDrive}\n onClearStorage={handleClearStorage}\n />\n );\n};\n","import { DefaultEditor as BaseDefaultEditor } from \"@powerhousedao/design-system/connect\";\nimport { useCallback, useState } from \"react\";\n\nconst documentModelEditorOptions = [\n { label: \"V1\", value: \"document-model-editor\" },\n { label: \"V2\", value: \"document-model-editor-v2\" },\n] as const;\n\nexport const DefaultEditor: React.FC = () => {\n const [documentModelEditor, setDocumentModelEditor] = useState<\n (typeof documentModelEditorOptions)[number]\n >(documentModelEditorOptions[1]);\n\n const handleSetDocumentEditor = useCallback((value: string) => {\n const option = documentModelEditorOptions.find((dm) => dm.value == value);\n if (option) {\n setDocumentModelEditor(option);\n }\n }, []);\n\n return (\n <BaseDefaultEditor\n documentModelEditor={documentModelEditor.value}\n setDocumentModelEditor={handleSetDocumentEditor}\n documentModelEditorOptions={\n documentModelEditorOptions as unknown as {\n value: string;\n label: string;\n }[]\n }\n />\n );\n};\n","import { useRegistryPackages } from \"@powerhousedao/connect/hooks\";\nimport { toast } from \"@powerhousedao/connect/services\";\nimport { PackageManager } from \"@powerhousedao/design-system/connect\";\nimport { useVetraPackageManager } from \"@powerhousedao/reactor-browser\";\nimport React from \"react\";\n\nexport const ConnectPackageManager: React.FC = () => {\n const packageManager = useVetraPackageManager();\n const { registryPackageList, updateRegistryPackageStatus } =\n useRegistryPackages();\n\n async function handleInstall(packageName: string) {\n if (!packageManager) return;\n\n const result = await packageManager.addPackage(packageName);\n if (result.type === \"success\") {\n updateRegistryPackageStatus(packageName, \"registry-install\");\n toast(`Package \"${packageName}\" installed successfully`, {\n type: \"connect-success\",\n });\n } else {\n const message = result.error.message;\n toast(`Failed to install \"${packageName}\": ${message}`, {\n type: \"error\",\n });\n }\n }\n\n function handleUninstall(packageName: string) {\n if (!packageManager) return;\n try {\n packageManager.removePackage(packageName);\n updateRegistryPackageStatus(packageName, \"available\");\n\n toast(`Package \"${packageName}\" uninstalled successfully`, {\n type: \"connect-success\",\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n toast(`Failed to uninstall \"${packageName}\": ${message}`, {\n type: \"error\",\n });\n }\n }\n\n return (\n <div className=\"flex h-full flex-1 flex-col\">\n <PackageManager\n mutable={true}\n registryPackageList={registryPackageList}\n onInstall={handleInstall}\n onUninstall={handleUninstall}\n />\n </div>\n );\n};\n","import { Icon } from \"@powerhousedao/design-system\";\nimport { SettingsModal as SettingsModalV2 } from \"@powerhousedao/design-system/connect\";\nimport { closePHModal, usePHModal } from \"@powerhousedao/reactor-browser\";\nimport { t } from \"i18next\";\nimport React, { useMemo } from \"react\";\nimport { About } from \"./settings/about.js\";\nimport { DangerZone } from \"./settings/danger-zone.js\";\nimport { DefaultEditor } from \"./settings/default-editor.js\";\nimport { ConnectPackageManager } from \"./settings/package-manager.js\";\n\nexport const SettingsModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"settings\";\n function onRefresh() {\n window.location.reload();\n }\n\n const tabs = useMemo(\n () => [\n {\n id: \"package-manager\",\n icon: <Icon name=\"PackageManager\" size={12} />,\n label: \"Package Manager\",\n content: ConnectPackageManager,\n },\n {\n id: \"default-editors\",\n icon: <Icon name=\"Edit\" size={12} />,\n label: \"Default Editors\",\n content: DefaultEditor,\n },\n {\n id: \"danger-zone\",\n icon: <Icon name=\"Danger\" size={12} className=\"text-red-900\" />,\n label: <span className=\"text-red-900\">Danger Zone</span>,\n content: () => <DangerZone />,\n },\n {\n id: \"about\",\n icon: <Icon name=\"QuestionSquare\" size={12} />,\n label: \"About\",\n content: About,\n },\n ],\n [onRefresh],\n );\n\n return (\n <SettingsModalV2\n open={open}\n title={t(\"modals.connectSettings.title\")}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n tabs={tabs}\n />\n );\n};\n"],"mappings":"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"}
|
|
@@ -106,8 +106,7 @@ const connectConfig = {
|
|
|
106
106
|
},
|
|
107
107
|
content: {
|
|
108
108
|
showSearchBar: env.PH_CONNECT_SEARCH_BAR_ENABLED,
|
|
109
|
-
showDocumentModelSelectionSetting: !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS
|
|
110
|
-
inspectorEnabled: env.PH_CONNECT_INSPECTOR_ENABLED
|
|
109
|
+
showDocumentModelSelectionSetting: !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS
|
|
111
110
|
},
|
|
112
111
|
drives: {
|
|
113
112
|
addDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,
|
|
@@ -137,4 +136,4 @@ const connectConfig = {
|
|
|
137
136
|
//#endregion
|
|
138
137
|
export { phGlobalConfigFromEnv as i, defaultPHAppConfig as n, defaultPHDocumentEditorConfig as r, connectConfig as t };
|
|
139
138
|
|
|
140
|
-
//# sourceMappingURL=connect.config-
|
|
139
|
+
//# sourceMappingURL=connect.config-Cuh0hj_Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.config-
|
|
1
|
+
{"version":3,"file":"connect.config-Cuh0hj_Q.js","names":[],"sources":["../src/connect.config.ts"],"sourcesContent":["import {\n setLogLevel,\n type FullPHGlobalConfig,\n type PHAppConfig,\n type PHDocumentEditorConfig,\n type PHGlobalConfig,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n loadRuntimeEnv,\n normalizeBasePath,\n} from \"@powerhousedao/shared/connect\";\nimport { logger } from \"document-model\";\n\n// Load environment variables with validation and defaults\nexport const env = loadRuntimeEnv({\n processEnv: import.meta.env,\n});\n\nfunction getRouterBasenameFromBasePath(basePath: string) {\n return basePath.endsWith(\"/\") ? basePath : basePath + \"/\";\n}\n\nfunction getPHGlobalConfigFromEnv(): PHGlobalConfig {\n const basePath = env.PH_CONNECT_BASE_PATH || import.meta.env.BASE_URL;\n const routerBasename = getRouterBasenameFromBasePath(basePath);\n const config = {\n basePath,\n routerBasename,\n allowList: undefined,\n allowedDocumentTypes: [],\n isDragAndDropEnabled: true,\n isEditorDebugModeEnabled: false,\n isEditorReadModeEnabled: false,\n isExternalControlsEnabled: false,\n version: env.PH_CONNECT_VERSION,\n logLevel: env.PH_CONNECT_LOG_LEVEL,\n requiresHardRefresh: env.PH_CONNECT_REQUIRES_HARD_REFRESH,\n warnOutdatedApp: env.PH_CONNECT_WARN_OUTDATED_APP,\n studioMode: env.PH_CONNECT_STUDIO_MODE,\n versionCheckInterval: env.PH_CONNECT_VERSION_CHECK_INTERVAL,\n cliVersion: env.PH_CONNECT_CLI_VERSION,\n fileUploadOperationsChunkSize:\n env.PH_CONNECT_FILE_UPLOAD_OPERATIONS_CHUNK_SIZE,\n gaTrackingId: env.PH_CONNECT_GA_TRACKING_ID,\n defaultDrivesUrl: env.PH_CONNECT_DEFAULT_DRIVES_URL,\n drivesPreserveStrategy: env.PH_CONNECT_DRIVES_PRESERVE_STRATEGY,\n enabledEditors: env.PH_CONNECT_ENABLED_EDITORS?.split(\",\"),\n disabledEditors: env.PH_CONNECT_DISABLED_EDITORS.split(\",\"),\n\n /* Processors */\n isExternalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,\n isAnalyticsEnabled: env.PH_CONNECT_ANALYTICS_ENABLED,\n isAnalyticsExternalProcessorsEnabled:\n env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED &&\n env.PH_CONNECT_EXTERNAL_ANALYTICS_PROCESSORS_ENABLED,\n analyticsDatabaseName: env.PH_CONNECT_ANALYTICS_DATABASE_NAME,\n isRelationalProcessorsEnabled: env.PH_CONNECT_RELATIONAL_PROCESSORS_ENABLED,\n isExternalRelationalProcessorsEnabled:\n env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED &&\n env.PH_CONNECT_EXTERNAL_RELATIONAL_PROCESSORS_ENABLED,\n\n renownUrl: env.PH_CONNECT_RENOWN_URL,\n renownNetworkId: env.PH_CONNECT_RENOWN_NETWORK_ID,\n renownChainId: env.PH_CONNECT_RENOWN_CHAIN_ID,\n sentryRelease: env.PH_CONNECT_SENTRY_RELEASE,\n sentryDsn: env.PH_CONNECT_SENTRY_DSN,\n sentryEnv: env.PH_CONNECT_SENTRY_ENV,\n isDiffAnalyticsEnabled: env.PH_CONNECT_DIFF_ANALYTICS_ENABLED,\n isDriveAnalyticsEnabled: env.PH_CONNECT_DRIVE_ANALYTICS_ENABLED,\n isPublicDrivesEnabled: env.PH_CONNECT_PUBLIC_DRIVES_ENABLED,\n isCloudDrivesEnabled: env.PH_CONNECT_CLOUD_DRIVES_ENABLED,\n isLocalDrivesEnabled: env.PH_CONNECT_LOCAL_DRIVES_ENABLED,\n isSentryTracingEnabled: env.PH_CONNECT_SENTRY_TRACING_ENABLED,\n isDocumentModelSelectionSettingsEnabled:\n !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS,\n isAddDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,\n isAddPublicDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_PUBLIC_DRIVES,\n isDeletePublicDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_PUBLIC_DRIVES,\n isAddCloudDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_CLOUD_DRIVES,\n isDeleteCloudDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_CLOUD_DRIVES,\n isAddLocalDrivesEnabled: !env.PH_CONNECT_DISABLE_ADD_LOCAL_DRIVES,\n isDeleteLocalDrivesEnabled: !env.PH_CONNECT_DISABLE_DELETE_LOCAL_DRIVES,\n isAnalyticsDatabaseWorkerEnabled:\n !env.PH_CONNECT_ANALYTICS_DATABASE_WORKER_DISABLED,\n isExternalPackagesEnabled: !env.PH_CONNECT_EXTERNAL_PACKAGES_DISABLED,\n } satisfies FullPHGlobalConfig;\n\n return config;\n}\n\nexport const phGlobalConfigFromEnv = getPHGlobalConfigFromEnv();\n\nexport const defaultPHDocumentEditorConfig: PHDocumentEditorConfig = {\n isExternalControlsEnabled: phGlobalConfigFromEnv.isExternalControlsEnabled,\n};\n\nexport const defaultPHAppConfig: PHAppConfig = {\n allowedDocumentTypes: phGlobalConfigFromEnv.allowedDocumentTypes,\n isDragAndDropEnabled: phGlobalConfigFromEnv.isDragAndDropEnabled,\n};\n\n// Set log level from validated config\nsetLogLevel(env.PH_CONNECT_LOG_LEVEL);\nlogger.debug(\"Setting log level to @level.\", env.PH_CONNECT_LOG_LEVEL);\n\n// Normalize the base path to ensure it starts and ends with a forward slash\nconst PH_CONNECT_BASE_PATH = normalizeBasePath(\n env.PH_CONNECT_BASE_PATH || import.meta.env.BASE_URL,\n);\n\n// Analytics database name with custom logic\nconst PH_CONNECT_ANALYTICS_DATABASE_NAME =\n env.PH_CONNECT_ANALYTICS_DATABASE_NAME ||\n `${PH_CONNECT_BASE_PATH.replace(/\\//g, \"\")}:analytics`;\n\nexport const connectConfig = {\n appVersion: env.PH_CONNECT_VERSION,\n studioMode: env.PH_CONNECT_STUDIO_MODE,\n warnOutdatedApp: env.PH_CONNECT_WARN_OUTDATED_APP,\n appVersionCheckInterval: env.PH_CONNECT_VERSION_CHECK_INTERVAL,\n routerBasename: PH_CONNECT_BASE_PATH,\n externalPackagesEnabled: !env.PH_CONNECT_EXTERNAL_PACKAGES_DISABLED,\n processors: {\n enabled: env.PH_CONNECT_PROCESSORS_ENABLED,\n externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,\n },\n analytics: {\n enabled: env.PH_CONNECT_ANALYTICS_ENABLED,\n databaseName: PH_CONNECT_ANALYTICS_DATABASE_NAME,\n useWorker: !env.PH_CONNECT_ANALYTICS_DATABASE_WORKER_DISABLED,\n driveAnalyticsEnabled: env.PH_CONNECT_DRIVE_ANALYTICS_ENABLED,\n diffProcessorEnabled: env.PH_CONNECT_DIFF_ANALYTICS_ENABLED,\n externalProcessorsEnabled: env.PH_CONNECT_EXTERNAL_PROCESSORS_ENABLED,\n },\n relational: {\n enabled: env.PH_CONNECT_RELATIONAL_PROCESSORS_ENABLED,\n externalProcessorsEnabled:\n env.PH_CONNECT_EXTERNAL_RELATIONAL_PROCESSORS_ENABLED,\n },\n renown: {\n url: env.PH_CONNECT_RENOWN_URL,\n networkId: env.PH_CONNECT_RENOWN_NETWORK_ID,\n chainId: env.PH_CONNECT_RENOWN_CHAIN_ID,\n },\n sentry: {\n release: env.PH_CONNECT_SENTRY_RELEASE,\n dsn: env.PH_CONNECT_SENTRY_DSN,\n env: env.PH_CONNECT_SENTRY_ENV,\n tracing: env.PH_CONNECT_SENTRY_TRACING_ENABLED,\n },\n content: {\n showSearchBar: env.PH_CONNECT_SEARCH_BAR_ENABLED,\n showDocumentModelSelectionSetting:\n !env.PH_CONNECT_HIDE_DOCUMENT_MODEL_SELECTION_SETTINGS,\n },\n drives: {\n addDriveEnabled: !env.PH_CONNECT_DISABLE_ADD_DRIVE,\n preserveStrategy: env.PH_CONNECT_DRIVES_PRESERVE_STRATEGY,\n sections: {\n LOCAL: {\n enabled: env.PH_CONNECT_LOCAL_DRIVES_ENABLED,\n allowAdd: !env.PH_CONNECT_DISABLE_ADD_LOCAL_DRIVES,\n allowDelete: !env.PH_CONNECT_DISABLE_DELETE_LOCAL_DRIVES,\n },\n CLOUD: {\n enabled: env.PH_CONNECT_CLOUD_DRIVES_ENABLED,\n allowAdd: !env.PH_CONNECT_DISABLE_ADD_CLOUD_DRIVES,\n allowDelete: !env.PH_CONNECT_DISABLE_DELETE_CLOUD_DRIVES,\n },\n PUBLIC: {\n enabled: env.PH_CONNECT_PUBLIC_DRIVES_ENABLED,\n allowAdd: !env.PH_CONNECT_DISABLE_ADD_PUBLIC_DRIVES,\n allowDelete: !env.PH_CONNECT_DISABLE_DELETE_PUBLIC_DRIVES,\n },\n },\n },\n gaTrackingId: env.PH_CONNECT_GA_TRACKING_ID,\n phCliVersion: env.PH_CONNECT_CLI_VERSION,\n packagesRegistry: env.PH_CONNECT_PACKAGES_REGISTRY,\n} as const;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
|
|
2
|
+
import { t as toast } from "./toast-iD-70hL8.js";
|
|
3
|
+
import { t as package_default } from "./package-B6-PosA0.js";
|
|
4
|
+
import { n as setMigrationStatus } from "./migration-status-B9oFtMAT.js";
|
|
5
|
+
import { n as createReactor } from "./reactor-f19C1Zwk.js";
|
|
6
|
+
import { useUser } from "@powerhousedao/reactor-browser";
|
|
7
|
+
import { logger } from "document-model";
|
|
8
|
+
import { createElement, useEffect } from "react";
|
|
9
|
+
import { setUser } from "@sentry/react";
|
|
10
|
+
import { useTranslation } from "react-i18next";
|
|
11
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
import { PGlite } from "@electric-sql/pglite";
|
|
13
|
+
import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from "@powerhousedao/shared/processors";
|
|
14
|
+
//#region src/components/reload-connect-toast.tsx
|
|
15
|
+
const ReloadConnectToast = () => {
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
|
|
18
|
+
className: "font-medium",
|
|
19
|
+
children: t("notifications.reloadApp")
|
|
20
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
21
|
+
onClick: () => location.reload(),
|
|
22
|
+
className: "underline decoration-solid underline-offset-2",
|
|
23
|
+
children: [t("common.reloadConnect"), " 🔄"]
|
|
24
|
+
})] });
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/hooks/useCheckLatestVersion.ts
|
|
28
|
+
const useCheckLatestVersion = () => {
|
|
29
|
+
async function checkLatestVersion() {
|
|
30
|
+
const result = await isLatestVersion();
|
|
31
|
+
if (result === null) return;
|
|
32
|
+
if (result.isLatest || result.currentVersion.includes("-")) return true;
|
|
33
|
+
if (import.meta.env.MODE === "development" || connectConfig.studioMode || !connectConfig.warnOutdatedApp) logger.warn("Connect is outdated: \nCurrent: @currentVersion\nLatest: @latestVersion", result.currentVersion, result.latestVersion);
|
|
34
|
+
else toast(createElement(ReloadConnectToast), {
|
|
35
|
+
type: "connect-warning",
|
|
36
|
+
toastId: "outdated-app",
|
|
37
|
+
autoClose: false
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
checkLatestVersion().catch(console.error);
|
|
42
|
+
}, []);
|
|
43
|
+
};
|
|
44
|
+
window.navigator.appVersion.includes("Mac");
|
|
45
|
+
const urlBranchMap = {
|
|
46
|
+
"staging/makerdao": "deployments/staging/makerdao",
|
|
47
|
+
"staging/arbitrum": "arb-ltip",
|
|
48
|
+
"staging/powerhouse": "staging",
|
|
49
|
+
makerdao: "deployments/makerdao",
|
|
50
|
+
arbitrum: "deployments/arbitrum",
|
|
51
|
+
arbgrants: "deployments/arbitrum",
|
|
52
|
+
localhost: "develop"
|
|
53
|
+
};
|
|
54
|
+
const getGithubLinkFromUrl = () => {
|
|
55
|
+
const githubLink = "https://raw.githubusercontent.com/powerhouse-inc/connect";
|
|
56
|
+
const url = window.location.href;
|
|
57
|
+
const env = Object.keys(urlBranchMap).find((env) => url.includes(env));
|
|
58
|
+
const value = env ? urlBranchMap[env] : void 0;
|
|
59
|
+
if (!value) return;
|
|
60
|
+
else return `${githubLink}/${value}/package.json`;
|
|
61
|
+
};
|
|
62
|
+
const fetchLatestVersion = async () => {
|
|
63
|
+
const link = getGithubLinkFromUrl();
|
|
64
|
+
if (!link) return;
|
|
65
|
+
const { version } = await (await fetch(link)).json();
|
|
66
|
+
return version;
|
|
67
|
+
};
|
|
68
|
+
const isLatestVersion = async () => {
|
|
69
|
+
const currentVersion = package_default.version;
|
|
70
|
+
const deployed = await fetchLatestVersion();
|
|
71
|
+
if (deployed) return {
|
|
72
|
+
isLatest: deployed === currentVersion,
|
|
73
|
+
currentVersion,
|
|
74
|
+
latestVersion: deployed
|
|
75
|
+
};
|
|
76
|
+
return null;
|
|
77
|
+
};
|
|
78
|
+
const IDB_STORE_NAME = "FILE_DATA";
|
|
79
|
+
const IDB_DB_VERSION = 21;
|
|
80
|
+
const BACKUP_PREFIX = "ph-pglite-backup::";
|
|
81
|
+
const BACKUP_INDEX_KEY = "ph:pglite-backups";
|
|
82
|
+
const BACKUP_RETENTION_MS = 720 * 60 * 60 * 1e3;
|
|
83
|
+
const PRIMARY_IDB_NAMES = [`/pglite/reactor`, `/pglite/${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`];
|
|
84
|
+
function idbError(req, context) {
|
|
85
|
+
const cause = req.error ?? /* @__PURE__ */ new Error("unknown IDB error");
|
|
86
|
+
return new Error(`${context}: ${cause.message}`, { cause });
|
|
87
|
+
}
|
|
88
|
+
const LEGACY_DUMPERS = { 16: async () => {
|
|
89
|
+
const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([import("pglite-legacy-02"), import("pglite-tools-legacy-02/pg_dump")]);
|
|
90
|
+
return async (idbName) => {
|
|
91
|
+
const pg = new LegacyPGlite(`idb://${idbName.replace(/^\/pglite\//, "")}`);
|
|
92
|
+
try {
|
|
93
|
+
await pg.waitReady;
|
|
94
|
+
return await (await pgDump({ pg })).text();
|
|
95
|
+
} finally {
|
|
96
|
+
await pg.close();
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
} };
|
|
100
|
+
function indexedDbExists(name) {
|
|
101
|
+
if (typeof indexedDB.databases === "function") return indexedDB.databases().then((dbs) => dbs.some((d) => d.name === name)).catch(() => true);
|
|
102
|
+
return Promise.resolve(true);
|
|
103
|
+
}
|
|
104
|
+
function openIdb(name, version, upgrade) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
const req = indexedDB.open(name, version);
|
|
107
|
+
req.onerror = () => reject(idbError(req, `IDB open failed for ${name}`));
|
|
108
|
+
req.onblocked = () => reject(/* @__PURE__ */ new Error(`IDB open blocked for ${name}`));
|
|
109
|
+
req.onupgradeneeded = () => upgrade?.(req.result);
|
|
110
|
+
req.onsuccess = () => resolve(req.result);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function deleteIdb(name, timeoutMs = 15e3) {
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const req = indexedDB.deleteDatabase(name);
|
|
116
|
+
let settled = false;
|
|
117
|
+
const done = (fn) => {
|
|
118
|
+
if (settled) return;
|
|
119
|
+
settled = true;
|
|
120
|
+
fn();
|
|
121
|
+
};
|
|
122
|
+
const timer = setTimeout(() => done(() => reject(/* @__PURE__ */ new Error(`IDB delete timed out for ${name} after ${timeoutMs}ms`))), timeoutMs);
|
|
123
|
+
req.onsuccess = () => done(() => {
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
resolve();
|
|
126
|
+
});
|
|
127
|
+
req.onerror = () => done(() => {
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
reject(idbError(req, `IDB delete failed for ${name}`));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function createFileDataStore(db) {
|
|
134
|
+
if (!db.objectStoreNames.contains(IDB_STORE_NAME)) db.createObjectStore(IDB_STORE_NAME).createIndex("timestamp", "timestamp", { unique: false });
|
|
135
|
+
}
|
|
136
|
+
async function readPgVersionFile(idbName) {
|
|
137
|
+
if (!await indexedDbExists(idbName)) return null;
|
|
138
|
+
let db;
|
|
139
|
+
try {
|
|
140
|
+
db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);
|
|
141
|
+
} catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
if (!db.objectStoreNames.contains(IDB_STORE_NAME)) return null;
|
|
146
|
+
const store = db.transaction(IDB_STORE_NAME, "readonly").objectStore(IDB_STORE_NAME);
|
|
147
|
+
const value = await new Promise((resolve, reject) => {
|
|
148
|
+
const req = store.openCursor();
|
|
149
|
+
req.onerror = () => reject(idbError(req, `FILE_DATA cursor failed for ${idbName}`));
|
|
150
|
+
req.onsuccess = () => {
|
|
151
|
+
const cursor = req.result;
|
|
152
|
+
if (!cursor) return resolve(null);
|
|
153
|
+
if ((typeof cursor.key === "string" ? cursor.key : "").endsWith("/PG_VERSION")) resolve(cursor.value);
|
|
154
|
+
else cursor.continue();
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
if (!value) return null;
|
|
158
|
+
const bytes = value.contents instanceof Uint8Array ? value.contents : new Uint8Array(value.contents);
|
|
159
|
+
const text = new TextDecoder().decode(bytes).trim();
|
|
160
|
+
const major = parseInt(text, 10);
|
|
161
|
+
return Number.isFinite(major) ? major : null;
|
|
162
|
+
} finally {
|
|
163
|
+
db.close();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function clearFileData(name) {
|
|
167
|
+
const db = await openIdb(name, IDB_DB_VERSION, createFileDataStore);
|
|
168
|
+
try {
|
|
169
|
+
await new Promise((resolve, reject) => {
|
|
170
|
+
const tx = db.transaction(IDB_STORE_NAME, "readwrite");
|
|
171
|
+
tx.oncomplete = () => resolve();
|
|
172
|
+
tx.onerror = () => reject(idbError(tx, `FILE_DATA clear failed for ${name}`));
|
|
173
|
+
tx.onabort = () => reject(idbError(tx, `FILE_DATA clear aborted for ${name}`));
|
|
174
|
+
tx.objectStore(IDB_STORE_NAME).clear();
|
|
175
|
+
});
|
|
176
|
+
} finally {
|
|
177
|
+
db.close();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function cloneFileData(sourceName, destName) {
|
|
181
|
+
const source = await openIdb(sourceName, IDB_DB_VERSION, createFileDataStore);
|
|
182
|
+
try {
|
|
183
|
+
const dest = await openIdb(destName, IDB_DB_VERSION, createFileDataStore);
|
|
184
|
+
try {
|
|
185
|
+
const readStore = source.transaction(IDB_STORE_NAME, "readonly").objectStore(IDB_STORE_NAME);
|
|
186
|
+
const entries = await new Promise((resolve, reject) => {
|
|
187
|
+
const out = [];
|
|
188
|
+
const req = readStore.openCursor();
|
|
189
|
+
req.onerror = () => reject(idbError(req, `FILE_DATA read cursor failed for ${sourceName}`));
|
|
190
|
+
req.onsuccess = () => {
|
|
191
|
+
const cursor = req.result;
|
|
192
|
+
if (!cursor) return resolve(out);
|
|
193
|
+
out.push({
|
|
194
|
+
key: cursor.key,
|
|
195
|
+
value: cursor.value
|
|
196
|
+
});
|
|
197
|
+
cursor.continue();
|
|
198
|
+
};
|
|
199
|
+
});
|
|
200
|
+
await new Promise((resolve, reject) => {
|
|
201
|
+
const writeTx = dest.transaction(IDB_STORE_NAME, "readwrite");
|
|
202
|
+
writeTx.oncomplete = () => resolve();
|
|
203
|
+
writeTx.onerror = () => reject(idbError(writeTx, `FILE_DATA write failed for ${destName}`));
|
|
204
|
+
writeTx.onabort = () => reject(idbError(writeTx, `FILE_DATA write aborted for ${destName}`));
|
|
205
|
+
const writeStore = writeTx.objectStore(IDB_STORE_NAME);
|
|
206
|
+
writeStore.clear();
|
|
207
|
+
for (const { key, value } of entries) writeStore.put(value, key);
|
|
208
|
+
});
|
|
209
|
+
} finally {
|
|
210
|
+
dest.close();
|
|
211
|
+
}
|
|
212
|
+
} finally {
|
|
213
|
+
source.close();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function readBackupIndex() {
|
|
217
|
+
try {
|
|
218
|
+
const raw = localStorage.getItem(BACKUP_INDEX_KEY);
|
|
219
|
+
if (!raw) return [];
|
|
220
|
+
const parsed = JSON.parse(raw);
|
|
221
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
222
|
+
} catch {
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function writeBackupIndex(records) {
|
|
227
|
+
try {
|
|
228
|
+
localStorage.setItem(BACKUP_INDEX_KEY, JSON.stringify(records));
|
|
229
|
+
} catch {}
|
|
230
|
+
}
|
|
231
|
+
function registerBackup(rec) {
|
|
232
|
+
writeBackupIndex([...readBackupIndex(), rec]);
|
|
233
|
+
}
|
|
234
|
+
function forgetBackup(name) {
|
|
235
|
+
writeBackupIndex(readBackupIndex().filter((r) => r.name !== name));
|
|
236
|
+
}
|
|
237
|
+
async function janitor() {
|
|
238
|
+
const cutoff = Date.now() - BACKUP_RETENTION_MS;
|
|
239
|
+
const keep = [];
|
|
240
|
+
for (const rec of readBackupIndex()) {
|
|
241
|
+
if (rec.createdAt >= cutoff) {
|
|
242
|
+
keep.push(rec);
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
await deleteIdb(rec.name);
|
|
247
|
+
} catch (err) {
|
|
248
|
+
console.warn(`Failed to delete expired pglite backup ${rec.name}`, err);
|
|
249
|
+
keep.push(rec);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
writeBackupIndex(keep);
|
|
253
|
+
}
|
|
254
|
+
function publishPhase(idbName, phase) {
|
|
255
|
+
setMigrationStatus({
|
|
256
|
+
idbName,
|
|
257
|
+
phase
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
async function migrateIdbIfNeeded(idbName) {
|
|
261
|
+
const major = await readPgVersionFile(idbName);
|
|
262
|
+
if (major === null || major === 17) return;
|
|
263
|
+
const loader = LEGACY_DUMPERS[major];
|
|
264
|
+
if (!loader) throw new Error(`Unsupported legacy PGlite data dir: PG_VERSION=${major} for ${idbName}`);
|
|
265
|
+
const backupName = `${BACKUP_PREFIX}${idbName}::${(/* @__PURE__ */ new Date()).toISOString()}`;
|
|
266
|
+
const backupRec = {
|
|
267
|
+
name: backupName,
|
|
268
|
+
idbName,
|
|
269
|
+
createdAt: Date.now()
|
|
270
|
+
};
|
|
271
|
+
publishPhase(idbName, "clone");
|
|
272
|
+
await cloneFileData(idbName, backupName);
|
|
273
|
+
registerBackup(backupRec);
|
|
274
|
+
let sql;
|
|
275
|
+
try {
|
|
276
|
+
publishPhase(idbName, "dump");
|
|
277
|
+
sql = await (await loader())(idbName);
|
|
278
|
+
} catch (err) {
|
|
279
|
+
await deleteIdb(backupName).catch(() => {});
|
|
280
|
+
forgetBackup(backupName);
|
|
281
|
+
throw err;
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
await clearFileData(idbName);
|
|
285
|
+
publishPhase(idbName, "restore");
|
|
286
|
+
const pg = new PGlite(`idb://${idbName.replace(/^\/pglite\//, "")}`, { relaxedDurability: false });
|
|
287
|
+
try {
|
|
288
|
+
await pg.waitReady;
|
|
289
|
+
await pg.exec(sql);
|
|
290
|
+
} finally {
|
|
291
|
+
await pg.close();
|
|
292
|
+
}
|
|
293
|
+
} catch (err) {
|
|
294
|
+
await rollbackFromBackup(idbName, backupName, err);
|
|
295
|
+
throw err;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async function rollbackFromBackup(idbName, backupName, originalError) {
|
|
299
|
+
try {
|
|
300
|
+
await clearFileData(idbName).catch(() => {});
|
|
301
|
+
await cloneFileData(backupName, idbName);
|
|
302
|
+
} catch (rollbackErr) {
|
|
303
|
+
console.error(`PGlite migration failed AND rollback failed for ${idbName}. Primary error:`, originalError, "Rollback error:", rollbackErr);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
await deleteIdb(backupName).catch(() => {});
|
|
307
|
+
forgetBackup(backupName);
|
|
308
|
+
}
|
|
309
|
+
async function migrateAllLocked() {
|
|
310
|
+
for (const idbName of PRIMARY_IDB_NAMES) await migrateIdbIfNeeded(idbName);
|
|
311
|
+
setMigrationStatus(null);
|
|
312
|
+
}
|
|
313
|
+
async function migrateAllIfNeeded() {
|
|
314
|
+
janitor().catch((err) => console.warn("PGlite backup janitor failed", err));
|
|
315
|
+
if (!(typeof navigator !== "undefined" && "locks" in navigator && typeof navigator.locks.request === "function")) {
|
|
316
|
+
await migrateAllLocked();
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
await navigator.locks.request("ph-pglite-migration", { mode: "exclusive" }, async () => {
|
|
320
|
+
await migrateAllLocked();
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
//#endregion
|
|
324
|
+
//#region src/store/user.ts
|
|
325
|
+
function useSetSentryUser() {
|
|
326
|
+
const user = useUser();
|
|
327
|
+
useEffect(() => {
|
|
328
|
+
let sentryUser = null;
|
|
329
|
+
if (user) {
|
|
330
|
+
const { credential, ...rest } = user;
|
|
331
|
+
sentryUser = {
|
|
332
|
+
id: rest.did,
|
|
333
|
+
username: rest.ens?.name,
|
|
334
|
+
...rest
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
setUser(sentryUser);
|
|
338
|
+
}, [user]);
|
|
339
|
+
}
|
|
340
|
+
//#endregion
|
|
341
|
+
//#region src/components/load.tsx
|
|
342
|
+
async function loadComponent(localPackage) {
|
|
343
|
+
await migrateAllIfNeeded();
|
|
344
|
+
await createReactor(localPackage);
|
|
345
|
+
return { default: ({ children }) => {
|
|
346
|
+
useSetSentryUser();
|
|
347
|
+
useCheckLatestVersion();
|
|
348
|
+
return children;
|
|
349
|
+
} };
|
|
350
|
+
}
|
|
351
|
+
//#endregion
|
|
352
|
+
export { loadComponent };
|
|
353
|
+
|
|
354
|
+
//# sourceMappingURL=load-CRBdgq0Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-CRBdgq0Y.js","names":["packageJson"],"sources":["../src/components/reload-connect-toast.tsx","../src/hooks/useCheckLatestVersion.ts","../src/hooks/utils.ts","../src/utils/pglite-migration.ts","../src/store/user.ts","../src/components/load.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n","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 { PGlite } from \"@electric-sql/pglite\";\nimport { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\nimport {\n setMigrationStatus,\n type MigrationPhase,\n} from \"../components/migration-status.js\";\n\nexport const CURRENT_PG_MAJOR = 17;\n\nconst IDB_STORE_NAME = \"FILE_DATA\";\nconst IDB_DB_VERSION = 21;\nconst BACKUP_PREFIX = \"ph-pglite-backup::\";\nconst BACKUP_INDEX_KEY = \"ph:pglite-backups\";\nconst BACKUP_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;\n\nconst PRIMARY_IDB_NAMES = [\n `/pglite/reactor`,\n `/pglite/${DEFAULT_RELATIONAL_PROCESSOR_DB_NAME}`,\n] as const;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nfunction idbError(req: IDBRequest | IDBTransaction, context: string): Error {\n const cause = req.error ?? new Error(\"unknown IDB error\");\n return new Error(`${context}: ${cause.message}`, { cause });\n}\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\nfunction indexedDbExists(name: string): Promise<boolean> {\n if (typeof indexedDB.databases === \"function\") {\n return indexedDB\n .databases()\n .then((dbs) => dbs.some((d) => d.name === name))\n .catch(() => true);\n }\n return Promise.resolve(true);\n}\n\nfunction openIdb(\n name: string,\n version: number,\n upgrade?: (db: IDBDatabase) => void,\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(name, version);\n req.onerror = () => reject(idbError(req, `IDB open failed for ${name}`));\n req.onblocked = () => reject(new Error(`IDB open blocked for ${name}`));\n req.onupgradeneeded = () => upgrade?.(req.result);\n req.onsuccess = () => resolve(req.result);\n });\n}\n\n// Emscripten IDBFS holds the IDB connection open past pglite's pg.close(),\n// so deleteDatabase can be blocked indefinitely. Callers on the hot path\n// should prefer clearFileData() instead; deleteIdb is only used by the\n// janitor for expired backups, which tolerates the 15s timeout.\nfunction deleteIdb(name: string, timeoutMs = 15_000): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(name);\n let settled = false;\n const done = (fn: () => void) => {\n if (settled) return;\n settled = true;\n fn();\n };\n const timer = setTimeout(\n () =>\n done(() =>\n reject(\n new Error(`IDB delete timed out for ${name} after ${timeoutMs}ms`),\n ),\n ),\n timeoutMs,\n );\n req.onsuccess = () =>\n done(() => {\n clearTimeout(timer);\n resolve();\n });\n req.onerror = () =>\n done(() => {\n clearTimeout(timer);\n reject(idbError(req, `IDB delete failed for ${name}`));\n });\n });\n}\n\nfunction createFileDataStore(db: IDBDatabase): void {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) {\n const store = db.createObjectStore(IDB_STORE_NAME);\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n }\n}\n\nasync function readPgVersionFile(idbName: string): Promise<number | null> {\n if (!(await indexedDbExists(idbName))) return null;\n let db: IDBDatabase;\n try {\n db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n } catch {\n return null;\n }\n try {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) return null;\n const tx = db.transaction(IDB_STORE_NAME, \"readonly\");\n const store = tx.objectStore(IDB_STORE_NAME);\n const value = await new Promise<FileDataValue | null>((resolve, reject) => {\n const req = store.openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(null);\n const key = typeof cursor.key === \"string\" ? cursor.key : \"\";\n if (key.endsWith(\"/PG_VERSION\")) {\n resolve(cursor.value as FileDataValue);\n } else {\n cursor.continue();\n }\n };\n });\n if (!value) return null;\n const bytes =\n value.contents instanceof Uint8Array\n ? value.contents\n : new Uint8Array(value.contents);\n const text = new TextDecoder().decode(bytes).trim();\n const major = parseInt(text, 10);\n return Number.isFinite(major) ? major : null;\n } finally {\n db.close();\n }\n}\n\nasync function clearFileData(name: string): Promise<void> {\n const db = await openIdb(name, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${name}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${name}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nasync function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n const source = await openIdb(sourceName, IDB_DB_VERSION, createFileDataStore);\n try {\n const dest = await openIdb(destName, IDB_DB_VERSION, createFileDataStore);\n try {\n const readTx = source.transaction(IDB_STORE_NAME, \"readonly\");\n const readStore = readTx.objectStore(IDB_STORE_NAME);\n const entries = await new Promise<\n Array<{ key: IDBValidKey; value: FileDataValue }>\n >((resolve, reject) => {\n const out: Array<{ key: IDBValidKey; value: FileDataValue }> = [];\n const req = readStore.openCursor();\n req.onerror = () =>\n reject(\n idbError(req, `FILE_DATA read cursor failed for ${sourceName}`),\n );\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n\n await new Promise<void>((resolve, reject) => {\n const writeTx = dest.transaction(IDB_STORE_NAME, \"readwrite\");\n writeTx.oncomplete = () => resolve();\n writeTx.onerror = () =>\n reject(idbError(writeTx, `FILE_DATA write failed for ${destName}`));\n writeTx.onabort = () =>\n reject(idbError(writeTx, `FILE_DATA write aborted for ${destName}`));\n const writeStore = writeTx.objectStore(IDB_STORE_NAME);\n writeStore.clear();\n for (const { key, value } of entries) {\n writeStore.put(value, key);\n }\n });\n } finally {\n dest.close();\n }\n } finally {\n source.close();\n }\n}\n\ntype BackupRecord = { name: string; idbName: string; createdAt: number };\n\nfunction readBackupIndex(): BackupRecord[] {\n try {\n const raw = localStorage.getItem(BACKUP_INDEX_KEY);\n if (!raw) return [];\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as BackupRecord[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction writeBackupIndex(records: BackupRecord[]): void {\n try {\n localStorage.setItem(BACKUP_INDEX_KEY, JSON.stringify(records));\n } catch {\n // ignore quota errors — janitor is best-effort\n }\n}\n\nfunction registerBackup(rec: BackupRecord): void {\n writeBackupIndex([...readBackupIndex(), rec]);\n}\n\nfunction forgetBackup(name: string): void {\n writeBackupIndex(readBackupIndex().filter((r) => r.name !== name));\n}\n\nasync function janitor(): Promise<void> {\n const cutoff = Date.now() - BACKUP_RETENTION_MS;\n const keep: BackupRecord[] = [];\n for (const rec of readBackupIndex()) {\n if (rec.createdAt >= cutoff) {\n keep.push(rec);\n continue;\n }\n try {\n await deleteIdb(rec.name);\n } catch (err) {\n console.warn(`Failed to delete expired pglite backup ${rec.name}`, err);\n keep.push(rec);\n }\n }\n writeBackupIndex(keep);\n}\n\nfunction publishPhase(idbName: string, phase: MigrationPhase): void {\n setMigrationStatus({ idbName, phase });\n}\n\nasync function migrateIdbIfNeeded(idbName: string): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `Unsupported legacy PGlite data dir: PG_VERSION=${major} for ${idbName}`,\n );\n }\n\n const backupName = `${BACKUP_PREFIX}${idbName}::${new Date().toISOString()}`;\n const backupRec: BackupRecord = {\n name: backupName,\n idbName,\n createdAt: Date.now(),\n };\n\n publishPhase(idbName, \"clone\");\n await cloneFileData(idbName, backupName);\n registerBackup(backupRec);\n\n let sql: string;\n try {\n publishPhase(idbName, \"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await deleteIdb(backupName).catch(() => {});\n forgetBackup(backupName);\n throw err;\n }\n\n try {\n // Can't deleteDatabase here: Emscripten IDBFS from the legacy PGlite\n // keeps its IDB connection open past pg.close(). Clearing the store\n // in-place leaves the IDB handle alone, and the fresh PGlite will\n // initdb into the empty VFS.\n await clearFileData(idbName);\n publishPhase(idbName, \"restore\");\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n await pg.exec(sql);\n } finally {\n await pg.close();\n }\n } catch (err) {\n await rollbackFromBackup(idbName, backupName, err);\n throw err;\n }\n}\n\nasync function rollbackFromBackup(\n idbName: string,\n backupName: string,\n originalError: unknown,\n): Promise<void> {\n try {\n await clearFileData(idbName).catch(() => {});\n await cloneFileData(backupName, idbName);\n } catch (rollbackErr) {\n console.error(\n `PGlite migration failed AND rollback failed for ${idbName}. Primary error:`,\n originalError,\n \"Rollback error:\",\n rollbackErr,\n );\n return;\n }\n await deleteIdb(backupName).catch(() => {});\n forgetBackup(backupName);\n}\n\nasync function migrateAllLocked(): Promise<void> {\n for (const idbName of PRIMARY_IDB_NAMES) {\n await migrateIdbIfNeeded(idbName);\n }\n setMigrationStatus(null);\n}\n\nexport async function migrateAllIfNeeded(): Promise<void> {\n janitor().catch((err) => console.warn(\"PGlite backup janitor failed\", err));\n\n const hasLocks =\n typeof navigator !== \"undefined\" &&\n \"locks\" in navigator &&\n typeof navigator.locks.request === \"function\";\n\n if (!hasLocks) {\n await migrateAllLocked();\n return;\n }\n\n await navigator.locks.request(\n \"ph-pglite-migration\",\n { mode: \"exclusive\" },\n async () => {\n await migrateAllLocked();\n },\n );\n}\n","import { useUser } from \"@powerhousedao/reactor-browser\";\nimport type { User as SentryUser } from \"@sentry/react\";\nimport { setUser as setSentryUser } from \"@sentry/react\";\nimport { useEffect } from \"react\";\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, ...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 { migrateAllIfNeeded } from \"@powerhousedao/connect/utils\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { type ReactNode } from \"react\";\n\nexport async function loadComponent(localPackage?: DocumentModelLib) {\n await migrateAllIfNeeded();\n await createReactor(localPackage);\n return {\n default: ({ children }: { children?: ReactNode }) => {\n useSetSentryUser();\n useCheckLatestVersion();\n return children;\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/main.js
CHANGED