mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-09-01 16:27:07 +00:00
Refactored: P2P replicator has been refactored to be a little roust and easier to understand.
This commit is contained in:
@@ -9,7 +9,7 @@ import { LOG_LEVEL_NOTICE, REMOTE_P2P } from "@lib/common/types.ts";
|
|||||||
import { Logger } from "@lib/common/logger.ts";
|
import { Logger } from "@lib/common/logger.ts";
|
||||||
import { EVENT_P2P_PEER_SHOW_EXTRA_MENU, type PeerStatus } from "@lib/replication/trystero/P2PReplicatorPaneCommon.ts";
|
import { EVENT_P2P_PEER_SHOW_EXTRA_MENU, type PeerStatus } from "@lib/replication/trystero/P2PReplicatorPaneCommon.ts";
|
||||||
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
|
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
|
||||||
import type { UseP2PReplicatorResult } from "@lib/replication/trystero/P2PReplicatorCore.ts";
|
import type { P2PPaneParams } from "@/lib/src/replication/trystero/UseP2PReplicatorResult";
|
||||||
export const VIEW_TYPE_P2P = "p2p-replicator";
|
export const VIEW_TYPE_P2P = "p2p-replicator";
|
||||||
|
|
||||||
function addToList(item: string, list: string) {
|
function addToList(item: string, list: string) {
|
||||||
@@ -32,7 +32,7 @@ function removeFromList(item: string, list: string) {
|
|||||||
|
|
||||||
export class P2PReplicatorPaneView extends SvelteItemView {
|
export class P2PReplicatorPaneView extends SvelteItemView {
|
||||||
core: LiveSyncBaseCore;
|
core: LiveSyncBaseCore;
|
||||||
private _p2pResult: UseP2PReplicatorResult;
|
private _p2pResult: P2PPaneParams;
|
||||||
override icon = "waypoints";
|
override icon = "waypoints";
|
||||||
title: string = "";
|
title: string = "";
|
||||||
override navigation = false;
|
override navigation = false;
|
||||||
@@ -123,7 +123,7 @@ And you can also drop the local database to rebuild from the remote device.`,
|
|||||||
await this.core.services.setting.applyPartial(currentSetting, true);
|
await this.core.services.setting.applyPartial(currentSetting, true);
|
||||||
}
|
}
|
||||||
m?: Menu;
|
m?: Menu;
|
||||||
constructor(leaf: WorkspaceLeaf, core: LiveSyncBaseCore, p2pResult: UseP2PReplicatorResult) {
|
constructor(leaf: WorkspaceLeaf, core: LiveSyncBaseCore, p2pResult: P2PPaneParams) {
|
||||||
super(leaf);
|
super(leaf);
|
||||||
this.core = core;
|
this.core = core;
|
||||||
this._p2pResult = p2pResult;
|
this._p2pResult = p2pResult;
|
||||||
|
|||||||
+1
-1
Submodule src/lib updated: 94e44e8a03...202038d19e
+14
-14
@@ -14,9 +14,7 @@ import { ModuleObsidianGlobalHistory } from "./modules/features/ModuleGlobalHist
|
|||||||
import { ModuleIntegratedTest } from "./modules/extras/ModuleIntegratedTest.ts";
|
import { ModuleIntegratedTest } from "./modules/extras/ModuleIntegratedTest.ts";
|
||||||
import { ModuleReplicateTest } from "./modules/extras/ModuleReplicateTest.ts";
|
import { ModuleReplicateTest } from "./modules/extras/ModuleReplicateTest.ts";
|
||||||
import { LocalDatabaseMaintenance } from "./features/LocalDatabaseMainte/CmdLocalDatabaseMainte.ts";
|
import { LocalDatabaseMaintenance } from "./features/LocalDatabaseMainte/CmdLocalDatabaseMainte.ts";
|
||||||
import { P2PReplicatorPaneView, VIEW_TYPE_P2P } from "./features/P2PSync/P2PReplicator/P2PReplicatorPaneView.ts";
|
import type { InjectableServiceHub } from "@lib/services/implements/injectable/InjectableServiceHub.ts";
|
||||||
import { useP2PReplicator } from "@lib/replication/trystero/P2PReplicatorCore.ts";
|
|
||||||
import type { InjectableServiceHub } from "./lib/src/services/implements/injectable/InjectableServiceHub.ts";
|
|
||||||
import { ObsidianServiceHub } from "./modules/services/ObsidianServiceHub.ts";
|
import { ObsidianServiceHub } from "./modules/services/ObsidianServiceHub.ts";
|
||||||
import { ServiceRebuilder } from "@lib/serviceModules/Rebuilder.ts";
|
import { ServiceRebuilder } from "@lib/serviceModules/Rebuilder.ts";
|
||||||
import { ServiceDatabaseFileAccess } from "@/serviceModules/DatabaseFileAccess.ts";
|
import { ServiceDatabaseFileAccess } from "@/serviceModules/DatabaseFileAccess.ts";
|
||||||
@@ -27,20 +25,23 @@ import { FileAccessObsidian } from "./serviceModules/FileAccessObsidian.ts";
|
|||||||
import { StorageEventManagerObsidian } from "./managers/StorageEventManagerObsidian.ts";
|
import { StorageEventManagerObsidian } from "./managers/StorageEventManagerObsidian.ts";
|
||||||
import type { ServiceModules } from "./types.ts";
|
import type { ServiceModules } from "./types.ts";
|
||||||
import { setNoticeClass } from "@lib/mock_and_interop/wrapper.ts";
|
import { setNoticeClass } from "@lib/mock_and_interop/wrapper.ts";
|
||||||
import type { ObsidianServiceContext } from "./lib/src/services/implements/obsidian/ObsidianServiceContext.ts";
|
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext.ts";
|
||||||
import { LiveSyncBaseCore } from "./LiveSyncBaseCore.ts";
|
import { LiveSyncBaseCore } from "./LiveSyncBaseCore.ts";
|
||||||
import { ModuleObsidianMenu } from "./modules/essentialObsidian/ModuleObsidianMenu.ts";
|
import { ModuleObsidianMenu } from "./modules/essentialObsidian/ModuleObsidianMenu.ts";
|
||||||
import { ModuleObsidianSettingsAsMarkdown } from "./modules/features/ModuleObsidianSettingAsMarkdown.ts";
|
import { ModuleObsidianSettingsAsMarkdown } from "./modules/features/ModuleObsidianSettingAsMarkdown.ts";
|
||||||
import { SetupManager } from "./modules/features/SetupManager.ts";
|
import { SetupManager } from "./modules/features/SetupManager.ts";
|
||||||
import { ModuleMigration } from "./modules/essential/ModuleMigration.ts";
|
import { ModuleMigration } from "./modules/essential/ModuleMigration.ts";
|
||||||
import { enableI18nFeature } from "./serviceFeatures/onLayoutReady/enablei18n.ts";
|
import { enableI18nFeature } from "./serviceFeatures/onLayoutReady/enablei18n.ts";
|
||||||
import { useOfflineScanner } from "./lib/src/serviceFeatures/offlineScanner.ts";
|
import { useOfflineScanner } from "@lib/serviceFeatures/offlineScanner.ts";
|
||||||
import { useCheckRemoteSize } from "./lib/src/serviceFeatures/checkRemoteSize.ts";
|
import { useCheckRemoteSize } from "@lib/serviceFeatures/checkRemoteSize.ts";
|
||||||
import { useRedFlagFeatures } from "./serviceFeatures/redFlag.ts";
|
import { useRedFlagFeatures } from "./serviceFeatures/redFlag.ts";
|
||||||
import { useSetupProtocolFeature } from "./serviceFeatures/setupObsidian/setupProtocol.ts";
|
import { useSetupProtocolFeature } from "./serviceFeatures/setupObsidian/setupProtocol.ts";
|
||||||
import { useSetupQRCodeFeature } from "@lib/serviceFeatures/setupObsidian/qrCode";
|
import { useSetupQRCodeFeature } from "@lib/serviceFeatures/setupObsidian/qrCode";
|
||||||
import { useSetupURIFeature } from "@lib/serviceFeatures/setupObsidian/setupUri";
|
import { useSetupURIFeature } from "@lib/serviceFeatures/setupObsidian/setupUri";
|
||||||
import { useSetupManagerHandlersFeature } from "./serviceFeatures/setupObsidian/setupManagerHandlers.ts";
|
import { useSetupManagerHandlersFeature } from "./serviceFeatures/setupObsidian/setupManagerHandlers.ts";
|
||||||
|
import { useP2PReplicatorFeature } from "@lib/replication/trystero/useP2PReplicatorFeature.ts";
|
||||||
|
import { useP2PReplicatorCommands } from "@lib/replication/trystero/useP2PReplicatorCommands.ts";
|
||||||
|
import { useP2PReplicatorUI } from "./serviceFeatures/useP2PReplicatorUI.ts";
|
||||||
export type LiveSyncCore = LiveSyncBaseCore<ObsidianServiceContext, LiveSyncCommands>;
|
export type LiveSyncCore = LiveSyncBaseCore<ObsidianServiceContext, LiveSyncCommands>;
|
||||||
export default class ObsidianLiveSyncPlugin extends Plugin {
|
export default class ObsidianLiveSyncPlugin extends Plugin {
|
||||||
core: LiveSyncCore;
|
core: LiveSyncCore;
|
||||||
@@ -136,10 +137,6 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
|
|||||||
|
|
||||||
const serviceHub = new ObsidianServiceHub(this);
|
const serviceHub = new ObsidianServiceHub(this);
|
||||||
|
|
||||||
// Capture useP2PReplicator result so it can be passed to the P2PReplicator addon
|
|
||||||
// TODO: Dependency fix: bit hacky
|
|
||||||
let p2pReplicatorResult: ReturnType<typeof useP2PReplicator> | undefined;
|
|
||||||
|
|
||||||
this.core = new LiveSyncBaseCore(
|
this.core = new LiveSyncBaseCore(
|
||||||
serviceHub,
|
serviceHub,
|
||||||
(core, serviceHub) => {
|
(core, serviceHub) => {
|
||||||
@@ -184,10 +181,13 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
|
|||||||
useOfflineScanner(core);
|
useOfflineScanner(core);
|
||||||
useRedFlagFeatures(core);
|
useRedFlagFeatures(core);
|
||||||
useCheckRemoteSize(core);
|
useCheckRemoteSize(core);
|
||||||
p2pReplicatorResult = useP2PReplicator(core, [
|
// p2pReplicatorResult = useP2PReplicator(core, [
|
||||||
VIEW_TYPE_P2P,
|
// VIEW_TYPE_P2P,
|
||||||
(leaf: any) => new P2PReplicatorPaneView(leaf, core, p2pReplicatorResult!),
|
// (leaf: any) => new P2PReplicatorPaneView(leaf, core, p2pReplicatorResult!),
|
||||||
]);
|
// ]);
|
||||||
|
const replicator = useP2PReplicatorFeature(core);
|
||||||
|
useP2PReplicatorCommands(core, replicator);
|
||||||
|
useP2PReplicatorUI(core, core, replicator);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
import { eventHub, EVENT_REQUEST_OPEN_P2P } from "@/common/events";
|
||||||
|
import { reactiveSource } from "octagonal-wheels/dataobject/reactive_v2";
|
||||||
|
import type { NecessaryServices } from "@lib/interfaces/ServiceModule";
|
||||||
|
import { type UseP2PReplicatorResult } from "@/lib/src/replication/trystero/UseP2PReplicatorResult";
|
||||||
|
import { P2PLogCollector } from "@/lib/src/replication/trystero/P2PLogCollector";
|
||||||
|
import { P2PReplicatorPaneView, VIEW_TYPE_P2P } from "@/features/P2PSync/P2PReplicator/P2PReplicatorPaneView";
|
||||||
|
import type { LiveSyncCore } from "@/main";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ServiceFeature: P2P Replicator lifecycle management.
|
||||||
|
* Binds a LiveSyncTrysteroReplicator to the host's lifecycle events,
|
||||||
|
* following the same middleware style as useOfflineScanner.
|
||||||
|
*
|
||||||
|
* @param viewTypeAndFactory Optional [viewType, factory] pair for registering the P2P pane view.
|
||||||
|
* When provided, also registers commands and ribbon icon via services.API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function useP2PReplicatorUI(
|
||||||
|
host: NecessaryServices<
|
||||||
|
| "API"
|
||||||
|
| "appLifecycle"
|
||||||
|
| "setting"
|
||||||
|
| "vault"
|
||||||
|
| "database"
|
||||||
|
| "databaseEvents"
|
||||||
|
| "keyValueDB"
|
||||||
|
| "replication"
|
||||||
|
| "config"
|
||||||
|
| "UI"
|
||||||
|
| "replicator",
|
||||||
|
never
|
||||||
|
>,
|
||||||
|
core: LiveSyncCore,
|
||||||
|
replicator: UseP2PReplicatorResult
|
||||||
|
) {
|
||||||
|
// const env: LiveSyncTrysteroReplicatorEnv = { services: host.services as any };
|
||||||
|
const getReplicator = () => replicator.replicator;
|
||||||
|
const p2pLogCollector = new P2PLogCollector();
|
||||||
|
const storeP2PStatusLine = reactiveSource("");
|
||||||
|
p2pLogCollector.p2pReplicationLine.onChanged((line) => {
|
||||||
|
storeP2PStatusLine.value = line.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Register view, commands and ribbon if a view factory is provided
|
||||||
|
const viewType = VIEW_TYPE_P2P;
|
||||||
|
const factory = (leaf: any) => {
|
||||||
|
return new P2PReplicatorPaneView(leaf, core, {
|
||||||
|
replicator: getReplicator(),
|
||||||
|
p2pLogCollector,
|
||||||
|
storeP2PStatusLine,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const openPane = () => host.services.API.showWindow(viewType);
|
||||||
|
host.services.API.registerWindow(viewType, factory);
|
||||||
|
|
||||||
|
host.services.appLifecycle.onInitialise.addHandler(() => {
|
||||||
|
eventHub.onEvent(EVENT_REQUEST_OPEN_P2P, () => {
|
||||||
|
void openPane();
|
||||||
|
});
|
||||||
|
|
||||||
|
host.services.API.addCommand({
|
||||||
|
id: "open-p2p-replicator",
|
||||||
|
name: "P2P Sync : Open P2P Replicator",
|
||||||
|
callback: () => {
|
||||||
|
void openPane();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
host.services.API.addRibbonIcon("waypoints", "P2P Replicator", () => {
|
||||||
|
void openPane();
|
||||||
|
})?.addClass?.("livesync-ribbon-replicate-p2p");
|
||||||
|
|
||||||
|
return Promise.resolve(true);
|
||||||
|
});
|
||||||
|
return { replicator: getReplicator(), p2pLogCollector, storeP2PStatusLine };
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user