- Rename methods for automatic binging checking.

- Add automatic binging checks.
This commit is contained in:
vorotamoroz
2025-10-06 10:40:25 +01:00
parent cccff21ecc
commit 4808876968
16 changed files with 83 additions and 248 deletions

View File

@@ -411,7 +411,7 @@ export class ConfigSync extends LiveSyncCommands {
get useSyncPluginEtc() {
return this.plugin.settings.usePluginEtc;
}
_isThisModuleEnabled() {
isThisModuleEnabled() {
return this.plugin.settings.usePluginSync;
}
@@ -420,7 +420,7 @@ export class ConfigSync extends LiveSyncCommands {
pluginList: IPluginDataExDisplay[] = [];
showPluginSyncModal() {
if (!this._isThisModuleEnabled()) {
if (!this.isThisModuleEnabled()) {
return;
}
if (this.pluginDialog) {
@@ -492,7 +492,7 @@ export class ConfigSync extends LiveSyncCommands {
return this.getFileCategory(filePath) != "";
}
private async _everyOnDatabaseInitialized(showNotice: boolean) {
if (!this._isThisModuleEnabled()) return true;
if (!this.isThisModuleEnabled()) return true;
try {
this._log("Scanning customizations...");
await this.scanAllConfigFiles(showNotice);
@@ -504,7 +504,7 @@ export class ConfigSync extends LiveSyncCommands {
return true;
}
async _everyBeforeReplicate(showNotice: boolean) {
if (!this._isThisModuleEnabled()) return true;
if (!this.isThisModuleEnabled()) return true;
if (this.settings.autoSweepPlugins) {
await this.scanAllConfigFiles(showNotice);
return true;
@@ -512,7 +512,7 @@ export class ConfigSync extends LiveSyncCommands {
return true;
}
async _everyOnResumeProcess(): Promise<boolean> {
if (!this._isThisModuleEnabled()) return true;
if (!this.isThisModuleEnabled()) return true;
if (this._isMainSuspended()) {
return true;
}
@@ -528,7 +528,7 @@ export class ConfigSync extends LiveSyncCommands {
}
_everyAfterResumeProcess(): Promise<boolean> {
const q = activeDocument.querySelector(`.livesync-ribbon-showcustom`);
q?.toggleClass("sls-hidden", !this._isThisModuleEnabled());
q?.toggleClass("sls-hidden", !this.isThisModuleEnabled());
return Promise.resolve(true);
}
async reloadPluginList(showMessage: boolean) {
@@ -870,7 +870,7 @@ export class ConfigSync extends LiveSyncCommands {
}
async updatePluginList(showMessage: boolean, updatedDocumentPath?: FilePathWithPrefix): Promise<void> {
if (!this._isThisModuleEnabled()) {
if (!this.isThisModuleEnabled()) {
this.pluginScanProcessor.clearQueue();
this.pluginList = [];
pluginList.set(this.pluginList);
@@ -1168,13 +1168,13 @@ export class ConfigSync extends LiveSyncCommands {
}
async _anyModuleParsedReplicationResultItem(docs: PouchDB.Core.ExistingDocument<EntryDoc>) {
if (!docs._id.startsWith(ICXHeader)) return false;
if (this._isThisModuleEnabled()) {
if (this.isThisModuleEnabled()) {
await this.updatePluginList(
false,
(docs as AnyEntry).path ? (docs as AnyEntry).path : this.getPath(docs as AnyEntry)
);
}
if (this._isThisModuleEnabled() && this.plugin.settings.notifyPluginOrSettingUpdated) {
if (this.isThisModuleEnabled() && this.plugin.settings.notifyPluginOrSettingUpdated) {
if (!this.pluginDialog || (this.pluginDialog && !this.pluginDialog.isOpened())) {
const fragment = createFragment((doc) => {
doc.createEl("span", undefined, (a) => {
@@ -1218,7 +1218,7 @@ export class ConfigSync extends LiveSyncCommands {
this.periodicPluginSweepProcessor?.disable();
if (!this._isMainReady) return true;
if (!this._isMainSuspended()) return true;
if (!this._isThisModuleEnabled()) return true;
if (!this.isThisModuleEnabled()) return true;
if (this.settings.autoSweepPlugins) {
await this.scanAllConfigFiles(false);
}
@@ -1504,7 +1504,7 @@ export class ConfigSync extends LiveSyncCommands {
async watchVaultRawEventsAsync(path: FilePath) {
if (!this._isMainReady) return false;
if (this._isMainSuspended()) return false;
if (!this._isThisModuleEnabled()) return false;
if (!this.isThisModuleEnabled()) return false;
// if (!this.isTargetPath(path)) return false;
const stat = await this.plugin.storageAccess.statHidden(path);
// Make sure that target is a file.
@@ -1686,10 +1686,10 @@ export class ConfigSync extends LiveSyncCommands {
enableFetch?: boolean;
enableOverwrite?: boolean;
}): Promise<boolean> {
await this._askHiddenFileConfiguration(opt);
await this.__askHiddenFileConfiguration(opt);
return true;
}
async _askHiddenFileConfiguration(opt: { enableFetch?: boolean; enableOverwrite?: boolean }) {
private async __askHiddenFileConfiguration(opt: { enableFetch?: boolean; enableOverwrite?: boolean }) {
const message = `Would you like to enable **Customization sync**?
> [!DETAILS]-

View File

@@ -81,13 +81,13 @@ function getComparingMTime(
}
export class HiddenFileSync extends LiveSyncCommands {
_isThisModuleEnabled() {
isThisModuleEnabled() {
return this.plugin.settings.syncInternalFiles;
}
periodicInternalFileScanProcessor: PeriodicProcessor = new PeriodicProcessor(
this.plugin,
async () => this._isThisModuleEnabled() && this._isDatabaseReady() && (await this.scanAllStorageChanges(false))
async () => this.isThisModuleEnabled() && this._isDatabaseReady() && (await this.scanAllStorageChanges(false))
);
get kvDB() {
@@ -151,7 +151,7 @@ export class HiddenFileSync extends LiveSyncCommands {
this._fileInfoLastProcessed = await autosaveCache(this.kvDB, "hidden-file-lastProcessed");
this._databaseInfoLastProcessed = await autosaveCache(this.kvDB, "hidden-file-lastProcessed-database");
this._fileInfoLastKnown = await autosaveCache(this.kvDB, "hidden-file-lastKnown");
if (this._isThisModuleEnabled()) {
if (this.isThisModuleEnabled()) {
if (this._fileInfoLastProcessed.size == 0 && this._fileInfoLastProcessed.size == 0) {
this._log(`No cache found. Performing startup scan.`, LOG_LEVEL_VERBOSE);
await this.performStartupScan(true);
@@ -163,7 +163,7 @@ export class HiddenFileSync extends LiveSyncCommands {
}
async _everyBeforeReplicate(showNotice: boolean) {
if (
this._isThisModuleEnabled() &&
this.isThisModuleEnabled() &&
this._isDatabaseReady() &&
this.settings.syncInternalFilesBeforeReplication &&
!this.settings.watchInternalFileChanges
@@ -200,7 +200,7 @@ export class HiddenFileSync extends LiveSyncCommands {
isReady() {
if (!this._isMainReady) return false;
if (this._isMainSuspended()) return false;
if (!this._isThisModuleEnabled()) return false;
if (!this.isThisModuleEnabled()) return false;
return true;
}
shouldSkipFile = [] as FilePathWithPrefixLC[];
@@ -212,11 +212,11 @@ export class HiddenFileSync extends LiveSyncCommands {
async _everyOnResumeProcess(): Promise<boolean> {
this.periodicInternalFileScanProcessor?.disable();
if (this._isMainSuspended()) return true;
if (this._isThisModuleEnabled()) {
if (this.isThisModuleEnabled()) {
await this.performStartupScan(false);
}
this.periodicInternalFileScanProcessor.enable(
this._isThisModuleEnabled() && this.settings.syncInternalFilesInterval
this.isThisModuleEnabled() && this.settings.syncInternalFilesInterval
? this.settings.syncInternalFilesInterval * 1000
: 0
);
@@ -228,7 +228,7 @@ export class HiddenFileSync extends LiveSyncCommands {
if (this._isMainSuspended()) return Promise.resolve(true);
if (!this.services.appLifecycle.isReady()) return Promise.resolve(true);
this.periodicInternalFileScanProcessor.enable(
this._isThisModuleEnabled() && this.settings.syncInternalFilesInterval
this.isThisModuleEnabled() && this.settings.syncInternalFilesInterval
? this.settings.syncInternalFilesInterval * 1000
: 0
);
@@ -256,7 +256,7 @@ export class HiddenFileSync extends LiveSyncCommands {
async _anyProcessOptionalSyncFiles(doc: LoadedEntry): Promise<boolean> {
if (isInternalMetadata(doc._id)) {
if (this._isThisModuleEnabled()) {
if (this.isThisModuleEnabled()) {
//system file
const filename = getPath(doc);
if (await this.services.vault.isTargetFile(filename)) {
@@ -1492,7 +1492,7 @@ Offline Changed files: ${files.length}`;
}
const deleted = metaOnDB.deleted || metaOnDB._deleted || false;
if (deleted) {
const result = await this._deleteFile(storageFilePath);
const result = await this.__deleteFile(storageFilePath);
if (result == "OK") {
this.updateLastProcessedDeletion(storageFilePath, metaOnDB);
return true;
@@ -1506,7 +1506,7 @@ Offline Changed files: ${files.length}`;
if (fileOnDB === false) {
throw new Error(`Failed to read file from database:${storageFilePath}`);
}
const resultStat = await this._writeFile(storageFilePath, fileOnDB, force);
const resultStat = await this.__writeFile(storageFilePath, fileOnDB, force);
if (resultStat) {
this.updateLastProcessed(storageFilePath, metaOnDB, resultStat);
this.queueNotification(storageFilePath);
@@ -1539,7 +1539,7 @@ Offline Changed files: ${files.length}`;
}
}
async _writeFile(storageFilePath: FilePath, fileOnDB: LoadedEntry, force: boolean): Promise<false | UXStat> {
async __writeFile(storageFilePath: FilePath, fileOnDB: LoadedEntry, force: boolean): Promise<false | UXStat> {
try {
const statBefore = await this.plugin.storageAccess.statHidden(storageFilePath);
const isExist = statBefore != null;
@@ -1578,7 +1578,7 @@ Offline Changed files: ${files.length}`;
}
}
async _deleteFile(storageFilePath: FilePath): Promise<false | "OK" | "ALREADY"> {
async __deleteFile(storageFilePath: FilePath): Promise<false | "OK" | "ALREADY"> {
const result = await this.__removeFile(storageFilePath);
if (result === false) {
this._log(`STORAGE <x- DB: ${storageFilePath}: deleting (hidden) Failed`);
@@ -1596,10 +1596,10 @@ Offline Changed files: ${files.length}`;
// <-- Database To Storage Functions
private async _allAskUsingOptionalSyncFeature(opt: { enableFetch?: boolean; enableOverwrite?: boolean }) {
await this._askHiddenFileConfiguration(opt);
await this.__askHiddenFileConfiguration(opt);
return true;
}
async _askHiddenFileConfiguration(opt: { enableFetch?: boolean; enableOverwrite?: boolean }) {
private async __askHiddenFileConfiguration(opt: { enableFetch?: boolean; enableOverwrite?: boolean }) {
const messageFetch = `${opt.enableFetch ? `> - Fetch: Use the files stored from other devices. Choose this option if you have already configured hidden file synchronization on those devices and wish to accept their files.\n` : ""}`;
const messageOverwrite = `${opt.enableOverwrite ? `> - Overwrite: Use the files from this device. Select this option if you want to overwrite the files stored on other devices.\n` : ""}`;
const messageMerge = `> - Merge: Merge the files from this device with those on other devices. Choose this option if you wish to combine files from multiple sources.

View File

@@ -12,6 +12,7 @@ import {
import type ObsidianLiveSyncPlugin from "../main.ts";
import { MARK_DONE } from "../modules/features/ModuleLog.ts";
import type { LiveSyncCore } from "../main.ts";
import { __$checkInstanceBinding } from "../lib/src/dev/checks.ts";
let noticeIndex = 0;
export abstract class LiveSyncCommands {
@@ -42,6 +43,7 @@ export abstract class LiveSyncCommands {
constructor(plugin: ObsidianLiveSyncPlugin) {
this.plugin = plugin;
this.onBindFunction(plugin, plugin.services);
__$checkInstanceBinding(this);
}
abstract onunload(): void;
abstract onload(): void | Promise<void>;

View File

@@ -33,176 +33,6 @@ import { getPlatformName } from "../../lib/src/PlatformAPIs/obsidian/Environment
import type { LiveSyncCore } from "../../main.ts";
import { TrysteroReplicator } from "../../lib/src/replication/trystero/TrysteroReplicator.ts";
// class P2PReplicatorCommandBase extends LiveSyncCommands implements P2PReplicatorBase {
// storeP2PStatusLine = reactiveSource("");
// getSettings(): P2PSyncSetting {
// return this.plugin.settings;
// }
// get settings() {
// return this.plugin.settings;
// }
// getDB() {
// return this.plugin.localDatabase.localDatabase;
// }
// get confirm(): Confirm {
// return this.plugin.confirm;
// }
// _simpleStore!: SimpleStore<any>;
// simpleStore(): SimpleStore<any> {
// return this._simpleStore;
// }
// constructor(plugin: ObsidianLiveSyncPlugin) {
// super(plugin);
// this.onBindFunction(plugin, plugin.services);
// }
// async handleReplicatedDocuments(docs: EntryDoc[]): Promise<void> {
// // console.log("Processing Replicated Docs", docs);
// return await this.services.replication.parseSynchroniseResult(
// docs as PouchDB.Core.ExistingDocument<EntryDoc>[]
// );
// }
// onunload(): void {
// throw new Error("Method not implemented.");
// }
// onload(): void | Promise<void> {
// throw new Error("Method not implemented.");
// }
// init() {
// this._simpleStore = this.services.database.openSimpleStore("p2p-sync");
// return Promise.resolve(this);
// }
// }
// export class P2PReplicator extends P2PReplicatorMixIn(P2PReplicatorCommandBase) implements CommandShim {
// storeP2PStatusLine = reactiveSource("");
// _anyNewReplicator(settingOverride: Partial<RemoteDBSettings> = {}): Promise<LiveSyncAbstractReplicator> {
// const settings = { ...this.settings, ...settingOverride };
// if (settings.remoteType == REMOTE_P2P) {
// return Promise.resolve(new LiveSyncTrysteroReplicator(this.plugin));
// }
// return undefined!;
// }
// override getPlatform(): string {
// return getPlatformName();
// }
// override onunload(): void {
// removeP2PReplicatorInstance();
// void this.close();
// }
// override onload(): void | Promise<void> {
// eventHub.onEvent(EVENT_REQUEST_OPEN_P2P, () => {
// void this.openPane();
// });
// this.p2pLogCollector.p2pReplicationLine.onChanged((line) => {
// this.storeP2PStatusLine.value = line.value;
// });
// }
// async _everyOnInitializeDatabase(): Promise<boolean> {
// await this.initialiseP2PReplicator();
// return Promise.resolve(true);
// }
// private async _allSuspendExtraSync() {
// this.plugin.settings.P2P_Enabled = false;
// this.plugin.settings.P2P_AutoAccepting = AutoAccepting.NONE;
// this.plugin.settings.P2P_AutoBroadcast = false;
// this.plugin.settings.P2P_AutoStart = false;
// this.plugin.settings.P2P_AutoSyncPeers = "";
// this.plugin.settings.P2P_AutoWatchPeers = "";
// return await Promise.resolve(true);
// }
// // async $everyOnLoadStart() {
// // return await Promise.resolve();
// // }
// async openPane() {
// await this.services.API.showWindow(VIEW_TYPE_P2P);
// }
// async _everyOnloadStart(): Promise<boolean> {
// // this.plugin.registerView(VIEW_TYPE_P2P, (leaf) => new P2PReplicatorPaneView(leaf, this.plugin));
// this.plugin.addCommand({
// id: "open-p2p-replicator",
// name: "P2P Sync : Open P2P Replicator",
// callback: async () => {
// await this.openPane();
// },
// });
// this.plugin.addCommand({
// id: "p2p-establish-connection",
// name: "P2P Sync : Connect to the Signalling Server",
// checkCallback: (isChecking) => {
// if (isChecking) {
// return !(this._replicatorInstance?.server?.isServing ?? false);
// }
// void this.open();
// },
// });
// this.plugin.addCommand({
// id: "p2p-close-connection",
// name: "P2P Sync : Disconnect from the Signalling Server",
// checkCallback: (isChecking) => {
// if (isChecking) {
// return this._replicatorInstance?.server?.isServing ?? false;
// }
// Logger(`Closing P2P Connection`, LOG_LEVEL_NOTICE);
// void this.close();
// },
// });
// this.plugin.addCommand({
// id: "replicate-now-by-p2p",
// name: "Replicate now by P2P",
// checkCallback: (isChecking) => {
// if (isChecking) {
// if (this.settings.remoteType == REMOTE_P2P) return false;
// if (!this._replicatorInstance?.server?.isServing) return false;
// return true;
// }
// void this._replicatorInstance?.replicateFromCommand(false);
// },
// });
// this.plugin
// .addRibbonIcon("waypoints", "P2P Replicator", async () => {
// await this.openPane();
// })
// .addClass("livesync-ribbon-replicate-p2p");
// return await Promise.resolve(true);
// }
// _everyAfterResumeProcess(): Promise<boolean> {
// if (this.settings.P2P_Enabled && this.settings.P2P_AutoStart) {
// setTimeout(() => void this.open(), 100);
// }
// const rep = this._replicatorInstance;
// rep?.allowReconnection();
// return Promise.resolve(true);
// }
// _everyBeforeSuspendProcess(): Promise<boolean> {
// const rep = this._replicatorInstance;
// rep?.disconnectFromServer();
// return Promise.resolve(true);
// }
// override onBindFunction(core: LiveSyncCore, services: typeof core.services): void {
// services.replicator.handleGetNewReplicator(this._anyNewReplicator.bind(this));
// services.databaseEvents.handleOnDatabaseInitialisation(this._everyOnInitializeDatabase.bind(this));
// services.appLifecycle.handleOnInitialise(this._everyOnloadStart.bind(this));
// services.appLifecycle.handleOnSuspending(this._everyBeforeSuspendProcess.bind(this));
// services.appLifecycle.handleOnResumed(this._everyAfterResumeProcess.bind(this));
// services.setting.handleSuspendExtraSync(this._allSuspendExtraSync.bind(this));
// }
// }
export class P2PReplicator extends LiveSyncCommands implements P2PReplicatorBase, CommandShim {
storeP2PStatusLine = reactiveSource("");
@@ -230,7 +60,8 @@ export class P2PReplicator extends LiveSyncCommands implements P2PReplicatorBase
setReplicatorFunc(() => this._replicatorInstance);
addP2PEventHandlers(this);
this.afterConstructor();
this.onBindFunction(plugin, plugin.services);
// onBindFunction is called in super class
// this.onBindFunction(plugin, plugin.services);
}
async handleReplicatedDocuments(docs: EntryDoc[]): Promise<void> {