@powerhousedao/connect 6.2.0-dev.38 → 6.2.0-dev.39
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/{AddDriveModal-BoKLJyUY.js → AddDriveModal-D-nbV40j.js} +4 -4
- package/dist/{AddDriveModal-BoKLJyUY.js.map → AddDriveModal-D-nbV40j.js.map} +1 -1
- package/dist/{ClearStorageModal-kAd_wAOs.js → ClearStorageModal-Y34xFYii.js} +4 -4
- package/dist/{ClearStorageModal-kAd_wAOs.js.map → ClearStorageModal-Y34xFYii.js.map} +1 -1
- package/dist/{CookiesPolicyModal-1nOh6oN3.js → CookiesPolicyModal-CkcUKPLb.js} +3 -3
- package/dist/{CookiesPolicyModal-1nOh6oN3.js.map → CookiesPolicyModal-CkcUKPLb.js.map} +1 -1
- package/dist/{CreateDocumentModal-nQbLVDq3.js → CreateDocumentModal-CvsTh0HM.js} +3 -3
- package/dist/{CreateDocumentModal-nQbLVDq3.js.map → CreateDocumentModal-CvsTh0HM.js.map} +1 -1
- package/dist/{DebugSettingsModal-COZ8ehrF.js → DebugSettingsModal-CwLH5KC9.js} +6 -6
- package/dist/{DebugSettingsModal-COZ8ehrF.js.map → DebugSettingsModal-CwLH5KC9.js.map} +1 -1
- package/dist/{DeleteDriveModal-6P0T1QgD.js → DeleteDriveModal-DSTK8FYk.js} +4 -4
- package/dist/{DeleteDriveModal-6P0T1QgD.js.map → DeleteDriveModal-DSTK8FYk.js.map} +1 -1
- package/dist/{DeleteItemModal-BmV1aQyZ.js → DeleteItemModal-B2nJmjsP.js} +4 -4
- package/dist/{DeleteItemModal-BmV1aQyZ.js.map → DeleteItemModal-B2nJmjsP.js.map} +1 -1
- package/dist/{DisclaimerModal-CVTFfN0_.js → DisclaimerModal-D5FO34u9.js} +3 -3
- package/dist/{DisclaimerModal-CVTFfN0_.js.map → DisclaimerModal-D5FO34u9.js.map} +1 -1
- package/dist/{DownloadDocumentWithErrorsModal-CXeFUtaz.js → DownloadDocumentWithErrorsModal-tEr3bbtN.js} +3 -3
- package/dist/{DownloadDocumentWithErrorsModal-CXeFUtaz.js.map → DownloadDocumentWithErrorsModal-tEr3bbtN.js.map} +1 -1
- package/dist/{DriveAuthRequiredModal-B3VdLwSH.js → DriveAuthRequiredModal-B5-ZfKsb.js} +3 -3
- package/dist/{DriveAuthRequiredModal-B3VdLwSH.js.map → DriveAuthRequiredModal-B5-ZfKsb.js.map} +1 -1
- package/dist/{DriveSettingsModal-CsNFEJ9E.js → DriveSettingsModal-kR3hQnh4.js} +4 -4
- package/dist/DriveSettingsModal-kR3hQnh4.js.map +1 -0
- package/dist/{InspectorModal-so7krTny.js → InspectorModal-C1MvTLQV.js} +84 -35
- package/dist/InspectorModal-C1MvTLQV.js.map +1 -0
- package/dist/{MissingPackageModal-Bn036mWQ.js → MissingPackageModal-BQcCQbOn.js} +4 -4
- package/dist/{MissingPackageModal-Bn036mWQ.js.map → MissingPackageModal-BQcCQbOn.js.map} +1 -1
- package/dist/{SettingsModal-CZ4zSICk.js → SettingsModal-C0gXNY6D.js} +9 -9
- package/dist/SettingsModal-C0gXNY6D.js.map +1 -0
- package/dist/{UpgradeDriveModal-C7lV4rAX.js → UpgradeDriveModal-BZGSE9_r.js} +3 -3
- package/dist/{UpgradeDriveModal-C7lV4rAX.js.map → UpgradeDriveModal-BZGSE9_r.js.map} +1 -1
- package/dist/app-loader-BVgVR-WX.js +4 -0
- package/dist/{app-loader-BcXcehGe.js → app-loader-BeaPtqWb.js} +193 -258
- package/dist/app-loader-BeaPtqWb.js.map +1 -0
- package/dist/{build-info-BCK6n_XY.js → build-info-BNG5pRW5.js} +8 -5
- package/dist/{build-info-BCK6n_XY.js.map → build-info-BNG5pRW5.js.map} +1 -1
- package/dist/components-DGNTgcZV.js +5 -0
- package/dist/{connect.config-Bt4pvvWV.js → connect.config-BG681xG9.js} +3 -3
- package/dist/{connect.config-Bt4pvvWV.js.map → connect.config-BG681xG9.js.map} +1 -1
- package/dist/connection-state-Cig644T0.js +126 -0
- package/dist/connection-state-Cig644T0.js.map +1 -0
- package/dist/{load-BRBI6pnT.js → load-C-XbtAd4.js} +11 -11
- package/dist/{load-BRBI6pnT.js.map → load-C-XbtAd4.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-B-TZdzz9.js → package-DUieCgZv.js} +5 -4
- package/dist/package-DUieCgZv.js.map +1 -0
- package/dist/{pglite-runtime-Ch2YeUAA.js → pglite-major-B39aOEiE.js} +8 -51
- package/dist/pglite-major-B39aOEiE.js.map +1 -0
- package/dist/pglite-migrate-core-Boxqqx-c.js +143 -0
- package/dist/pglite-migrate-core-Boxqqx-c.js.map +1 -0
- package/dist/{pglite-seed-BWk7yOwr.js → pglite-seed-9rjhdCs5.js} +4 -4
- package/dist/{pglite-seed-BWk7yOwr.js.map → pglite-seed-9rjhdCs5.js.map} +1 -1
- package/dist/{reactor-BkaNhcsJ.js → reactor-DCmBjI53.js} +229 -17
- package/dist/reactor-DCmBjI53.js.map +1 -0
- package/dist/reactor.worker.d.ts +1 -0
- package/dist/reactor.worker.js +316 -0
- package/dist/reactor.worker.js.map +1 -0
- package/dist/{registerServiceWorker-D9l1kja7.js → registerServiceWorker-2tRbkdJj.js} +4 -4
- package/dist/{registerServiceWorker-D9l1kja7.js.map → registerServiceWorker-2tRbkdJj.js.map} +1 -1
- package/dist/{reload-connect-toast-CwvSc6F-.js → reload-connect-toast-qibmlgQm.js} +3 -3
- package/dist/{reload-connect-toast-CwvSc6F-.js.map → reload-connect-toast-qibmlgQm.js.map} +1 -1
- package/dist/start-connect.js +1 -1
- package/dist/{toast-BEy42aYx.js → toast-4t-VimvD.js} +3 -3
- package/dist/{toast-BEy42aYx.js.map → toast-4t-VimvD.js.map} +1 -1
- package/dist/{useRegistryPackages-B-gFECmd.js → useRegistryPackages-BaYtekjQ.js} +3 -3
- package/dist/{useRegistryPackages-B-gFECmd.js.map → useRegistryPackages-BaYtekjQ.js.map} +1 -1
- package/package.json +11 -10
- package/dist/DriveSettingsModal-CsNFEJ9E.js.map +0 -1
- package/dist/InspectorModal-so7krTny.js.map +0 -1
- package/dist/SettingsModal-CZ4zSICk.js.map +0 -1
- package/dist/app-loader-BcXcehGe.js.map +0 -1
- package/dist/app-loader-gIHublFd.js +0 -4
- package/dist/components-Chon07yw.js +0 -5
- package/dist/package-B-TZdzz9.js.map +0 -1
- package/dist/pglite-runtime-Ch2YeUAA.js.map +0 -1
- package/dist/reactor-BkaNhcsJ.js.map +0 -1
|
@@ -0,0 +1,316 @@
|
|
|
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]="8c1df25e-941e-518a-9c1d-ab758077d702")}catch(e){}}();
|
|
3
|
+
import { a as resolvePgMajorForRuntime, r as loadPGliteModule, t as coerceMajor, u as readPgVersionFile } from "./pglite-major-B39aOEiE.js";
|
|
4
|
+
import { a as writeFileData, i as readFileData, r as migrateIdb, t as clearFileData } from "./pglite-migrate-core-Boxqqx-c.js";
|
|
5
|
+
import { createRelationalDb } from "@powerhousedao/shared/processors";
|
|
6
|
+
import { ChannelScheme, DocumentIntegrityService, DriveCollectionId, InMemoryQueue, ReactorBuilder, ReactorClientBuilder } from "@powerhousedao/reactor";
|
|
7
|
+
import { baseDocumentModels } from "@powerhousedao/reactor-browser/base-document-models";
|
|
8
|
+
import { FORWARDED_EVENT_TYPES, ReactorHost, SYNC_STATUS_CHANGED_EVENT, WorkerPackageLoader } from "@powerhousedao/reactor-browser/rpc";
|
|
9
|
+
import * as commonDocumentModels from "@powerhousedao/powerhouse-vetra-packages/document-models";
|
|
10
|
+
import * as vetraDocumentModels from "@powerhousedao/vetra/document-models";
|
|
11
|
+
import { BrowserKeyStorage, RenownCryptoBuilder, RenownCryptoSigner, createSignatureVerifier } from "@renown/sdk/crypto";
|
|
12
|
+
import { Kysely } from "kysely";
|
|
13
|
+
import { PGliteDialect } from "kysely-pglite-dialect";
|
|
14
|
+
//#region src/reactor.worker.ts
|
|
15
|
+
console.info("[reactor.worker] module evaluating");
|
|
16
|
+
const RENOWN_APP_NAME = "connect";
|
|
17
|
+
const bundledDocumentModels = [...Object.values(commonDocumentModels), ...Object.values(vetraDocumentModels)].filter((m) => typeof m === "object" && m !== null && "documentModel" in m && "reducer" in m);
|
|
18
|
+
let loader;
|
|
19
|
+
let registry;
|
|
20
|
+
let signer;
|
|
21
|
+
let syncManager;
|
|
22
|
+
const relational = {};
|
|
23
|
+
const owned = {};
|
|
24
|
+
let inspectorQueue;
|
|
25
|
+
let inspectorProcessors;
|
|
26
|
+
let inspectorIntegrity;
|
|
27
|
+
let currentIdentity = null;
|
|
28
|
+
const registeredKeys = /* @__PURE__ */ new Set();
|
|
29
|
+
function modelKey(module) {
|
|
30
|
+
return `${module.documentModel.global.id}@${module.version ?? 1}`;
|
|
31
|
+
}
|
|
32
|
+
function toWireRemote(remote) {
|
|
33
|
+
return {
|
|
34
|
+
meta: remote.meta,
|
|
35
|
+
connectionState: remote.channel.getConnectionState()
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function registerNewModules() {
|
|
39
|
+
if (!loader || !registry) return;
|
|
40
|
+
const fresh = loader.models.filter((m) => !registeredKeys.has(modelKey(m)));
|
|
41
|
+
if (fresh.length === 0) return;
|
|
42
|
+
registry.registerModules(...fresh);
|
|
43
|
+
for (const m of fresh) registeredKeys.add(modelKey(m));
|
|
44
|
+
}
|
|
45
|
+
async function buildWorkerCrypto() {
|
|
46
|
+
const keyStorage = await BrowserKeyStorage.create();
|
|
47
|
+
return new RenownCryptoBuilder().withKeyPairStorage(keyStorage).build();
|
|
48
|
+
}
|
|
49
|
+
async function openReactorPglite(namespace) {
|
|
50
|
+
const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));
|
|
51
|
+
const major = resolvePgMajorForRuntime(detected);
|
|
52
|
+
if (major !== 17) console.warn(`[reactor.worker] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`);
|
|
53
|
+
const { PGlite } = await loadPGliteModule(major);
|
|
54
|
+
return {
|
|
55
|
+
pg: new PGlite(`idb://${namespace}`, { relaxedDurability: true }),
|
|
56
|
+
detected
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function loadPgLive(major) {
|
|
60
|
+
if (major === 16) return import("pglite-legacy-02/live");
|
|
61
|
+
return import("@electric-sql/pglite/live");
|
|
62
|
+
}
|
|
63
|
+
async function openRelational(namespace) {
|
|
64
|
+
try {
|
|
65
|
+
const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));
|
|
66
|
+
const major = resolvePgMajorForRuntime(detected);
|
|
67
|
+
if (major !== 17) console.warn(`[reactor.worker] Relational store opening legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`);
|
|
68
|
+
const [{ PGlite }, { live }] = await Promise.all([loadPGliteModule(major), loadPgLive(major)]);
|
|
69
|
+
const pg = new PGlite(`idb://${namespace}`, {
|
|
70
|
+
relaxedDurability: true,
|
|
71
|
+
extensions: { live }
|
|
72
|
+
});
|
|
73
|
+
relational.pg = pg;
|
|
74
|
+
relational.db = createRelationalDb(new Kysely({ dialect: new PGliteDialect(pg) }));
|
|
75
|
+
console.info(`[reactor.worker] Relational store opened: idb://${namespace} (Postgres ${major}).`);
|
|
76
|
+
return detected;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error("[reactor.worker] Failed to open the relational store:", error);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let migrationState = { status: "idle" };
|
|
83
|
+
function setMigration(state) {
|
|
84
|
+
migrationState = state;
|
|
85
|
+
host.setMigrationState(state);
|
|
86
|
+
}
|
|
87
|
+
const inMemoryBackup = {
|
|
88
|
+
snapshot: (idbName) => readFileData(idbName),
|
|
89
|
+
rollback: (handle, idbName) => writeFileData(idbName, handle),
|
|
90
|
+
discard: () => Promise.resolve(),
|
|
91
|
+
commit: () => Promise.resolve()
|
|
92
|
+
};
|
|
93
|
+
const host = new ReactorHost({
|
|
94
|
+
namespace: self.name ?? "",
|
|
95
|
+
onAdminRestart: () => host.broadcastReload("admin restart", crypto.randomUUID()),
|
|
96
|
+
onAdminClearStorage: async () => {
|
|
97
|
+
await relational.pg?.close();
|
|
98
|
+
await owned.reactorPg?.close();
|
|
99
|
+
for (const idbName of [owned.reactorIdb, owned.relationalIdb]) if (idbName) await clearFileData(idbName);
|
|
100
|
+
host.broadcastReload("storage cleared", crypto.randomUUID());
|
|
101
|
+
},
|
|
102
|
+
onAdminMigrate: async () => {
|
|
103
|
+
setMigration({
|
|
104
|
+
status: "migrating",
|
|
105
|
+
legacyMajor: migrationState.legacyMajor
|
|
106
|
+
});
|
|
107
|
+
if (relational.pg) await relational.pg.close().catch(() => void 0);
|
|
108
|
+
if (owned.reactorPg) await owned.reactorPg.close().catch(() => void 0);
|
|
109
|
+
try {
|
|
110
|
+
for (const idbName of [owned.reactorIdb, owned.relationalIdb]) if (idbName) await migrateIdb(idbName, (phase) => setMigration({
|
|
111
|
+
status: "migrating",
|
|
112
|
+
legacyMajor: migrationState.legacyMajor,
|
|
113
|
+
phase
|
|
114
|
+
}), inMemoryBackup);
|
|
115
|
+
host.broadcastReload("migration complete", crypto.randomUUID());
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.error("[reactor.worker] Migration failed:", error);
|
|
118
|
+
setMigration({
|
|
119
|
+
status: "failed",
|
|
120
|
+
error: error instanceof Error ? error.message : String(error)
|
|
121
|
+
});
|
|
122
|
+
host.broadcastReload("migration failed", crypto.randomUUID());
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
build: async (raw) => {
|
|
126
|
+
let phase = "init";
|
|
127
|
+
try {
|
|
128
|
+
const construct = raw;
|
|
129
|
+
phase = "loading packages";
|
|
130
|
+
console.info(`[reactor.worker] boot: ${phase}`);
|
|
131
|
+
loader = new WorkerPackageLoader({
|
|
132
|
+
cdnUrl: construct.cdnUrl,
|
|
133
|
+
importPackage: (url) => import(
|
|
134
|
+
/* @vite-ignore */
|
|
135
|
+
url
|
|
136
|
+
)
|
|
137
|
+
});
|
|
138
|
+
const loaded = await loader.loadPackages(construct.packageSpecs);
|
|
139
|
+
const models = baseDocumentModels.concat(bundledDocumentModels, loaded);
|
|
140
|
+
phase = "opening pglite stores";
|
|
141
|
+
console.info(`[reactor.worker] boot: ${phase}`);
|
|
142
|
+
const [reactor, relationalMajor] = await Promise.all([openReactorPglite(construct.namespace), openRelational(construct.relationalNamespace)]);
|
|
143
|
+
const pg = reactor.pg;
|
|
144
|
+
owned.reactorPg = pg;
|
|
145
|
+
owned.reactorIdb = `/pglite/${construct.namespace}`;
|
|
146
|
+
owned.relationalIdb = `/pglite/${construct.relationalNamespace}`;
|
|
147
|
+
const legacyMajor = [reactor.detected, relationalMajor].find((m) => m !== null && m !== 17);
|
|
148
|
+
if (legacyMajor !== void 0) setMigration({
|
|
149
|
+
status: "needed",
|
|
150
|
+
legacyMajor
|
|
151
|
+
});
|
|
152
|
+
phase = "building crypto";
|
|
153
|
+
console.info(`[reactor.worker] boot: ${phase}`);
|
|
154
|
+
const crypto = await buildWorkerCrypto();
|
|
155
|
+
signer = new RenownCryptoSigner(crypto, RENOWN_APP_NAME, currentIdentity ?? void 0);
|
|
156
|
+
const jwtHandler = async () => currentIdentity ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 }) : void 0;
|
|
157
|
+
phase = "building reactor module";
|
|
158
|
+
console.info(`[reactor.worker] boot: ${phase}`);
|
|
159
|
+
const builder = new ReactorClientBuilder().withSigner({
|
|
160
|
+
signer,
|
|
161
|
+
verifier: createSignatureVerifier()
|
|
162
|
+
}).withReactorBuilder(new ReactorBuilder().withDocumentModels(models).withChannelScheme(ChannelScheme.CONNECT).withJwtHandler(jwtHandler).withKysely(new Kysely({ dialect: new PGliteDialect(pg) })));
|
|
163
|
+
builder.withDocumentModelLoader(loader);
|
|
164
|
+
const module = await builder.buildModule();
|
|
165
|
+
registry = module.reactorModule?.documentModelRegistry;
|
|
166
|
+
syncManager = module.reactorModule?.syncModule?.syncManager;
|
|
167
|
+
const rm = module.reactorModule;
|
|
168
|
+
if (rm) {
|
|
169
|
+
inspectorQueue = rm.queue instanceof InMemoryQueue ? rm.queue : void 0;
|
|
170
|
+
inspectorProcessors = rm.processorManager;
|
|
171
|
+
inspectorIntegrity = new DocumentIntegrityService(rm.keyframeStore, rm.operationStore, rm.writeCache, rm.documentView, rm.documentModelRegistry);
|
|
172
|
+
}
|
|
173
|
+
for (const m of models) registeredKeys.add(modelKey(m));
|
|
174
|
+
for (const type of FORWARDED_EVENT_TYPES) module.eventBus.subscribe(type, (forwardedType, event) => host.broadcastBusEvent(forwardedType, event));
|
|
175
|
+
syncManager?.onSyncStatusChange((documentId, status) => host.broadcastBusEvent(SYNC_STATUS_CHANGED_EVENT, {
|
|
176
|
+
documentId,
|
|
177
|
+
status
|
|
178
|
+
}));
|
|
179
|
+
console.info("[reactor.worker] boot: complete");
|
|
180
|
+
return module.client;
|
|
181
|
+
} catch (error) {
|
|
182
|
+
console.error(`[reactor.worker] boot failed at phase "${phase}":`, error);
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
registerPackages: async (specs) => {
|
|
187
|
+
if (!loader) return;
|
|
188
|
+
await loader.loadPackages(specs);
|
|
189
|
+
registerNewModules();
|
|
190
|
+
},
|
|
191
|
+
onIdentity: (user) => {
|
|
192
|
+
currentIdentity = user;
|
|
193
|
+
if (signer) signer.user = user ?? void 0;
|
|
194
|
+
},
|
|
195
|
+
onSyncOp: async (method, args) => {
|
|
196
|
+
if (!syncManager) throw new Error("SyncManager not available");
|
|
197
|
+
switch (method) {
|
|
198
|
+
case "list": return syncManager.list().map(toWireRemote);
|
|
199
|
+
case "add": {
|
|
200
|
+
const [name, collectionIdKey, channelConfig, filter, options] = args;
|
|
201
|
+
return toWireRemote(await syncManager.add(name, DriveCollectionId.fromKey(collectionIdKey), channelConfig, filter, options));
|
|
202
|
+
}
|
|
203
|
+
case "remove":
|
|
204
|
+
await syncManager.remove(args[0]);
|
|
205
|
+
return;
|
|
206
|
+
case "triggerPull":
|
|
207
|
+
syncManager.triggerPull(args[0]);
|
|
208
|
+
return;
|
|
209
|
+
default: throw new Error(`Unknown sync op: ${method}`);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
onDbOp: async (method, args) => {
|
|
213
|
+
if (!relational.pg) throw new Error("Relational store not available");
|
|
214
|
+
switch (method) {
|
|
215
|
+
case "query": {
|
|
216
|
+
const [sql, params] = args;
|
|
217
|
+
return (await relational.pg.query(sql, params)).rows;
|
|
218
|
+
}
|
|
219
|
+
default: throw new Error(`Unknown db op: ${method}`);
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
onLiveQuery: async (sql, params, onResults) => {
|
|
223
|
+
if (!relational.pg) throw new Error("Relational store not available");
|
|
224
|
+
const live = await relational.pg.live.query(sql, params, (results) => onResults(results));
|
|
225
|
+
return () => {
|
|
226
|
+
live.unsubscribe();
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
onInspectorOp: async (method, args) => {
|
|
230
|
+
switch (method) {
|
|
231
|
+
case "queue.getState": {
|
|
232
|
+
if (!inspectorQueue) return {
|
|
233
|
+
isPaused: false,
|
|
234
|
+
pendingJobs: [],
|
|
235
|
+
executingJobs: [],
|
|
236
|
+
totalPending: 0,
|
|
237
|
+
totalExecuting: 0
|
|
238
|
+
};
|
|
239
|
+
const pendingJobs = inspectorQueue.getPendingJobs();
|
|
240
|
+
const executingJobs = [];
|
|
241
|
+
for (const jobIds of inspectorQueue.getExecutingJobIds().values()) for (const jobId of jobIds) {
|
|
242
|
+
const job = inspectorQueue.getJob(jobId);
|
|
243
|
+
if (job) executingJobs.push(job);
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
isPaused: inspectorQueue.paused,
|
|
247
|
+
pendingJobs,
|
|
248
|
+
executingJobs,
|
|
249
|
+
totalPending: pendingJobs.length,
|
|
250
|
+
totalExecuting: executingJobs.length
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
case "queue.pause":
|
|
254
|
+
inspectorQueue?.pause();
|
|
255
|
+
return;
|
|
256
|
+
case "queue.resume":
|
|
257
|
+
await inspectorQueue?.resume();
|
|
258
|
+
return;
|
|
259
|
+
case "processors.getAll": return (inspectorProcessors?.getAll() ?? []).map((tracked) => ({
|
|
260
|
+
processorId: tracked.processorId,
|
|
261
|
+
factoryId: tracked.factoryId,
|
|
262
|
+
driveId: tracked.driveId,
|
|
263
|
+
processorIndex: tracked.processorIndex,
|
|
264
|
+
lastOrdinal: tracked.lastOrdinal,
|
|
265
|
+
status: tracked.status,
|
|
266
|
+
lastError: tracked.lastError,
|
|
267
|
+
lastErrorTimestamp: tracked.lastErrorTimestamp
|
|
268
|
+
}));
|
|
269
|
+
case "processors.retry": {
|
|
270
|
+
const [processorId] = args;
|
|
271
|
+
await inspectorProcessors?.get(processorId)?.retry();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
case "integrity.validate": {
|
|
275
|
+
if (!inspectorIntegrity) throw new Error("Integrity service not available");
|
|
276
|
+
const [documentId, branch] = args;
|
|
277
|
+
return inspectorIntegrity.validateDocument(documentId, branch);
|
|
278
|
+
}
|
|
279
|
+
case "integrity.rebuildKeyframes": {
|
|
280
|
+
if (!inspectorIntegrity) throw new Error("Integrity service not available");
|
|
281
|
+
const [documentId, branch] = args;
|
|
282
|
+
return inspectorIntegrity.rebuildKeyframes(documentId, branch);
|
|
283
|
+
}
|
|
284
|
+
case "integrity.rebuildSnapshots": {
|
|
285
|
+
if (!inspectorIntegrity) throw new Error("Integrity service not available");
|
|
286
|
+
const [documentId, branch] = args;
|
|
287
|
+
return inspectorIntegrity.rebuildSnapshots(documentId, branch);
|
|
288
|
+
}
|
|
289
|
+
case "db.query": {
|
|
290
|
+
if (!owned.reactorPg) throw new Error("Reactor store not available");
|
|
291
|
+
const [sql, params] = args;
|
|
292
|
+
return (await owned.reactorPg.query(sql, params)).rows;
|
|
293
|
+
}
|
|
294
|
+
default: throw new Error(`Unknown inspector op: ${method}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
const globalScope = self;
|
|
299
|
+
globalScope.addEventListener("error", (event) => {
|
|
300
|
+
console.error("[reactor.worker] uncaught error", event.message ?? event.error ?? event);
|
|
301
|
+
});
|
|
302
|
+
globalScope.addEventListener("unhandledrejection", (event) => {
|
|
303
|
+
console.error("[reactor.worker] unhandled rejection", event.reason);
|
|
304
|
+
});
|
|
305
|
+
globalScope.onconnect = (event) => {
|
|
306
|
+
const port = event.ports[0];
|
|
307
|
+
if (port) try {
|
|
308
|
+
host.connectPort(port);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
console.error("[reactor.worker] failed to connect port", error);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
//#endregion
|
|
314
|
+
|
|
315
|
+
//# sourceMappingURL=reactor.worker.js.map
|
|
316
|
+
//# debugId=8c1df25e-941e-518a-9c1d-ab758077d702
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor.worker.js","sources":["../src/reactor.worker.ts"],"sourcesContent":["import {\n ChannelScheme,\n DocumentIntegrityService,\n DriveCollectionId,\n InMemoryQueue,\n ReactorBuilder,\n ReactorClientBuilder,\n type ChannelConfig,\n type Database,\n type ISyncManager,\n type JwtHandler,\n type Remote,\n type RemoteFilter,\n type RemoteOptions,\n} from \"@powerhousedao/reactor\";\nimport { baseDocumentModels } from \"@powerhousedao/reactor-browser/base-document-models\";\nimport {\n FORWARDED_EVENT_TYPES,\n ReactorHost,\n SYNC_STATUS_CHANGED_EVENT,\n WorkerPackageLoader,\n type ReactorIdentity,\n type WorkerMigrationState,\n} from \"@powerhousedao/reactor-browser/rpc\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport {\n createRelationalDb,\n type IProcessorManager,\n type IRelationalDb,\n} from \"@powerhousedao/shared/processors\";\nimport * as commonDocumentModels from \"@powerhousedao/powerhouse-vetra-packages/document-models\";\nimport * as vetraDocumentModels from \"@powerhousedao/vetra/document-models\";\nimport {\n BrowserKeyStorage,\n createSignatureVerifier,\n RenownCryptoBuilder,\n RenownCryptoSigner,\n} from \"@renown/sdk/crypto\";\nimport type * as PgLiveModuleNs from \"@electric-sql/pglite/live\";\nimport { Kysely } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { readPgVersionFile } from \"./utils/pglite-idb.js\";\nimport {\n coerceMajor,\n CURRENT_PG_MAJOR,\n type DetectedMajor,\n loadPGliteModule,\n resolvePgMajorForRuntime,\n type SupportedPgMajor,\n} from \"./utils/pglite-major.js\";\nimport {\n type BackupStrategy,\n type FileDataEntry,\n clearFileData,\n migrateIdb,\n readFileData,\n writeFileData,\n} from \"./utils/pglite-migrate-core.js\";\n\nconsole.info(\"[reactor.worker] module evaluating\");\n\n// Matches the main thread's RenownBuilder(\"connect\").\nconst RENOWN_APP_NAME = \"connect\";\n\n// Studio models the tab bundles as local packages; not CDN-loadable, so the worker imports them directly.\nconst bundledModelCandidates: unknown[] = [\n ...Object.values(commonDocumentModels),\n ...Object.values(vetraDocumentModels),\n];\nconst bundledDocumentModels = bundledModelCandidates.filter(\n (m): m is DocumentModelModule =>\n typeof m === \"object\" &&\n m !== null &&\n \"documentModel\" in m &&\n \"reducer\" in m,\n);\n\ntype WorkerConstruct = {\n namespace: string;\n relationalNamespace: string;\n cdnUrl: string;\n packageSpecs: string[];\n};\n\ntype ModelRegistry = {\n registerModules: (...modules: DocumentModelModule[]) => void;\n};\n\nlet loader: WorkerPackageLoader | undefined;\nlet registry: ModelRegistry | undefined;\nlet signer: RenownCryptoSigner | undefined;\nlet syncManager: ISyncManager | undefined;\ntype RelationalState = {\n pg?: PgLiveModuleNs.PGliteWithLive;\n db?: IRelationalDb;\n};\nconst relational: RelationalState = {};\ntype OwnedStorage = {\n reactorPg?: {\n close: () => Promise<void>;\n query: (sql: string, params?: unknown[]) => Promise<{ rows: unknown[] }>;\n };\n reactorIdb?: string;\n relationalIdb?: string;\n};\nconst owned: OwnedStorage = {};\nlet inspectorQueue: InMemoryQueue | undefined;\nlet inspectorProcessors: IProcessorManager | undefined;\nlet inspectorIntegrity: DocumentIntegrityService | undefined;\nlet currentIdentity: ReactorIdentity | null = null;\nconst registeredKeys = new Set<string>();\n\nfunction modelKey(module: DocumentModelModule): string {\n return `${module.documentModel.global.id}@${module.version ?? 1}`;\n}\n\n// Cloneable projection of a Remote: meta (carries channelConfig) + connection snapshot.\nfunction toWireRemote(remote: Remote) {\n return {\n meta: remote.meta,\n connectionState: remote.channel.getConnectionState(),\n };\n}\n\n// Register only the delta; the registry rejects duplicate (type, version) pairs.\nfunction registerNewModules(): void {\n if (!loader || !registry) {\n return;\n }\n const fresh = loader.models.filter((m) => !registeredKeys.has(modelKey(m)));\n if (fresh.length === 0) {\n return;\n }\n registry.registerModules(...fresh);\n for (const m of fresh) {\n registeredKeys.add(modelKey(m));\n }\n}\n\n// Rebuild renown crypto from the shared renownKeyDB keypair (origin-scoped IndexedDB).\nasync function buildWorkerCrypto() {\n const keyStorage = await BrowserKeyStorage.create();\n return new RenownCryptoBuilder().withKeyPairStorage(keyStorage).build();\n}\n\n// Open against the major already on disk so a legacy PG16 dir isn't read by PG17.\nasync function openReactorPglite(namespace: string) {\n const detected = coerceMajor(await readPgVersionFile(`/pglite/${namespace}`));\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Running against legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const { PGlite } = await loadPGliteModule(major);\n const pg = new PGlite(`idb://${namespace}`, { relaxedDurability: true });\n return { pg, detected };\n}\n\ntype PgLiveModule = typeof PgLiveModuleNs;\n\nasync function loadPgLive(major: SupportedPgMajor): Promise<PgLiveModule> {\n if (major === 16) {\n return import(\"pglite-legacy-02/live\") as unknown as Promise<PgLiveModule>;\n }\n return import(\"@electric-sql/pglite/live\");\n}\n\nasync function openRelational(namespace: string): Promise<DetectedMajor> {\n try {\n const detected = coerceMajor(\n await readPgVersionFile(`/pglite/${namespace}`),\n );\n const major = resolvePgMajorForRuntime(detected);\n if (major !== 17) {\n console.warn(\n `[reactor.worker] Relational store opening legacy PGlite data dir (Postgres ${major}). Migrate to PG17 from the Connect banner or the Inspector.`,\n );\n }\n const [{ PGlite }, { live }] = await Promise.all([\n loadPGliteModule(major),\n loadPgLive(major),\n ]);\n const pg = new PGlite(`idb://${namespace}`, {\n relaxedDurability: true,\n extensions: { live },\n });\n relational.pg = pg as unknown as PgLiveModuleNs.PGliteWithLive;\n relational.db = createRelationalDb(\n new Kysely({ dialect: new PGliteDialect(pg) }),\n );\n console.info(\n `[reactor.worker] Relational store opened: idb://${namespace} (Postgres ${major}).`,\n );\n return detected;\n } catch (error) {\n console.error(\n \"[reactor.worker] Failed to open the relational store:\",\n error,\n );\n return null;\n }\n}\n\nlet migrationState: WorkerMigrationState = { status: \"idle\" };\n\nfunction setMigration(state: WorkerMigrationState): void {\n migrationState = state;\n host.setMigrationState(state);\n}\n\nconst inMemoryBackup: BackupStrategy = {\n snapshot: (idbName) => readFileData(idbName),\n rollback: (handle, idbName) =>\n writeFileData(idbName, handle as FileDataEntry[]),\n discard: () => Promise.resolve(),\n commit: () => Promise.resolve(),\n};\n\nconst workerName = (self as { name?: string }).name ?? \"\";\n\nconst host = new ReactorHost({\n namespace: workerName,\n onAdminRestart: () =>\n host.broadcastReload(\"admin restart\", crypto.randomUUID()),\n onAdminClearStorage: async () => {\n await relational.pg?.close();\n await owned.reactorPg?.close();\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await clearFileData(idbName);\n }\n }\n host.broadcastReload(\"storage cleared\", crypto.randomUUID());\n },\n onAdminMigrate: async () => {\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n });\n if (relational.pg) await relational.pg.close().catch(() => undefined);\n if (owned.reactorPg) await owned.reactorPg.close().catch(() => undefined);\n try {\n for (const idbName of [owned.reactorIdb, owned.relationalIdb]) {\n if (idbName) {\n await migrateIdb(\n idbName,\n (phase) =>\n setMigration({\n status: \"migrating\",\n legacyMajor: migrationState.legacyMajor,\n phase,\n }),\n inMemoryBackup,\n );\n }\n }\n host.broadcastReload(\"migration complete\", crypto.randomUUID());\n } catch (error) {\n console.error(\"[reactor.worker] Migration failed:\", error);\n setMigration({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n });\n host.broadcastReload(\"migration failed\", crypto.randomUUID());\n }\n },\n build: async (raw) => {\n let phase = \"init\";\n try {\n const construct = raw as WorkerConstruct;\n phase = \"loading packages\";\n console.info(`[reactor.worker] boot: ${phase}`);\n loader = new WorkerPackageLoader({\n cdnUrl: construct.cdnUrl,\n importPackage: (url) =>\n import(/* @vite-ignore */ url) as Promise<Record<string, unknown>>,\n });\n const loaded = await loader.loadPackages(construct.packageSpecs);\n const models = baseDocumentModels.concat(bundledDocumentModels, loaded);\n phase = \"opening pglite stores\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const [reactor, relationalMajor] = await Promise.all([\n openReactorPglite(construct.namespace),\n openRelational(construct.relationalNamespace),\n ]);\n const pg = reactor.pg;\n owned.reactorPg = pg;\n owned.reactorIdb = `/pglite/${construct.namespace}`;\n owned.relationalIdb = `/pglite/${construct.relationalNamespace}`;\n // A store is migratable when coerceMajor kept it (a supported legacy\n // major) and it is not the current one; openers already read PG_VERSION.\n const legacyMajor = [reactor.detected, relationalMajor].find(\n (m): m is SupportedPgMajor => m !== null && m !== CURRENT_PG_MAJOR,\n );\n if (legacyMajor !== undefined) {\n setMigration({ status: \"needed\", legacyMajor });\n }\n phase = \"building crypto\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const crypto = await buildWorkerCrypto();\n signer = new RenownCryptoSigner(\n crypto,\n RENOWN_APP_NAME,\n currentIdentity ?? undefined,\n );\n const jwtHandler: JwtHandler = async () =>\n currentIdentity\n ? crypto.getBearerToken(currentIdentity.address, { expiresIn: 10 })\n : undefined;\n phase = \"building reactor module\";\n console.info(`[reactor.worker] boot: ${phase}`);\n const builder = new ReactorClientBuilder()\n .withSigner({ signer, verifier: createSignatureVerifier() })\n .withReactorBuilder(\n new ReactorBuilder()\n .withDocumentModels(models)\n .withChannelScheme(ChannelScheme.CONNECT)\n .withJwtHandler(jwtHandler)\n .withKysely(\n new Kysely<Database>({ dialect: new PGliteDialect(pg) }),\n ),\n );\n builder.withDocumentModelLoader(loader);\n const module = await builder.buildModule();\n registry = module.reactorModule?.documentModelRegistry;\n syncManager = module.reactorModule?.syncModule?.syncManager;\n const rm = module.reactorModule;\n if (rm) {\n inspectorQueue =\n rm.queue instanceof InMemoryQueue ? rm.queue : undefined;\n inspectorProcessors = rm.processorManager;\n inspectorIntegrity = new DocumentIntegrityService(\n rm.keyframeStore,\n rm.operationStore,\n rm.writeCache,\n rm.documentView,\n rm.documentModelRegistry,\n );\n }\n for (const m of models) {\n registeredKeys.add(modelKey(m));\n }\n for (const type of FORWARDED_EVENT_TYPES) {\n module.eventBus.subscribe(type, (forwardedType, event) =>\n host.broadcastBusEvent(forwardedType, event),\n );\n }\n syncManager?.onSyncStatusChange((documentId, status) =>\n host.broadcastBusEvent(SYNC_STATUS_CHANGED_EVENT, {\n documentId,\n status,\n }),\n );\n console.info(\"[reactor.worker] boot: complete\");\n return module.client;\n } catch (error) {\n console.error(`[reactor.worker] boot failed at phase \"${phase}\":`, error);\n throw error;\n }\n },\n registerPackages: async (specs) => {\n if (!loader) {\n return;\n }\n await loader.loadPackages(specs);\n registerNewModules();\n },\n onIdentity: (user) => {\n currentIdentity = user;\n if (signer) {\n signer.user = user ?? undefined;\n }\n },\n onSyncOp: async (method, args) => {\n if (!syncManager) {\n throw new Error(\"SyncManager not available\");\n }\n switch (method) {\n case \"list\":\n return syncManager.list().map(toWireRemote);\n case \"add\": {\n const [name, collectionIdKey, channelConfig, filter, options] =\n args as [\n string,\n string,\n ChannelConfig,\n RemoteFilter | undefined,\n RemoteOptions | undefined,\n ];\n const remote = await syncManager.add(\n name,\n DriveCollectionId.fromKey(collectionIdKey),\n channelConfig,\n filter,\n options,\n );\n return toWireRemote(remote);\n }\n case \"remove\":\n await syncManager.remove(args[0] as string);\n return undefined;\n case \"triggerPull\":\n syncManager.triggerPull(args[0] as string);\n return undefined;\n default:\n throw new Error(`Unknown sync op: ${method}`);\n }\n },\n onDbOp: async (method, args) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n switch (method) {\n case \"query\": {\n const [sql, params] = args as [string, unknown[]];\n const result = await relational.pg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown db op: ${method}`);\n }\n },\n onLiveQuery: async (sql, params, onResults) => {\n if (!relational.pg) {\n throw new Error(\"Relational store not available\");\n }\n const live = await relational.pg.live.query(sql, params, (results) =>\n onResults(results),\n );\n return () => {\n void live.unsubscribe();\n };\n },\n onInspectorOp: async (method, args) => {\n switch (method) {\n case \"queue.getState\": {\n if (!inspectorQueue) {\n return {\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n };\n }\n const pendingJobs = inspectorQueue.getPendingJobs();\n const executingJobs = [];\n for (const jobIds of inspectorQueue.getExecutingJobIds().values()) {\n for (const jobId of jobIds) {\n const job = inspectorQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n return {\n isPaused: inspectorQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n };\n }\n case \"queue.pause\":\n inspectorQueue?.pause();\n return undefined;\n case \"queue.resume\":\n await inspectorQueue?.resume();\n return undefined;\n case \"processors.getAll\":\n return (inspectorProcessors?.getAll() ?? []).map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n }));\n case \"processors.retry\": {\n const [processorId] = args as [string];\n await inspectorProcessors?.get(processorId)?.retry();\n return undefined;\n }\n case \"integrity.validate\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.validateDocument(documentId, branch);\n }\n case \"integrity.rebuildKeyframes\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildKeyframes(documentId, branch);\n }\n case \"integrity.rebuildSnapshots\": {\n if (!inspectorIntegrity) {\n throw new Error(\"Integrity service not available\");\n }\n const [documentId, branch] = args as [string, string?];\n return inspectorIntegrity.rebuildSnapshots(documentId, branch);\n }\n case \"db.query\": {\n if (!owned.reactorPg) {\n throw new Error(\"Reactor store not available\");\n }\n const [sql, params] = args as [string, unknown[]];\n const result = await owned.reactorPg.query(sql, params);\n return result.rows;\n }\n default:\n throw new Error(`Unknown inspector op: ${method}`);\n }\n },\n});\n\ntype WorkerGlobalErrorEvent = {\n message?: string;\n error?: unknown;\n reason?: unknown;\n};\n\nconst globalScope = self as unknown as {\n addEventListener: (\n type: \"error\" | \"unhandledrejection\",\n listener: (event: WorkerGlobalErrorEvent) => void,\n ) => void;\n onconnect: ((event: MessageEvent) => void) | null;\n};\n\nglobalScope.addEventListener(\"error\", (event) => {\n console.error(\n \"[reactor.worker] uncaught error\",\n event.message ?? event.error ?? event,\n );\n});\nglobalScope.addEventListener(\"unhandledrejection\", (event) => {\n console.error(\"[reactor.worker] unhandled rejection\", event.reason);\n});\n\nglobalScope.onconnect = (event) => {\n const port = event.ports[0];\n if (port) {\n try {\n host.connectPort(port);\n } catch (error) {\n console.error(\"[reactor.worker] failed to connect port\", error);\n }\n }\n};\n"],"names":[],"mappings":"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","debug_id":"8c1df25e-941e-518a-9c1d-ab758077d702"}
|
|
@@ -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 { r as connectConfig } from "./connect.config-
|
|
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]="b8602ba1-4b6a-54f4-b893-aa37f682e4b3")}catch(e){}}();
|
|
3
|
+
import { r as connectConfig } from "./connect.config-BG681xG9.js";
|
|
4
4
|
//#region src/utils/registerServiceWorker.ts
|
|
5
5
|
const serviceWorkerScriptPath = [connectConfig.routerBasename, "service-worker.js"].join("/").replace(/\/{2,}/gm, "/");
|
|
6
6
|
var ServiceWorkerManager = class {
|
|
@@ -77,5 +77,5 @@ const serviceWorkerManager = new ServiceWorkerManager();
|
|
|
77
77
|
//#endregion
|
|
78
78
|
export { serviceWorkerManager as t };
|
|
79
79
|
|
|
80
|
-
//# sourceMappingURL=registerServiceWorker-
|
|
81
|
-
//# debugId=
|
|
80
|
+
//# sourceMappingURL=registerServiceWorker-2tRbkdJj.js.map
|
|
81
|
+
//# debugId=b8602ba1-4b6a-54f4-b893-aa37f682e4b3
|
package/dist/{registerServiceWorker-D9l1kja7.js.map → registerServiceWorker-2tRbkdJj.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerServiceWorker-
|
|
1
|
+
{"version":3,"file":"registerServiceWorker-2tRbkdJj.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\n\nconst basePath = connectConfig.routerBasename;\n\nconst serviceWorkerScriptPath = [basePath, \"service-worker.js\"]\n .join(\"/\")\n .replace(/\\/{2,}/gm, \"/\");\n\nclass ServiceWorkerManager {\n ready = false;\n debug = false;\n registration: ServiceWorkerRegistration | null = null;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n #handleServiceWorkerMessage(\n event: MessageEvent<{\n type: \"NEW_VERSION_AVAILABLE\";\n version: string;\n requiresHardRefresh: boolean;\n }>,\n ) {\n if (this.debug) {\n console.log(\"ServiceWorker message: \", event);\n }\n const message = \"type\" in event.data ? event : null;\n switch (message?.data.type) {\n case \"NEW_VERSION_AVAILABLE\": {\n if (message.data.version === connectConfig.appVersion) {\n return;\n }\n if (message.data.requiresHardRefresh) {\n if (this.debug) {\n console.log(\"New version available\");\n }\n\n window.location.reload(); // Reload the page to load the new version\n }\n break;\n }\n default: {\n console.warn(\"Unhandled message:\", message);\n break;\n }\n }\n }\n\n #handleServiceWorker(registration: ServiceWorkerRegistration) {\n {\n // Listen for messages from the service worker\n if (this.debug) {\n console.log(\"ServiceWorker registered: \", registration);\n }\n\n navigator.serviceWorker.addEventListener(\n \"message\",\n this.#handleServiceWorkerMessage.bind(this),\n );\n\n this.registration = registration;\n this.ready = true;\n }\n }\n\n async #register() {\n try {\n // checks if there is a service worker installed already and calls\n // its the update method to check if there is a new version available\n const existingRegistration =\n await navigator.serviceWorker.getRegistration();\n if (existingRegistration) {\n await existingRegistration.update();\n this.#handleServiceWorker(existingRegistration);\n }\n\n // if no service worker is installed then registers the service worker\n else {\n const registration = await navigator.serviceWorker.register(\n serviceWorkerScriptPath,\n );\n this.#handleServiceWorker(registration);\n\n registration.addEventListener(\"updatefound\", () => {\n this.#handleServiceWorker(registration);\n });\n }\n\n // calls the update on an interval to force\n // the browser to check for a new version\n const intervalId = setInterval(() => {\n void (async () => {\n const existingRegistration =\n await navigator.serviceWorker.getRegistration();\n if (existingRegistration) {\n await existingRegistration.update();\n } else {\n clearInterval(intervalId);\n this.registerServiceWorker();\n }\n })();\n }, connectConfig.appVersionCheckInterval);\n } catch (error) {\n console.error(\"ServiceWorker registration failed: \", error);\n }\n }\n\n registerServiceWorker(debug = false) {\n this.debug = debug;\n\n if (!(\"serviceWorker\" in navigator)) {\n console.warn(\"Service Worker not available\");\n return;\n }\n window.addEventListener(\"load\", () => {\n this.#register().catch(console.error);\n });\n }\n}\n\nexport const serviceWorkerManager = new ServiceWorkerManager();\n"],"names":["#handleServiceWorkerMessage","#register","#handleServiceWorker"],"mappings":";;;;AAIA,MAAM,0BAA0B,CAFf,cAAc,gBAEY,oBAAoB,CAC5D,KAAK,IAAI,CACT,QAAQ,YAAY,IAAI;AAE3B,IAAM,uBAAN,MAA2B;CACzB,QAAQ;CACR,QAAQ;CACR,eAAiD;CAEjD,YAAY,QAAQ,OAAO;AACzB,OAAK,QAAQ;;CAGf,SAAS,OAAgB;AACvB,OAAK,QAAQ;;CAGf,4BACE,OAKA;AACA,MAAI,KAAK,MACP,SAAQ,IAAI,2BAA2B,MAAM;EAE/C,MAAM,UAAU,UAAU,MAAM,OAAO,QAAQ;AAC/C,UAAQ,SAAS,KAAK,MAAtB;GACE,KAAK;AACH,QAAI,QAAQ,KAAK,YAAY,cAAc,WACzC;AAEF,QAAI,QAAQ,KAAK,qBAAqB;AACpC,SAAI,KAAK,MACP,SAAQ,IAAI,wBAAwB;AAGtC,YAAO,SAAS,QAAQ;;AAE1B;GAEF;AACE,YAAQ,KAAK,sBAAsB,QAAQ;AAC3C;;;CAKN,qBAAqB,cAAyC;AAG1D,MAAI,KAAK,MACP,SAAQ,IAAI,8BAA8B,aAAa;AAGzD,YAAU,cAAc,iBACtB,WACA,MAAA,2BAAiC,KAAK,KAAK,CAC5C;AAED,OAAK,eAAe;AACpB,OAAK,QAAQ;;CAIjB,OAAA,WAAkB;AAChB,MAAI;GAGF,MAAM,uBACJ,MAAM,UAAU,cAAc,iBAAiB;AACjD,OAAI,sBAAsB;AACxB,UAAM,qBAAqB,QAAQ;AACnC,UAAA,oBAA0B,qBAAqB;UAI5C;IACH,MAAM,eAAe,MAAM,UAAU,cAAc,SACjD,wBACD;AACD,UAAA,oBAA0B,aAAa;AAEvC,iBAAa,iBAAiB,qBAAqB;AACjD,WAAA,oBAA0B,aAAa;MACvC;;GAKJ,MAAM,aAAa,kBAAkB;AACnC,KAAM,YAAY;KAChB,MAAM,uBACJ,MAAM,UAAU,cAAc,iBAAiB;AACjD,SAAI,qBACF,OAAM,qBAAqB,QAAQ;UAC9B;AACL,oBAAc,WAAW;AACzB,WAAK,uBAAuB;;QAE5B;MACH,cAAc,wBAAwB;WAClC,OAAO;AACd,WAAQ,MAAM,uCAAuC,MAAM;;;CAI/D,sBAAsB,QAAQ,OAAO;AACnC,OAAK,QAAQ;AAEb,MAAI,EAAE,mBAAmB,YAAY;AACnC,WAAQ,KAAK,+BAA+B;AAC5C;;AAEF,SAAO,iBAAiB,cAAc;AACpC,SAAA,UAAgB,CAAC,MAAM,QAAQ,MAAM;IACrC;;;AAIN,MAAa,uBAAuB,IAAI,sBAAsB","debug_id":"b8602ba1-4b6a-54f4-b893-aa37f682e4b3"}
|
|
@@ -1,5 +1,5 @@
|
|
|
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]="fc4a7fdd-e366-589a-9881-ac3437c86c95")}catch(e){}}();
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import i18n from "i18next";
|
|
5
5
|
import { initReactI18next, useTranslation } from "react-i18next";
|
|
@@ -138,5 +138,5 @@ const ReloadConnectToast = () => {
|
|
|
138
138
|
//#endregion
|
|
139
139
|
export { i18n as n, ReloadConnectToast as t };
|
|
140
140
|
|
|
141
|
-
//# sourceMappingURL=reload-connect-toast-
|
|
142
|
-
//# debugId=
|
|
141
|
+
//# sourceMappingURL=reload-connect-toast-qibmlgQm.js.map
|
|
142
|
+
//# debugId=fc4a7fdd-e366-589a-9881-ac3437c86c95
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reload-connect-toast-
|
|
1
|
+
{"version":3,"file":"reload-connect-toast-qibmlgQm.js","sources":["../src/i18n/locales/en.json","../src/i18n/index.ts","../src/components/reload-connect-toast.tsx"],"sourcesContent":["","import type { Resource } from \"i18next\";\nimport i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport translationEN from \"./locales/en.json\" with { type: \"json\" };\n\nconst resources: Resource = {\n en: {\n code: \"en\",\n name: \"English\",\n translation: translationEN,\n },\n};\n\ni18n\n .use(initReactI18next)\n .init({\n resources,\n fallbackLng: \"en\",\n debug: false,\n interpolation: {\n escapeValue: false,\n },\n })\n .catch((e: unknown) => {\n console.error(e);\n });\n\nexport { i18n };\nexport default i18n;\n","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"],"names":["translationEN"],"mappings":";;;;;ACcA,KACG,IAAI,iBAAiB,CACrB,KAAK;CACJ,WAXwB,EAC1B,IAAI;EACF,MAAM;EACN,MAAM;EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACD,EACF;CAMG,aAAa;CACb,OAAO;CACP,eAAe,EACb,aAAa,OACd;CACF,CAAC,CACD,OAAO,MAAe;AACrB,SAAQ,MAAM,EAAE;EAChB;;;ACxBJ,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA","debug_id":"fc4a7fdd-e366-589a-9881-ac3437c86c95"}
|
package/dist/start-connect.js
CHANGED
|
@@ -5,7 +5,7 @@ import { createRoot } from "react-dom/client";
|
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
//#region start-connect.tsx
|
|
7
7
|
await loadRuntimeConfig();
|
|
8
|
-
const { AppLoader } = await import("./components-
|
|
8
|
+
const { AppLoader } = await import("./components-DGNTgcZV.js");
|
|
9
9
|
function updateLocalPackage(pkg) {
|
|
10
10
|
window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
|
|
11
11
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
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]="9ee5aa7b-b29e-5c77-bcea-8b57b1fbb493")}catch(e){}}();
|
|
3
3
|
import { createElement } from "react";
|
|
4
4
|
import { ToastContainer, toast } from "@powerhousedao/design-system/connect/toast";
|
|
5
5
|
//#region src/services/toast.ts
|
|
@@ -19,5 +19,5 @@ function toast$1(content, options) {
|
|
|
19
19
|
//#endregion
|
|
20
20
|
export { toast$1 as n, ToastContainer$1 as t };
|
|
21
21
|
|
|
22
|
-
//# sourceMappingURL=toast-
|
|
23
|
-
//# debugId=
|
|
22
|
+
//# sourceMappingURL=toast-4t-VimvD.js.map
|
|
23
|
+
//# debugId=9ee5aa7b-b29e-5c77-bcea-8b57b1fbb493
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast-
|
|
1
|
+
{"version":3,"file":"toast-4t-VimvD.js","sources":["../src/services/toast.ts"],"sourcesContent":["import type { ConnectToastOptions } from \"@powerhousedao/design-system/connect/toast\";\nimport {\n ToastContainer as BaseToastContainer,\n toast as baseToast,\n} from \"@powerhousedao/design-system/connect/toast\";\nimport { createElement, type ComponentProps } from \"react\";\n\nexport const CONNECT_TOAST_CONTAINER_ID = \"connect\";\n\ntype BaseToastContainerProps = ComponentProps<typeof BaseToastContainer>;\n\nexport const ToastContainer = (\n props: Omit<BaseToastContainerProps, \"containerId\"> = {},\n) =>\n createElement(BaseToastContainer, {\n containerId: CONNECT_TOAST_CONTAINER_ID,\n ...props,\n });\n\ntype ToastArgs = Parameters<typeof baseToast>;\nexport function toast(content: ToastArgs[0], options?: ConnectToastOptions) {\n const {\n type = \"default\",\n containerId = CONNECT_TOAST_CONTAINER_ID,\n ...restOptions\n } = options || {};\n return baseToast(content, { type, containerId, ...restOptions });\n}\n"],"names":["ToastContainer","BaseToastContainer","toast","baseToast"],"mappings":";;;;;AAOA,MAAa,6BAA6B;AAI1C,MAAaA,oBACX,QAAsD,EAAE,KAExD,cAAcC,gBAAoB;CAChC,aAAa;CACb,GAAG;CACJ,CAAC;AAGJ,SAAgBC,QAAM,SAAuB,SAA+B;CAC1E,MAAM,EACJ,OAAO,WACP,cAAc,4BACd,GAAG,gBACD,WAAW,EAAE;AACjB,QAAOC,MAAU,SAAS;EAAE;EAAM;EAAa,GAAG;EAAa,CAAC","debug_id":"9ee5aa7b-b29e-5c77-bcea-8b57b1fbb493"}
|
|
@@ -1,5 +1,5 @@
|
|
|
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]="199fdba5-336e-57f9-9bbb-f3d5fbd3554a")}catch(e){}}();
|
|
3
3
|
import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
|
|
4
4
|
import { useEffect, useMemo, useState } from "react";
|
|
5
5
|
import { getPackages, trimTrailingSlash, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
@@ -175,5 +175,5 @@ function getPackageStatusFromPackageSource(packageSource) {
|
|
|
175
175
|
//#endregion
|
|
176
176
|
export { useRegistryPackages as t };
|
|
177
177
|
|
|
178
|
-
//# sourceMappingURL=useRegistryPackages-
|
|
179
|
-
//# debugId=
|
|
178
|
+
//# sourceMappingURL=useRegistryPackages-BaYtekjQ.js.map
|
|
179
|
+
//# debugId=199fdba5-336e-57f9-9bbb-f3d5fbd3554a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRegistryPackages-B-gFECmd.js","sources":["../src/hooks/useRegistryPackages.ts"],"sourcesContent":["import {\n getPackages,\n trimTrailingSlash,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n PackageInfo,\n RegistryPackage,\n RegistryPackageList,\n RegistryPackageMap,\n RegistryPackageSource,\n RegistryPackageStatus,\n} from \"@powerhousedao/shared/registry\";\nimport { slimManifest } from \"@powerhousedao/shared/registry/manifest-slim\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\n\nexport function useRegistryPackages() {\n const packageManager = useVetraPackageManager();\n const packageManagerPackages = packageManager?.packages;\n const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;\n // Normalize so `http://host` and `http://host/` don't produce two separate\n // localStorage maps where the install/status flow reads from one while the\n // registry fetch writes to the other.\n const registryPackagesKey = `REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`;\n const [registryPackagesMap, setRegistryPackagesMap] =\n useBestEffortLocalStorage<RegistryPackageMap>(registryPackagesKey, {});\n const registryPackageList: RegistryPackageList = useMemo(() => {\n return Array.from(Object.values(registryPackagesMap)).filter(\n (p) => p !== undefined,\n );\n }, [registryPackagesMap]);\n\n useEffect(() => {\n async function refreshPackages() {\n if (registryUrl === null || !packageManager) return;\n\n const packageInfos = await getPackages(registryUrl);\n\n setRegistryPackagesMap((oldPackages) => {\n const newRegistryPackages: RegistryPackageMap = {\n ...oldPackages,\n };\n\n for (const packageInfo of packageInfos) {\n const existingPackage = newRegistryPackages[packageInfo.name];\n\n if (!existingPackage) {\n const packageSource = packageManager.getPackageSource(\n packageInfo.name,\n );\n const status = getPackageStatusFromPackageSource(packageSource);\n newRegistryPackages[packageInfo.name] =\n makeRegistryPackageFromPackageInfo(packageInfo, status);\n } else {\n // Keep the cached entry's status, but refresh anything the\n // registry sent. This includes distTags and the versions list\n // the Package Manager UI filters on.\n //\n // For `version`, prefer the actually-installed version from the\n // package manager (set by the rehydration effect). `packageInfo.version`\n // is the registry's newest-published version, which for installed\n // packages would incorrectly overwrite the user's picked version\n // on the next /packages refresh.\n const installedVersion = packageManager.getPackageVersion(\n packageInfo.name,\n );\n newRegistryPackages[packageInfo.name] = {\n ...existingPackage,\n manifest:\n slimManifest(packageInfo.manifest) ?? existingPackage.manifest,\n version:\n installedVersion ??\n packageInfo.version ??\n existingPackage.version,\n distTags: packageInfo.distTags ?? existingPackage.distTags,\n versions: packageInfo.versions ?? existingPackage.versions,\n documentTypes: packageInfo.documentTypes.length\n ? packageInfo.documentTypes\n : existingPackage.documentTypes,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageInfo.name),\n ),\n };\n }\n }\n\n return newRegistryPackages;\n });\n }\n\n refreshPackages().catch(console.error);\n }, []);\n\n useEffect(() => {\n if (!packageManager) return;\n\n if (packageManagerPackages?.length) {\n for (const packageManagerPackage of packageManagerPackages) {\n setRegistryPackagesMap((existingRegistryPackages) => {\n const packageName = packageManagerPackage.manifest.name;\n const existingPackage = existingRegistryPackages[packageName];\n const newRegistryPackages = { ...existingRegistryPackages };\n const version = packageManager.getPackageVersion(packageName);\n if (existingPackage) {\n newRegistryPackages[packageName] = {\n ...existingPackage,\n version: version ?? existingPackage.version,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageName),\n ),\n };\n } else {\n const packageSource = packageManager.getPackageSource(packageName);\n const status = getPackageStatusFromPackageSource(packageSource);\n const newRegistryPackage = makeRegistryPackageFromDocumentModelLib(\n packageManagerPackage,\n status,\n version,\n );\n newRegistryPackages[packageName] = newRegistryPackage;\n }\n return newRegistryPackages;\n });\n }\n }\n }, [packageManagerPackages]);\n\n function updateRegistryPackageStatus(\n packageName: string,\n newStatus: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n const newRegistryPackage = newRegistryPackages[packageName];\n if (!newRegistryPackage) {\n console.error(\n \"Attempting to update status for package that does not exist.\",\n );\n return newRegistryPackages;\n }\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n status: newStatus,\n };\n\n return newRegistryPackages;\n });\n }\n\n /**\n * Register a freshly-installed package that came in via the npm-uplink\n * fallback — the user typed a bare name, our local `/packages` didn't know\n * it, but the install succeeded because verdaccio proxy-fetched the tarball.\n *\n * This is the one legitimate case where the status update runs against a\n * name that wasn't in the registry map. We treat it as an insert rather\n * than logging the \"does not exist\" error. Data is pulled from the loaded\n * module so the UI card shows the real manifest immediately; the next\n * `/packages` refresh will add `versions`/`distTags`.\n */\n function registerFallbackRegistryPackage(\n packageName: string,\n loadedPackage: DocumentModelLib,\n version: string | undefined,\n status: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n newRegistryPackages[packageName] = {\n ...makeRegistryPackageFromDocumentModelLib(\n loadedPackage,\n status,\n version,\n ),\n name: packageName,\n };\n return newRegistryPackages;\n });\n }\n\n return {\n registryPackagesMap,\n registryPackageList,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n };\n}\n\nfunction makeRegistryPackageFromDocumentModelLib(\n documentModelLib: DocumentModelLib,\n status: RegistryPackageStatus,\n version?: string,\n): RegistryPackage {\n return {\n name: documentModelLib.manifest.name,\n path: \"stub-path\",\n documentTypes: documentModelLib.documentModels.map(\n (d) => d.documentModel.global.id,\n ),\n status,\n manifest: slimManifest(documentModelLib.manifest),\n version,\n };\n}\n\nfunction makeRegistryPackageFromPackageInfo(\n packageInfo: PackageInfo,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n ...packageInfo,\n // Slim before caching: registry manifests are unvalidated JSON and have\n // carried multi-megabyte junk fields that blew the localStorage quota\n // (and the UI only reads the summary fields anyway).\n manifest: slimManifest(packageInfo.manifest),\n documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],\n status,\n };\n}\n\n/**\n * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed\n * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the\n * in-memory state so the package manager still works for the session.\n * useLocalStorage couples the state update to the write — when the write\n * threw, the freshly fetched package list was discarded and the registry UI\n * rendered (and searched) an empty list.\n *\n * The key is derived from the boot-time runtime config and never changes\n * within a session, so no key-change rehydration is needed.\n */\nfunction useBestEffortLocalStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(\n () => readJsonFromStorage<T>(key) ?? initialValue,\n );\n\n useEffect(() => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n // Free the key and retry once — a stale oversized entry from an older\n // session may be occupying the quota this write needs.\n try {\n window.localStorage.removeItem(key);\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n console.warn(\n `Failed to persist \"${key}\" to localStorage; continuing with in-memory data.`,\n error,\n );\n }\n }\n }, [key, value]);\n\n return [value, setValue] as const;\n}\n\nfunction readJsonFromStorage<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n}\n\n/**\n * When refreshing a cached entry, promote `\"available\"` to whatever the\n * packageManager now reports — the cached `\"available\"` was almost certainly\n * recorded before `packageManager.addPackages()` finished on a prior session.\n * Never downgrade an already-installed entry, and never overwrite a deliberate\n * `\"dismissed\"` choice.\n */\nfunction promoteStatus(\n cachedStatus: RegistryPackageStatus,\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n if (cachedStatus !== \"available\") return cachedStatus;\n if (packageSource === null) return cachedStatus;\n return getPackageStatusFromPackageSource(packageSource);\n}\n\nfunction getPackageStatusFromPackageSource(\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n // if we check the package source for a package that came from the api and it doesn't exist yet,\n // then we know the package is available on the api but not installed\n if (packageSource === null) return \"available\";\n // show common package, local project package and locally installed packages as \"local-install\"\n if (\n packageSource === \"local-install\" ||\n packageSource === \"common\" ||\n packageSource === \"project\"\n )\n return \"local-install\";\n // show \"registry-install\" status for package source \"registry-install\"\n if (packageSource === \"registry-install\") return \"registry-install\";\n // fallback to available — we should probably do more checks here\n return \"available\";\n}\n"],"names":[],"mappings":"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","debug_id":"ed326e42-f833-53ca-9b66-6d0b7e627b32"}
|
|
1
|
+
{"version":3,"file":"useRegistryPackages-BaYtekjQ.js","sources":["../src/hooks/useRegistryPackages.ts"],"sourcesContent":["import {\n getPackages,\n trimTrailingSlash,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n PackageInfo,\n RegistryPackage,\n RegistryPackageList,\n RegistryPackageMap,\n RegistryPackageSource,\n RegistryPackageStatus,\n} from \"@powerhousedao/shared/registry\";\nimport { slimManifest } from \"@powerhousedao/shared/registry/manifest-slim\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\n\nexport function useRegistryPackages() {\n const packageManager = useVetraPackageManager();\n const packageManagerPackages = packageManager?.packages;\n const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;\n // Normalize so `http://host` and `http://host/` don't produce two separate\n // localStorage maps where the install/status flow reads from one while the\n // registry fetch writes to the other.\n const registryPackagesKey = `REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`;\n const [registryPackagesMap, setRegistryPackagesMap] =\n useBestEffortLocalStorage<RegistryPackageMap>(registryPackagesKey, {});\n const registryPackageList: RegistryPackageList = useMemo(() => {\n return Array.from(Object.values(registryPackagesMap)).filter(\n (p) => p !== undefined,\n );\n }, [registryPackagesMap]);\n\n useEffect(() => {\n async function refreshPackages() {\n if (registryUrl === null || !packageManager) return;\n\n const packageInfos = await getPackages(registryUrl);\n\n setRegistryPackagesMap((oldPackages) => {\n const newRegistryPackages: RegistryPackageMap = {\n ...oldPackages,\n };\n\n for (const packageInfo of packageInfos) {\n const existingPackage = newRegistryPackages[packageInfo.name];\n\n if (!existingPackage) {\n const packageSource = packageManager.getPackageSource(\n packageInfo.name,\n );\n const status = getPackageStatusFromPackageSource(packageSource);\n newRegistryPackages[packageInfo.name] =\n makeRegistryPackageFromPackageInfo(packageInfo, status);\n } else {\n // Keep the cached entry's status, but refresh anything the\n // registry sent. This includes distTags and the versions list\n // the Package Manager UI filters on.\n //\n // For `version`, prefer the actually-installed version from the\n // package manager (set by the rehydration effect). `packageInfo.version`\n // is the registry's newest-published version, which for installed\n // packages would incorrectly overwrite the user's picked version\n // on the next /packages refresh.\n const installedVersion = packageManager.getPackageVersion(\n packageInfo.name,\n );\n newRegistryPackages[packageInfo.name] = {\n ...existingPackage,\n manifest:\n slimManifest(packageInfo.manifest) ?? existingPackage.manifest,\n version:\n installedVersion ??\n packageInfo.version ??\n existingPackage.version,\n distTags: packageInfo.distTags ?? existingPackage.distTags,\n versions: packageInfo.versions ?? existingPackage.versions,\n documentTypes: packageInfo.documentTypes.length\n ? packageInfo.documentTypes\n : existingPackage.documentTypes,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageInfo.name),\n ),\n };\n }\n }\n\n return newRegistryPackages;\n });\n }\n\n refreshPackages().catch(console.error);\n }, []);\n\n useEffect(() => {\n if (!packageManager) return;\n\n if (packageManagerPackages?.length) {\n for (const packageManagerPackage of packageManagerPackages) {\n setRegistryPackagesMap((existingRegistryPackages) => {\n const packageName = packageManagerPackage.manifest.name;\n const existingPackage = existingRegistryPackages[packageName];\n const newRegistryPackages = { ...existingRegistryPackages };\n const version = packageManager.getPackageVersion(packageName);\n if (existingPackage) {\n newRegistryPackages[packageName] = {\n ...existingPackage,\n version: version ?? existingPackage.version,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageName),\n ),\n };\n } else {\n const packageSource = packageManager.getPackageSource(packageName);\n const status = getPackageStatusFromPackageSource(packageSource);\n const newRegistryPackage = makeRegistryPackageFromDocumentModelLib(\n packageManagerPackage,\n status,\n version,\n );\n newRegistryPackages[packageName] = newRegistryPackage;\n }\n return newRegistryPackages;\n });\n }\n }\n }, [packageManagerPackages]);\n\n function updateRegistryPackageStatus(\n packageName: string,\n newStatus: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n const newRegistryPackage = newRegistryPackages[packageName];\n if (!newRegistryPackage) {\n console.error(\n \"Attempting to update status for package that does not exist.\",\n );\n return newRegistryPackages;\n }\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n status: newStatus,\n };\n\n return newRegistryPackages;\n });\n }\n\n /**\n * Register a freshly-installed package that came in via the npm-uplink\n * fallback — the user typed a bare name, our local `/packages` didn't know\n * it, but the install succeeded because verdaccio proxy-fetched the tarball.\n *\n * This is the one legitimate case where the status update runs against a\n * name that wasn't in the registry map. We treat it as an insert rather\n * than logging the \"does not exist\" error. Data is pulled from the loaded\n * module so the UI card shows the real manifest immediately; the next\n * `/packages` refresh will add `versions`/`distTags`.\n */\n function registerFallbackRegistryPackage(\n packageName: string,\n loadedPackage: DocumentModelLib,\n version: string | undefined,\n status: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n newRegistryPackages[packageName] = {\n ...makeRegistryPackageFromDocumentModelLib(\n loadedPackage,\n status,\n version,\n ),\n name: packageName,\n };\n return newRegistryPackages;\n });\n }\n\n return {\n registryPackagesMap,\n registryPackageList,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n };\n}\n\nfunction makeRegistryPackageFromDocumentModelLib(\n documentModelLib: DocumentModelLib,\n status: RegistryPackageStatus,\n version?: string,\n): RegistryPackage {\n return {\n name: documentModelLib.manifest.name,\n path: \"stub-path\",\n documentTypes: documentModelLib.documentModels.map(\n (d) => d.documentModel.global.id,\n ),\n status,\n manifest: slimManifest(documentModelLib.manifest),\n version,\n };\n}\n\nfunction makeRegistryPackageFromPackageInfo(\n packageInfo: PackageInfo,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n ...packageInfo,\n // Slim before caching: registry manifests are unvalidated JSON and have\n // carried multi-megabyte junk fields that blew the localStorage quota\n // (and the UI only reads the summary fields anyway).\n manifest: slimManifest(packageInfo.manifest),\n documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],\n status,\n };\n}\n\n/**\n * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed\n * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the\n * in-memory state so the package manager still works for the session.\n * useLocalStorage couples the state update to the write — when the write\n * threw, the freshly fetched package list was discarded and the registry UI\n * rendered (and searched) an empty list.\n *\n * The key is derived from the boot-time runtime config and never changes\n * within a session, so no key-change rehydration is needed.\n */\nfunction useBestEffortLocalStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(\n () => readJsonFromStorage<T>(key) ?? initialValue,\n );\n\n useEffect(() => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n // Free the key and retry once — a stale oversized entry from an older\n // session may be occupying the quota this write needs.\n try {\n window.localStorage.removeItem(key);\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n console.warn(\n `Failed to persist \"${key}\" to localStorage; continuing with in-memory data.`,\n error,\n );\n }\n }\n }, [key, value]);\n\n return [value, setValue] as const;\n}\n\nfunction readJsonFromStorage<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n}\n\n/**\n * When refreshing a cached entry, promote `\"available\"` to whatever the\n * packageManager now reports — the cached `\"available\"` was almost certainly\n * recorded before `packageManager.addPackages()` finished on a prior session.\n * Never downgrade an already-installed entry, and never overwrite a deliberate\n * `\"dismissed\"` choice.\n */\nfunction promoteStatus(\n cachedStatus: RegistryPackageStatus,\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n if (cachedStatus !== \"available\") return cachedStatus;\n if (packageSource === null) return cachedStatus;\n return getPackageStatusFromPackageSource(packageSource);\n}\n\nfunction getPackageStatusFromPackageSource(\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n // if we check the package source for a package that came from the api and it doesn't exist yet,\n // then we know the package is available on the api but not installed\n if (packageSource === null) return \"available\";\n // show common package, local project package and locally installed packages as \"local-install\"\n if (\n packageSource === \"local-install\" ||\n packageSource === \"common\" ||\n packageSource === \"project\"\n )\n return \"local-install\";\n // show \"registry-install\" status for package source \"registry-install\"\n if (packageSource === \"registry-install\") return \"registry-install\";\n // fallback to available — we should probably do more checks here\n return \"available\";\n}\n"],"names":[],"mappings":"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","debug_id":"199fdba5-336e-57f9-9bbb-f3d5fbd3554a"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.2.0-dev.
|
|
4
|
+
"version": "6.2.0-dev.39",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -70,15 +70,16 @@
|
|
|
70
70
|
"tailwind-merge": "3.4.0",
|
|
71
71
|
"usehooks-ts": "^3.1.1",
|
|
72
72
|
"zod": "4.3.6",
|
|
73
|
-
"@powerhousedao/config": "6.2.0-dev.
|
|
74
|
-
"@powerhousedao/
|
|
75
|
-
"@powerhousedao/reactor
|
|
76
|
-
"@powerhousedao/
|
|
77
|
-
"@powerhousedao/reactor-
|
|
78
|
-
"@
|
|
79
|
-
"
|
|
80
|
-
"@powerhousedao/
|
|
81
|
-
"@
|
|
73
|
+
"@powerhousedao/config": "6.2.0-dev.39",
|
|
74
|
+
"@powerhousedao/design-system": "6.2.0-dev.39",
|
|
75
|
+
"@powerhousedao/reactor": "6.2.0-dev.39",
|
|
76
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.2.0-dev.39",
|
|
77
|
+
"@powerhousedao/reactor-attachments": "6.2.0-dev.39",
|
|
78
|
+
"@powerhousedao/reactor-browser": "6.2.0-dev.39",
|
|
79
|
+
"@powerhousedao/shared": "6.2.0-dev.39",
|
|
80
|
+
"@powerhousedao/vetra": "6.2.0-dev.39",
|
|
81
|
+
"@renown/sdk": "6.2.0-dev.39",
|
|
82
|
+
"document-model": "6.2.0-dev.39"
|
|
82
83
|
},
|
|
83
84
|
"devDependencies": {
|
|
84
85
|
"@tailwindcss/cli": "4.2.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DriveSettingsModal-CsNFEJ9E.js","sources":["../src/components/modal/modals/DriveSettingsModal.tsx"],"sourcesContent":["import { DriveSettingsModal as ConnectDriveSettingsModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n DriveCollectionId,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n showPHModal,\n useDriveById,\n useDriveSystemInfo,\n usePHModal,\n useSyncList,\n} from \"@powerhousedao/reactor-browser\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport type { SharingType } from \"@powerhousedao/shared/document-drive\";\nimport { useMemo } from \"react\";\n\nexport function DriveSettingsModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"driveSettings\";\n const driveId = open ? phModal.driveId : undefined;\n const [drive] = useDriveById(driveId);\n const remotes = useSyncList();\n\n const isRemoteDrive = useMemo(() => {\n if (!drive) return false;\n return remotes.some((remote) =>\n remote.collectionId.equals(DriveCollectionId.forDrive(drive.header.id)),\n );\n }, [remotes, drive]);\n\n const systemInfo = useDriveSystemInfo(drive);\n\n if (!driveId || !drive) {\n return null;\n }\n\n async function onRenameDrive(drive: DocumentDriveDocument, newName: string) {\n await renameDrive(drive.header.id, newName);\n }\n\n async function onChangeSharingType(\n drive: DocumentDriveDocument,\n newSharingType: SharingType,\n ) {\n await setDriveSharingType(drive.header.id, newSharingType);\n }\n\n async function onChangeAvailableOffline(\n drive: DocumentDriveDocument,\n newAvailableOffline: boolean,\n ) {\n await setDriveAvailableOffline(drive.header.id, newAvailableOffline);\n }\n\n return (\n <ConnectDriveSettingsModal\n drive={drive}\n sharingType={isRemoteDrive ? \"PUBLIC\" : \"LOCAL\"}\n availableOffline={!isRemoteDrive}\n systemInfo={systemInfo}\n open={open}\n onRenameDrive={(d, newName) => {\n void onRenameDrive(d, newName);\n }}\n onDeleteDrive={() => showPHModal({ type: \"deleteDrive\", driveId })}\n onChangeAvailableOffline={(d, newAvailableOffline) => {\n void onChangeAvailableOffline(d, newAvailableOffline);\n }}\n onChangeSharingType={(d, newSharingType) => {\n void onChangeSharingType(d, newSharingType);\n }}\n onOpenChange={(status) => {\n if (!status) return closePHModal();\n }}\n />\n );\n}\n"],"names":["ConnectDriveSettingsModal"],"mappings":";;;;;;;AAiBA,SAAgB,qBAAqB;CACnC,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,SAAS,SAAS;CAC/B,MAAM,UAAU,OAAO,QAAQ,UAAU,KAAA;CACzC,MAAM,CAAC,SAAS,aAAa,QAAQ;CACrC,MAAM,UAAU,aAAa;CAE7B,MAAM,gBAAgB,cAAc;AAClC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,QAAQ,MAAM,WACnB,OAAO,aAAa,OAAO,kBAAkB,SAAS,MAAM,OAAO,GAAG,CAAC,CACxE;IACA,CAAC,SAAS,MAAM,CAAC;CAEpB,MAAM,aAAa,mBAAmB,MAAM;AAE5C,KAAI,CAAC,WAAW,CAAC,MACf,QAAO;CAGT,eAAe,cAAc,OAA8B,SAAiB;AAC1E,QAAM,YAAY,MAAM,OAAO,IAAI,QAAQ;;CAG7C,eAAe,oBACb,OACA,gBACA;AACA,QAAM,oBAAoB,MAAM,OAAO,IAAI,eAAe;;CAG5D,eAAe,yBACb,OACA,qBACA;AACA,QAAM,yBAAyB,MAAM,OAAO,IAAI,oBAAoB;;AAGtE,QACE,oBAACA,sBAAD;EACS;EACP,aAAa,gBAAgB,WAAW;EACxC,kBAAkB,CAAC;EACP;EACN;EACN,gBAAgB,GAAG,YAAY;AACxB,iBAAc,GAAG,QAAQ;;EAEhC,qBAAqB,YAAY;GAAE,MAAM;GAAe;GAAS,CAAC;EAClE,2BAA2B,GAAG,wBAAwB;AAC/C,4BAAyB,GAAG,oBAAoB;;EAEvD,sBAAsB,GAAG,mBAAmB;AACrC,uBAAoB,GAAG,eAAe;;EAE7C,eAAe,WAAW;AACxB,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA","debug_id":"167ef96a-1596-51b6-b58b-b94eb3bdea90"}
|