@hesprs/sync-engine-sdk 3.1.8 → 3.2.0

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.
Files changed (36) hide show
  1. package/dist/dev.js +1 -1
  2. package/dist/dev.spec.d.ts +9 -3
  3. package/dist/{index-CC4NddoN.spec.d.ts → index-DbDrKV7S.spec.d.ts} +139 -162
  4. package/dist/index.js +1 -1
  5. package/dist/index.spec.d.ts +2 -2
  6. package/dist/plugin/src/components/MigrationModal.js +1 -0
  7. package/dist/{packages/plugin → plugin}/src/settings/utils.js +1 -1
  8. package/dist/plugin/src/utils/pipe.js +1 -0
  9. package/dist/plugin/test/test-kit.js +1 -0
  10. package/dist/prefix.js +1 -1
  11. package/package.json +1 -1
  12. package/dist/node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js +0 -1
  13. package/dist/packages/plugin/src/components/MigrationModal.js +0 -1
  14. package/dist/packages/plugin/src/components/render-progress.js +0 -1
  15. package/dist/packages/plugin/src/utils/pipe.js +0 -1
  16. package/dist/packages/plugin/src/utils/round-percent.js +0 -1
  17. package/dist/packages/plugin/src/utils/to-error-message.js +0 -1
  18. package/dist/packages/plugin/test/test-kit.js +0 -1
  19. /package/dist/{packages/plugin → plugin}/src/fs/wrappers/memory-control.js +0 -0
  20. /package/dist/{packages/plugin → plugin}/src/sync/decision/interface.js +0 -0
  21. /package/dist/{packages/plugin → plugin}/src/sync/tasks/AddRecord.js +0 -0
  22. /package/dist/{packages/plugin → plugin}/src/sync/tasks/CreateLocalDir.js +0 -0
  23. /package/dist/{packages/plugin → plugin}/src/sync/tasks/CreateRemoteDir.js +0 -0
  24. /package/dist/{packages/plugin → plugin}/src/sync/tasks/Download.js +0 -0
  25. /package/dist/{packages/plugin → plugin}/src/sync/tasks/MoveLocal.js +0 -0
  26. /package/dist/{packages/plugin → plugin}/src/sync/tasks/MoveRemote.js +0 -0
  27. /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveLocal.js +0 -0
  28. /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveRecord.js +0 -0
  29. /package/dist/{packages/plugin → plugin}/src/sync/tasks/RemoveRemote.js +0 -0
  30. /package/dist/{packages/plugin → plugin}/src/sync/tasks/ResolveConflict.js +0 -0
  31. /package/dist/{packages/plugin → plugin}/src/sync/tasks/Upload.js +0 -0
  32. /package/dist/{packages/plugin → plugin}/src/sync/tasks/interface.js +0 -0
  33. /package/dist/{packages/plugin → plugin}/src/utils/move-value.js +0 -0
  34. /package/dist/{packages/plugin → plugin}/src/utils/sha-256.js +0 -0
  35. /package/dist/{packages/shared/src/get-status.js → shared/src/error.js} +0 -0
  36. /package/dist/{packages/shared → shared}/src/path.js +0 -0
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- import e from"./debug-wrapper.js";import t from"./packages/plugin/test/test-kit.js";import n from"./packages/plugin/src/utils/sha-256.js";export{e as debugWrapper,n as sha256,t as testKit};
1
+ import e from"./debug-wrapper.js";import t from"./plugin/test/test-kit.js";import n from"./plugin/src/utils/sha-256.js";export{e as debugWrapper,n as sha256,t as testKit};
@@ -1,4 +1,4 @@
1
- import { At as FileStat, Dt as RootFs, Ft as RecordStatsMap, It as Stat, Lt as StatsMap, Ot as WrappedFs, Pt as RecordStat, Rt as Binary, d as RequestParam, jt as FolderStat, lt as TaskNames, q as Decider, u as Request, yt as Fs } from "./index-CC4NddoN.spec.js";
1
+ import { At as FileStat, Dt as RootFs, Ft as RecordStatsMap, It as Stat, K as Decider, Lt as StatsMap, Mt as MaybePromise, Ot as WrappedFs, Pt as RecordStat, Rt as Binary, ct as TaskNames, d as RequestResponse, jt as FolderStat, l as Request, u as RequestParam, vt as Fs } from "./index-DbDrKV7S.spec.js";
2
2
  //#region src/sdk/debug-wrapper.d.ts
3
3
  declare function debugWrapper(original: Fs, log: (content: string) => void): WrappedFs;
4
4
  //#endregion
@@ -24,8 +24,11 @@ type FsHarness = {
24
24
  control: Fs;
25
25
  fs: RootFs;
26
26
  };
27
+ type ResponseControl = (url: string, params: RequestParam) => MaybePromise<ResponseOverrides>;
27
28
  type RequestHarness = {
28
- calls: Array<RequestParam | string>;
29
+ calls: Array<RequestParam & {
30
+ url: string;
31
+ }>;
29
32
  request: Request;
30
33
  };
31
34
  type ExtractedTask = {
@@ -58,7 +61,10 @@ declare function deferred<T>(): {
58
61
  resolve: (value: T | PromiseLike<T>) => void;
59
62
  };
60
63
  declare function flush(turns?: number): Promise<void>;
61
- declare function request(control: Request): RequestHarness;
64
+ type ResponseOverrides = Partial<Omit<RequestResponse, 'json'>> & {
65
+ json?: () => unknown;
66
+ };
67
+ declare function request(control: ResponseControl): RequestHarness;
62
68
  declare function fs(options?: FsOptions): FsHarness;
63
69
  declare const testKit: {
64
70
  bytes: typeof bytes;
@@ -32,9 +32,9 @@ type RecordStat = {
32
32
  };
33
33
  type StatsMap = Map<string, Stat$1>;
34
34
  type RecordStatsMap = Map<string, RecordStat>;
35
- type GlobMatchRule = {
35
+ type GlobStrategy = {
36
36
  expr: string;
37
- caseSensitive: boolean;
37
+ strategy: string;
38
38
  };
39
39
  type Progress<T = string> = {
40
40
  total: number;
@@ -62,7 +62,8 @@ type RootFs = {
62
62
  exists(key: string): MaybePromise<boolean>;
63
63
  list(key: string, reporter: ListReporter): MaybePromise<Array<Stat$1>>;
64
64
  };
65
- type ListReporter = (progress: Required<Progress>) => MaybePromise<'include' | 'exclude' | 'advance'>;
65
+ type ListOptions = 'include' | 'exclude' | 'advance';
66
+ type ListReporter = (progress: Required<Progress>) => MaybePromise<ListOptions>;
66
67
  type WrappedFs = RootFs & {
67
68
  original: Fs;
68
69
  };
@@ -203,7 +204,7 @@ declare class Storage {
203
204
  private readonly memoryDB;
204
205
  private readonly indexedDB;
205
206
  constructor(ctx: {
206
- getNamespace: () => string;
207
+ getNamespace: () => string | Error;
207
208
  });
208
209
  private readonly getRecordStore;
209
210
  private readonly deleteRecordStore;
@@ -212,16 +213,7 @@ declare class Storage {
212
213
  readonly root: {
213
214
  clearRecordStores: () => Promise<void>;
214
215
  deleteRecordStore: (namespace?: string) => MaybePromise<void>;
215
- getRecordStore: (namespace?: string) => {
216
- get(key: string): Promise<RecordStat | undefined>;
217
- set(key: string, value: RecordStat): Promise<void>;
218
- delete(key: string): Promise<void>;
219
- clear(): Promise<void>;
220
- keys(): Promise<string[]>;
221
- values(): Promise<RecordStat[]>;
222
- entries(): Promise<[string, RecordStat][]>;
223
- batch(operations: StoreOperations<RecordStat>[]): Promise<GetResult<RecordStat>[]>;
224
- };
216
+ getRecordStore: <N extends string | undefined>(namespace?: N) => N extends string ? RecordStore : RecordStore | undefined;
225
217
  indexedDB: DatabaseAsync<General$1, General$1>;
226
218
  memoryDB: {
227
219
  getStore<K extends string | number | symbol>(name: K): {
@@ -401,7 +393,6 @@ type DeciderInput = {
401
393
  remoteStats: StatsMap;
402
394
  records: RecordStatsMap;
403
395
  taskFactory: TaskFactory;
404
- logger: (log: string) => void;
405
396
  };
406
397
  //#endregion
407
398
  //#region src/sync/tasks/CreateLocalDir.d.ts
@@ -416,8 +407,8 @@ declare class EventBus {
416
407
  readonly events: {
417
408
  logSync: string;
418
409
  logGeneral: string;
419
- errorSync: string;
420
- errorGeneral: string;
410
+ errorSync: Error;
411
+ errorGeneral: Error;
421
412
  };
422
413
  private readonly cleanupCallbacks;
423
414
  private readonly isIdle;
@@ -427,6 +418,8 @@ declare class EventBus {
427
418
  private readonly getThisSync;
428
419
  private readonly putSyncLog;
429
420
  private readonly putGeneralLog;
421
+ private readonly putSyncError;
422
+ private readonly putGeneralError;
430
423
  private readonly subscribers;
431
424
  private readonly on;
432
425
  private readonly dispatch;
@@ -460,6 +453,84 @@ declare class I18n {
460
453
  };
461
454
  }
462
455
  //#endregion
456
+ //#region src/utils/glob-match.d.ts
457
+ type GlobMatchResult = {
458
+ strategy: string;
459
+ advance?: boolean;
460
+ };
461
+ //#endregion
462
+ //#region src/modules/Sync.d.ts
463
+ type SyncTerminateReason = {
464
+ result: 'cancelled';
465
+ } | {
466
+ result: 'completed';
467
+ } | {
468
+ result: 'failed';
469
+ error: Error;
470
+ } | {
471
+ result: 'noop';
472
+ };
473
+ type TaskInfo = {
474
+ name: TaskNames;
475
+ key: string;
476
+ prettyName: string;
477
+ isDir: boolean;
478
+ };
479
+ type FailedTaskInfo = TaskInfo & {
480
+ error: Error;
481
+ };
482
+ type RemoteLister = (info: Infras & {
483
+ reporter: ListReporter;
484
+ }) => MaybePromise<Array<Stat$1>>;
485
+ type SyncOptions = {
486
+ remoteLister?: RemoteLister;
487
+ conflictResolver?: ConflictResolver;
488
+ detectMoves?: boolean;
489
+ needConfirmTasks?: boolean;
490
+ needConfirmDeletion?: boolean;
491
+ syncStrategy?: Array<GlobStrategy>;
492
+ };
493
+ declare class Sync {
494
+ private readonly ctx;
495
+ constructor(ctx: {
496
+ dispatch: Dispatch<Events>;
497
+ initializeSync: () => Infras;
498
+ on: On<Events>;
499
+ translate: Translate<Translations>;
500
+ getConflictResolver: () => ConflictResolver;
501
+ decideTasks: (input: DecideTasksInput) => Array<BaseTask>;
502
+ });
503
+ readonly events: {
504
+ syncStarted: {
505
+ isCancelled: Ref<boolean>;
506
+ trigger: string;
507
+ };
508
+ syncInitialized: Infras & {
509
+ match: (path: string) => GlobMatchResult;
510
+ };
511
+ remoteWalkProgress: Progress;
512
+ syncTerminated: SyncTerminateReason;
513
+ requestConfirmDelete: Array<RemoveLocal>;
514
+ requestConfirmTasks: Array<BaseTask>;
515
+ syncCanceled: undefined;
516
+ taskCompleted: TaskInfo;
517
+ taskFailed: FailedTaskInfo;
518
+ executionStarted: Array<BaseTask>;
519
+ };
520
+ readonly settings: {
521
+ maxFileSize: TogglableValue;
522
+ syncStrategy: Array<GlobStrategy>;
523
+ };
524
+ private readonly postProcess;
525
+ private readonly confirmTasks;
526
+ private readonly confirmDeletion;
527
+ private readonly executeSync;
528
+ private readonly convertDeleteToUpload;
529
+ root: {
530
+ executeSync: (trigger: string, options?: SyncOptions) => Promise<SyncTerminateReason>;
531
+ };
532
+ }
533
+ //#endregion
463
534
  //#region src/modules/Observability.d.ts
464
535
  type SyncStage = 'none' | 'walkingRemote' | 'awaitingConfirmation' | 'executing' | 'completed' | 'completedNoop' | 'cancelled' | 'failed';
465
536
  type AddRibbonIcon = (icon: IconName, title: string, callback: (evt: MouseEvent) => void) => HTMLElement;
@@ -709,7 +780,7 @@ declare function reactivelyValidate<T>({ text, parse, onSave, format, immediate
709
780
  onSave: (value: T) => void;
710
781
  immediate?: boolean;
711
782
  }): void;
712
- declare function generateEditableList<T>({ memoryDB, items, identifier, saveSettings, rerenderSettingTab, defaultValue, render, translations: { add, empty, heading }, extraButtons }: {
783
+ declare function generateEditableList<T>({ memoryDB, items, identifier, saveSettings, rerenderSettingTab, defaultValue, render, translations: { add, empty, heading }, extraButtons, reorder }: {
713
784
  memoryDB: DatabaseSync<EphemeralEditableListSchema>;
714
785
  items: Array<T>;
715
786
  identifier: string;
@@ -723,6 +794,7 @@ declare function generateEditableList<T>({ memoryDB, items, identifier, saveSett
723
794
  heading?: string;
724
795
  };
725
796
  extraButtons?: Array<(button: ExtraButtonComponent, list: Array<EphemeralEditableItem<T>>, save: () => void) => void>;
797
+ reorder?: boolean;
726
798
  }): SettingDefinitionList;
727
799
  //#endregion
728
800
  //#region src/settings/controls.d.ts
@@ -765,28 +837,14 @@ type DevelopmentSettingTranslations = {
765
837
  //#region src/components/MigrationModal.d.ts
766
838
  type MigrationModalTranslations = {
767
839
  cancel: string;
840
+ confirm: string;
768
841
  remoteMigration: string;
769
- migrationProcess: string;
770
- startMigration: string;
771
- migrationDescription: string;
772
- migrationPhase1Description: string;
773
- migrationPhase2Description: string;
774
- migrationPhase3Description: string;
775
- toggleWithoutMigration: string;
776
- migrationFailed: string;
777
- completed: string;
778
- hide: string;
779
- done: string;
780
- };
781
- type MigrationContext = {
842
+ migrationInstruction: Fragment;
843
+ };
844
+ declare function setNeedMigration({ app, translate }: {
782
845
  app: App;
783
- dispatch: Dispatch<Events>;
784
846
  translate: Translate<MigrationModalTranslations>;
785
- requestSync: (trigger: string) => Promise<SyncTerminateReason>;
786
- initializeSync: () => Infras;
787
- memoryDB: ExistingMemoryDB;
788
- };
789
- declare function setNeedMigration(ctx: MigrationContext, { toggle, needMigration, content, apply }: {
847
+ }, { toggle, needMigration, content, apply }: {
790
848
  toggle: ToggleComponent;
791
849
  needMigration?: (value: boolean) => MaybePromise<boolean>;
792
850
  content: (value: boolean) => string | DocumentFragment;
@@ -812,21 +870,6 @@ type FeaturesSettingTranslations = {
812
870
  asymmetricStorageMigration: Fragment<boolean>;
813
871
  } & MigrationModalTranslations;
814
872
  //#endregion
815
- //#region src/settings/filter.d.ts
816
- type FilterSettingTranslations = {
817
- filterRules: string;
818
- inclusionRules: string;
819
- inclusionRulesDescription: Fragment;
820
- exclusionRules: string;
821
- exclusionRulesDescription: Fragment;
822
- xConfigured: Snippet<number>;
823
- addInclusionRule: string;
824
- addExclusionRule: string;
825
- noRuleConfigured: string;
826
- filterPlaceholder: string;
827
- caseSensitive: string;
828
- };
829
- //#endregion
830
873
  //#region src/sdk/prefix.d.ts
831
874
  declare function prefixWrapper(original: Fs, prefix: string): WrappedFs;
832
875
  //#endregion
@@ -854,17 +897,22 @@ type HeadSettingTranslations = {
854
897
  backend: string;
855
898
  backendDescription: string;
856
899
  syncStrategy: string;
857
- syncStrategyDescription: string;
900
+ syncStrategyDescription: Fragment;
901
+ globPlaceholder: string;
858
902
  checkConnectionFailed: string;
859
903
  checkConnectionSuccess: string;
860
904
  checkConnection: string;
861
905
  conflictResolveStrategy: string;
862
906
  conflictResolveStrategyDescription: string;
863
907
  xEnabled: Snippet<number>;
908
+ xConfigured: Snippet<number>;
864
909
  settingTips: Fragment<{
865
910
  labels: Array<LabelDefinition>;
866
911
  addLabel: typeof addLabel;
867
912
  }>;
913
+ addStrategy: string;
914
+ noStrategyConfigured: string;
915
+ dontSync: string;
868
916
  };
869
917
  declare function addLabel(element: Element, { text, tooltip, color, textColor }: LabelDefinition): HTMLSpanElement;
870
918
  //#endregion
@@ -981,7 +1029,7 @@ declare class Bootstrap {
981
1029
  keepRemote: string;
982
1030
  renameAndKeepBoth: string;
983
1031
  skip: string;
984
- } & ControlsSettingTranslations & DevelopmentSettingTranslations & FeaturesSettingTranslations & FilterSettingTranslations & HeadSettingTranslations & MiscellaneousSettingTranslations & UntrustedModuleTranslations & FileTreeTranslations & ModulesTranslations;
1032
+ } & ControlsSettingTranslations & DevelopmentSettingTranslations & FeaturesSettingTranslations & HeadSettingTranslations & MiscellaneousSettingTranslations & UntrustedModuleTranslations & FileTreeTranslations & ModulesTranslations;
985
1033
  readonly settings: {
986
1034
  maxMemoryConsumption: TogglableValue;
987
1035
  maxRequestConcurrency: TogglableValue;
@@ -1103,8 +1151,7 @@ declare class Scheduler {
1103
1151
  startupSync: TogglableValue;
1104
1152
  scheduledSync: TogglableValue;
1105
1153
  realtimeSync: TogglableValue;
1106
- exclusionRules: Array<GlobMatchRule>;
1107
- inclusionRules: Array<GlobMatchRule>;
1154
+ syncStrategy: Array<GlobStrategy>;
1108
1155
  avoidAutoSyncWhenOffline: boolean;
1109
1156
  };
1110
1157
  private readonly requestSync;
@@ -1138,78 +1185,6 @@ type Events = MergeSingleKey<InternalModules, 'events'>;
1138
1185
  type Settings = MergeSingleKey<InternalModules, 'settings'>;
1139
1186
  type Translations = MergeSingleKey<InternalModules, 'i18n'>;
1140
1187
  //#endregion
1141
- //#region src/modules/Sync.d.ts
1142
- type SyncTerminateReason = {
1143
- result: 'cancelled';
1144
- } | {
1145
- result: 'completed';
1146
- } | {
1147
- result: 'failed';
1148
- error: string;
1149
- } | {
1150
- result: 'noop';
1151
- };
1152
- type TaskInfo = {
1153
- name: TaskNames;
1154
- key: string;
1155
- prettyName: string;
1156
- isDir: boolean;
1157
- };
1158
- type FailedTaskInfo = TaskInfo & {
1159
- error: string;
1160
- };
1161
- type RemoteLister = (info: Infras & {
1162
- reporter: ListReporter;
1163
- }) => MaybePromise<Array<Stat$1>>;
1164
- type SyncOptions = {
1165
- decider?: Decider;
1166
- remoteLister?: RemoteLister;
1167
- conflictResolver?: ConflictResolver;
1168
- detectMoves?: boolean;
1169
- needConfirmTasks?: boolean;
1170
- needConfirmDeletion?: boolean;
1171
- exclusionRules?: Array<GlobMatchRule>;
1172
- inclusionRules?: Array<GlobMatchRule>;
1173
- };
1174
- declare class Sync {
1175
- private readonly ctx;
1176
- constructor(ctx: {
1177
- dispatch: Dispatch<Events>;
1178
- initializeSync: () => Infras;
1179
- getDecider: () => Decider;
1180
- on: On<Events>;
1181
- translate: Translate<Translations>;
1182
- getConflictResolver: () => ConflictResolver;
1183
- });
1184
- readonly events: {
1185
- syncStarted: {
1186
- isCancelled: Ref<boolean>;
1187
- trigger: string;
1188
- };
1189
- remoteWalkProgress: Progress;
1190
- syncTerminated: SyncTerminateReason;
1191
- requestConfirmDelete: Array<RemoveLocal>;
1192
- requestConfirmTasks: Array<BaseTask>;
1193
- syncCanceled: undefined;
1194
- taskCompleted: TaskInfo;
1195
- taskFailed: FailedTaskInfo;
1196
- executionStarted: Array<BaseTask>;
1197
- };
1198
- readonly settings: {
1199
- maxFileSize: TogglableValue;
1200
- exclusionRules: Array<GlobMatchRule>;
1201
- inclusionRules: Array<GlobMatchRule>;
1202
- };
1203
- private readonly postProcess;
1204
- private readonly confirmTasks;
1205
- private readonly confirmDeletion;
1206
- private readonly executeSync;
1207
- private readonly convertDeleteToUpload;
1208
- root: {
1209
- executeSync: (trigger: string, options?: SyncOptions) => Promise<SyncTerminateReason>;
1210
- };
1211
- }
1212
- //#endregion
1213
1188
  //#region src/modules/Registrar.d.ts
1214
1189
  type RejectableWrapper<T> = (value: T) => T | undefined;
1215
1190
  type OrderedWrapperEntry<T> = {
@@ -1219,16 +1194,10 @@ type OrderedWrapperEntry<T> = {
1219
1194
  type RemoteRequestMiddlewareEntry = OrderedWrapperEntry<Request>;
1220
1195
  type LocalRequestMiddlewareEntry = OrderedWrapperEntry<VaultRequest>;
1221
1196
  type FsWrapperEntry = OrderedWrapperEntry<Fs>;
1222
- type CheckConnectionResult = {
1223
- success: true;
1224
- } | {
1225
- success: false;
1226
- reason: string;
1227
- };
1228
1197
  type RemoteFsEntry = {
1229
1198
  instantiate: (request: Request) => RootFs;
1230
1199
  prettyName: () => string;
1231
- checkConnection: (request: Request) => MaybePromise<CheckConnectionResult>;
1200
+ checkConnection: (request: Request) => MaybePromise<void | Error>;
1232
1201
  };
1233
1202
  type DeciderEntry = {
1234
1203
  decider: Decider;
@@ -1249,21 +1218,28 @@ type TriggerEntry = {
1249
1218
  priority: number;
1250
1219
  options?: () => SyncOptions;
1251
1220
  };
1252
- type RequestParam = Omit<RequestUrlParam, 'body'> & {
1221
+ type Infras = {
1222
+ localFs: Fs;
1223
+ remoteFs: Fs;
1224
+ record: RecordStore;
1225
+ };
1226
+ type RequestParam = Omit<RequestUrlParam, 'body' | 'url'> & {
1253
1227
  body?: string | Binary;
1228
+ ignoreCancellation?: boolean;
1254
1229
  };
1255
1230
  type RequestResponse = {
1256
1231
  text: () => string;
1257
1232
  bytes: () => Binary;
1258
- json: () => General$1;
1233
+ json: <T extends object = object>() => T;
1259
1234
  headers: Record<string, string>;
1260
1235
  status: number;
1261
1236
  };
1262
- type Request = (params: RequestParam | string) => Promise<RequestResponse>;
1263
- type Infras = {
1264
- localFs: Fs;
1265
- remoteFs: Fs;
1266
- record: RecordStore;
1237
+ type Request = (url: string, params?: RequestParam) => Promise<RequestResponse>;
1238
+ type DecideTasksInput = {
1239
+ local: Record<string, StatsMap>;
1240
+ remote: Record<string, StatsMap>;
1241
+ record: Record<string, RecordStatsMap>;
1242
+ taskFactory: TaskFactory;
1267
1243
  };
1268
1244
  declare class Registrar {
1269
1245
  private readonly ctx;
@@ -1280,19 +1256,26 @@ declare class Registrar {
1280
1256
  private readonly conflictResolverRegistry;
1281
1257
  readonly settings: {
1282
1258
  remoteFs: string;
1283
- decider: string;
1284
1259
  conflictResolver: string;
1285
1260
  };
1261
+ readonly i18n: {
1262
+ pleaseSetBackend: string;
1263
+ backendNotInstalled: Snippet<string>;
1264
+ syncStrategyNotInstalled: Snippet<string>;
1265
+ conflictResolveStrategyNotInstalled: Snippet<string>;
1266
+ };
1286
1267
  constructor(ctx: {
1287
1268
  app: App;
1288
- getRecordStore: (namespace?: string) => StoreAsync<RecordStat>;
1269
+ getRecordStore: (namespace: string) => RecordStore;
1270
+ translate: Translate<Translations>;
1271
+ dispatch: Dispatch<Events>;
1289
1272
  });
1290
1273
  private readonly getVaultRequest;
1291
1274
  private readonly createLocalFs;
1292
1275
  private readonly createRemoteFs;
1293
1276
  private readonly getRequest;
1294
1277
  private readonly getCheckConnection;
1295
- private readonly getDecider;
1278
+ private readonly decideTasks;
1296
1279
  private readonly optimizeLocal;
1297
1280
  private readonly optimizeRemote;
1298
1281
  private readonly reduceTriggers;
@@ -1302,12 +1285,12 @@ declare class Registrar {
1302
1285
  root: {
1303
1286
  conflictResolverRegistry: Map<string, ConflictResolverEntry>;
1304
1287
  createLocalFs: () => Fs;
1305
- createRemoteFs: (remoteFs?: string) => Fs;
1288
+ createRemoteFs: (remoteFs?: string) => Fs | Error;
1289
+ decideTasks: ({ local, record, remote, taskFactory }: DecideTasksInput) => BaseTask<TaskOptions>[];
1306
1290
  deciderRegistry: Map<string, DeciderEntry>;
1307
- getCheckConnection: (remoteFs?: string) => () => MaybePromise<CheckConnectionResult>;
1291
+ getCheckConnection: (remoteFs?: string) => () => MaybePromise<void | Error>;
1308
1292
  getConflictResolver: () => ConflictResolver;
1309
- getDecider: () => Decider;
1310
- getNamespace: (localFs?: Fs, remoteFs?: Fs) => string;
1293
+ getNamespace: <R extends Fs | undefined>(localFs?: Fs, remoteFs?: R) => R extends Fs ? string : string | Error;
1311
1294
  getRequest: () => Request;
1312
1295
  getVaultRequest: () => VaultRequest;
1313
1296
  initializeSync: () => Infras;
@@ -1334,47 +1317,39 @@ declare class Registrar {
1334
1317
  }
1335
1318
  //#endregion
1336
1319
  //#region src/fs/vault/request.d.ts
1337
- type VaultRequestParam = {
1320
+ type VaultRequestParam = ({
1338
1321
  method: 'GET';
1339
- key: string;
1340
1322
  } | {
1341
1323
  method: 'GET_STREAM';
1342
- key: string;
1343
1324
  size: number;
1344
1325
  } | {
1345
1326
  method: 'PUT';
1346
- key: string;
1347
1327
  value: Binary;
1348
1328
  mtime?: number;
1349
1329
  ctime?: number;
1350
1330
  } | {
1351
1331
  method: 'APPEND';
1352
- key: string;
1353
1332
  value: Binary;
1354
1333
  mtime?: number;
1355
1334
  ctime?: number;
1356
1335
  } | {
1357
1336
  method: 'DELETE';
1358
- key: string;
1359
1337
  trash?: TrashOption;
1360
1338
  } | {
1361
1339
  method: 'MOVE';
1362
- key: string;
1363
1340
  destination: string;
1364
1341
  } | {
1365
1342
  method: 'MKDIR';
1366
- key: string;
1367
1343
  } | {
1368
1344
  method: 'EXISTS';
1369
- key: string;
1370
1345
  } | {
1371
1346
  method: 'STAT';
1372
- key: string;
1373
1347
  cached?: boolean;
1374
1348
  } | {
1375
1349
  method: 'LIST';
1376
- key: string;
1377
1350
  cached?: boolean;
1351
+ }) & {
1352
+ ignoreCancellation?: boolean;
1378
1353
  };
1379
1354
  type VaultRequestResponseMap = {
1380
1355
  GET: Binary;
@@ -1388,7 +1363,9 @@ type VaultRequestResponseMap = {
1388
1363
  STAT: Stat;
1389
1364
  LIST: ListedFiles;
1390
1365
  };
1391
- type VaultRequest = <T extends VaultRequestParam>(params: T) => Promise<VaultRequestResponseMap[T['method']]>;
1366
+ type VaultRequest = <T extends VaultRequestParam = {
1367
+ method: 'GET';
1368
+ }>(key: string, params?: T) => Promise<VaultRequestResponseMap[T['method']]>;
1392
1369
  type TrashOption = 'local' | 'system' | 'permanent';
1393
1370
  //#endregion
1394
- export { RemoveRecord as $, setNeedMigration as A, FileStat as At, ObsidianLanguageCode as B, digOriginal as C, MoveAtom as Ct, readWithSize as D, RootFs as Dt, pipe as E, OutputAtom as Et, CallableOrObjectTree as F, RecordStatsMap as Ft, On as G, Translate as H, SettingEntry as I, Stat$1 as It, DeciderInput as J, CreateLocalDir as K, AugmentedModuleMeta as L, StatsMap as Lt, generateEditableList as M, MaybePromise as Mt, reactivelyValidate as N, Progress as Nt, writeWithValue as O, WrappedFs as Ot, s as P, RecordStat as Pt, RemoveRemote as Q, ModuleMeta as R, Binary as Rt, SelectFromContext as S, MkdirAtom as St, concurrency as T, OptimizerOutput as Tt, TranslationResource as U, Snippet as V, Dispatch as W, Upload as X, TaskFactory as Y, ResolveConflict as Z, Context as _, CustomAtom as _t, FsWrapperEntry as a, AddRecord as at, Translations as b, InputAtom as bt, RemoteFsEntry as c, ConflictResolverPayload as ct, RequestParam as d, DatabaseAsync as dt, RemoveLocal as et, RequestResponse as f, DatabaseSync as ft, SyncTerminateReason as g, BatchOptimizer as gt, SyncOptions as h, StoreSync as ht, DeciderEntry as i, CreateRemoteDir as it, LabelDefinition as j, FolderStat as jt, prefixWrapper as k, WriteAtom as kt, RemoteRequestMiddlewareEntry as l, TaskNames as lt, RemoteLister as m, StoreOperations as mt, CheckConnectionResult as n, MoveLocal as nt, LocalRequestMiddlewareEntry as o, BaseTask as ot, TriggerEntry as p, StoreAsync as pt, Decider as q, ConflictResolverEntry as r, Download as rt, OptimizerEntry as s, ConflictResolver as st, VaultRequest as t, MoveRemote as tt, Request as u, RecordStore as ut, Events as v, DeleteAtom as vt, chunkSize as w, OptimizerInput as wt, ExistingMemoryDB as x, ListReporter as xt, Settings as y, Fs as yt, Fragment as z };
1371
+ export { RemoveLocal as $, s as A, FileStat as At, Snippet as B, readWithSize as C, MoveAtom as Ct, LabelDefinition as D, RootFs as Dt, setNeedMigration as E, OutputAtom as Et, RemoteLister as F, RecordStatsMap as Ft, CreateLocalDir as G, TranslationResource as H, SyncOptions as I, Stat$1 as It, TaskFactory as J, Decider as K, SyncTerminateReason as L, StatsMap as Lt, SettingEntry as M, MaybePromise as Mt, AugmentedModuleMeta as N, Progress as Nt, generateEditableList as O, WrappedFs as Ot, ModuleMeta as P, RecordStat as Pt, RemoveRecord as Q, Fragment as R, Binary as Rt, pipe as S, MkdirAtom as St, prefixWrapper as T, OptimizerOutput as Tt, Dispatch as U, Translate as V, On as W, ResolveConflict as X, Upload as Y, RemoveRemote as Z, ExistingMemoryDB as _, DeleteAtom as _t, LocalRequestMiddlewareEntry as a, BaseTask as at, chunkSize as b, ListOptions as bt, RemoteRequestMiddlewareEntry as c, TaskNames as ct, RequestResponse as d, DatabaseSync as dt, MoveRemote as et, TriggerEntry as f, StoreAsync as ft, Translations as g, CustomAtom as gt, Settings as h, BatchOptimizer as ht, FsWrapperEntry as i, AddRecord as it, CallableOrObjectTree as j, FolderStat as jt, reactivelyValidate as k, WriteAtom as kt, Request as l, RecordStore as lt, Events as m, StoreSync as mt, ConflictResolverEntry as n, Download as nt, OptimizerEntry as o, ConflictResolver as ot, Context as p, StoreOperations as pt, DeciderInput as q, DeciderEntry as r, CreateRemoteDir as rt, RemoteFsEntry as s, ConflictResolverPayload as st, VaultRequest as t, MoveLocal as tt, RequestParam as u, DatabaseAsync as ut, SelectFromContext as v, Fs as vt, writeWithValue as w, OptimizerInput as wt, concurrency as x, ListReporter as xt, digOriginal as y, InputAtom as yt, ObsidianLanguageCode as z };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{chunkSize as e,concurrency as t,pipe as n,readWithSize as r,writeWithValue as i}from"./packages/plugin/src/utils/pipe.js";import a from"./packages/plugin/src/components/MigrationModal.js";import o from"./prefix.js";import{generateEditableList as s,reactivelyValidate as c,s as l}from"./packages/plugin/src/settings/utils.js";function u(e){let t=e;for(;`original`in t;)t=t.original;return t}export{e as chunkSize,t as concurrency,u as digOriginal,s as generateEditableList,n as pipe,o as prefixWrapper,c as reactivelyValidate,r as readWithSize,l as s,a as setNeedMigration,i as writeWithValue};
1
+ import{chunkSize as e,concurrency as t,pipe as n,readWithSize as r,writeWithValue as i}from"./plugin/src/utils/pipe.js";import a from"./plugin/src/components/MigrationModal.js";import o from"./prefix.js";import{generateEditableList as s,reactivelyValidate as c,s as l}from"./plugin/src/settings/utils.js";function u(e){let t=e;for(;`original`in t;)t=t.original;return t}export{e as chunkSize,t as concurrency,u as digOriginal,s as generateEditableList,n as pipe,o as prefixWrapper,c as reactivelyValidate,r as readWithSize,l as s,a as setNeedMigration,i as writeWithValue};
@@ -1,2 +1,2 @@
1
- import { $ as RemoveRecord, A as setNeedMigration, At as FileStat, B as ObsidianLanguageCode, C as digOriginal, Ct as MoveAtom, D as readWithSize, Dt as RootFs, E as pipe, Et as OutputAtom, F as CallableOrObjectTree, Ft as RecordStatsMap, G as On, H as Translate, I as SettingEntry, It as Stat, J as DeciderInput, K as CreateLocalDir, L as AugmentedModuleMeta, Lt as StatsMap, M as generateEditableList, Mt as MaybePromise, N as reactivelyValidate, Nt as Progress, O as writeWithValue, Ot as WrappedFs, P as s, Pt as RecordStat, Q as RemoveRemote, R as ModuleMeta, Rt as Binary, S as SelectFromContext, St as MkdirAtom, T as concurrency, Tt as OptimizerOutput, U as TranslationResource, V as Snippet, W as Dispatch, X as Upload, Y as TaskFactory, Z as ResolveConflict, _ as Context, _t as CustomAtom, a as FsWrapperEntry, at as AddRecord, b as Translations, bt as InputAtom, c as RemoteFsEntry, ct as ConflictResolverPayload, d as RequestParam, dt as DatabaseAsync, et as RemoveLocal, f as RequestResponse, ft as DatabaseSync, g as SyncTerminateReason, gt as BatchOptimizer, h as SyncOptions, ht as StoreSync, i as DeciderEntry, it as CreateRemoteDir, j as LabelDefinition, jt as FolderStat, k as prefixWrapper, kt as WriteAtom, l as RemoteRequestMiddlewareEntry, lt as TaskNames, m as RemoteLister, mt as StoreOperations, n as CheckConnectionResult, nt as MoveLocal, o as LocalRequestMiddlewareEntry, ot as BaseTask, p as TriggerEntry, pt as StoreAsync, q as Decider, r as ConflictResolverEntry, rt as Download, s as OptimizerEntry, st as ConflictResolver, t as VaultRequest, tt as MoveRemote, u as Request, ut as RecordStore, v as Events, vt as DeleteAtom, w as chunkSize, wt as OptimizerInput, x as ExistingMemoryDB, xt as ListReporter, y as Settings, yt as Fs, z as Fragment } from "./index-CC4NddoN.spec.js";
2
- export { type AddRecord, type AugmentedModuleMeta, type BaseTask, type BatchOptimizer, type Binary, type CallableOrObjectTree, type CheckConnectionResult, type ConflictResolver, type ConflictResolverEntry, type ConflictResolverPayload, type Context, type CreateLocalDir, type CreateRemoteDir, type CustomAtom, type DatabaseAsync, type DatabaseSync, type Decider, type DeciderEntry, type DeciderInput, type DeleteAtom, type Dispatch, type Download, type Events, type ExistingMemoryDB, type FileStat, type FolderStat, type Fragment, type Fs, type FsWrapperEntry, type InputAtom, type LabelDefinition, type ListReporter, type LocalRequestMiddlewareEntry, type MaybePromise, type MkdirAtom, type ModuleMeta, type MoveAtom, type MoveLocal, type MoveRemote, type ObsidianLanguageCode, type On, type OptimizerEntry, type OptimizerInput, type OptimizerOutput, type OutputAtom, type Progress, type RecordStat, type RecordStatsMap, type RecordStore, type RemoteFsEntry, type RemoteLister, type RemoteRequestMiddlewareEntry, type RemoveLocal, type RemoveRecord, type RemoveRemote, type Request, type RequestParam, type RequestResponse, type ResolveConflict, type RootFs, SelectFromContext, type SettingEntry, type Settings, type Snippet, type Stat, type StatsMap, type StoreAsync, type StoreOperations, type StoreSync, type SyncOptions, type SyncTerminateReason, type TaskFactory, type TaskNames, type Translate, type TranslationResource, type Translations, type TriggerEntry, type Upload, type VaultRequest, type WrappedFs, type WriteAtom, chunkSize, concurrency, digOriginal, generateEditableList, pipe, prefixWrapper, reactivelyValidate, readWithSize, s, setNeedMigration, writeWithValue };
1
+ import { $ as RemoveLocal, A as s, At as FileStat, B as Snippet, C as readWithSize, Ct as MoveAtom, D as LabelDefinition, Dt as RootFs, E as setNeedMigration, Et as OutputAtom, F as RemoteLister, Ft as RecordStatsMap, G as CreateLocalDir, H as TranslationResource, I as SyncOptions, It as Stat, J as TaskFactory, K as Decider, L as SyncTerminateReason, Lt as StatsMap, M as SettingEntry, Mt as MaybePromise, N as AugmentedModuleMeta, Nt as Progress, O as generateEditableList, Ot as WrappedFs, P as ModuleMeta, Pt as RecordStat, Q as RemoveRecord, R as Fragment, Rt as Binary, S as pipe, St as MkdirAtom, T as prefixWrapper, Tt as OptimizerOutput, U as Dispatch, V as Translate, W as On, X as ResolveConflict, Y as Upload, Z as RemoveRemote, _ as ExistingMemoryDB, _t as DeleteAtom, a as LocalRequestMiddlewareEntry, at as BaseTask, b as chunkSize, bt as ListOptions, c as RemoteRequestMiddlewareEntry, ct as TaskNames, d as RequestResponse, dt as DatabaseSync, et as MoveRemote, f as TriggerEntry, ft as StoreAsync, g as Translations, gt as CustomAtom, h as Settings, ht as BatchOptimizer, i as FsWrapperEntry, it as AddRecord, j as CallableOrObjectTree, jt as FolderStat, k as reactivelyValidate, kt as WriteAtom, l as Request, lt as RecordStore, m as Events, mt as StoreSync, n as ConflictResolverEntry, nt as Download, o as OptimizerEntry, ot as ConflictResolver, p as Context, pt as StoreOperations, q as DeciderInput, r as DeciderEntry, rt as CreateRemoteDir, s as RemoteFsEntry, st as ConflictResolverPayload, t as VaultRequest, tt as MoveLocal, u as RequestParam, ut as DatabaseAsync, v as SelectFromContext, vt as Fs, w as writeWithValue, wt as OptimizerInput, x as concurrency, xt as ListReporter, y as digOriginal, yt as InputAtom, z as ObsidianLanguageCode } from "./index-DbDrKV7S.spec.js";
2
+ export { type AddRecord, type AugmentedModuleMeta, type BaseTask, type BatchOptimizer, type Binary, type CallableOrObjectTree, type ConflictResolver, type ConflictResolverEntry, type ConflictResolverPayload, type Context, type CreateLocalDir, type CreateRemoteDir, type CustomAtom, type DatabaseAsync, type DatabaseSync, type Decider, type DeciderEntry, type DeciderInput, type DeleteAtom, type Dispatch, type Download, type Events, type ExistingMemoryDB, type FileStat, type FolderStat, type Fragment, type Fs, type FsWrapperEntry, type InputAtom, type LabelDefinition, type ListOptions, type ListReporter, type LocalRequestMiddlewareEntry, type MaybePromise, type MkdirAtom, type ModuleMeta, type MoveAtom, type MoveLocal, type MoveRemote, type ObsidianLanguageCode, type On, type OptimizerEntry, type OptimizerInput, type OptimizerOutput, type OutputAtom, type Progress, type RecordStat, type RecordStatsMap, type RecordStore, type RemoteFsEntry, type RemoteLister, type RemoteRequestMiddlewareEntry, type RemoveLocal, type RemoveRecord, type RemoveRemote, type Request, type RequestParam, type RequestResponse, type ResolveConflict, type RootFs, SelectFromContext, type SettingEntry, type Settings, type Snippet, type Stat, type StatsMap, type StoreAsync, type StoreOperations, type StoreSync, type SyncOptions, type SyncTerminateReason, type TaskFactory, type TaskNames, type Translate, type TranslationResource, type Translations, type TriggerEntry, type Upload, type VaultRequest, type WrappedFs, type WriteAtom, chunkSize, concurrency, digOriginal, generateEditableList, pipe, prefixWrapper, reactivelyValidate, readWithSize, s, setNeedMigration, writeWithValue };
@@ -0,0 +1 @@
1
+ import{ConfirmationModal as e}from"obsidian";function t({app:t,translate:n},{toggle:r,needMigration:i,content:a,apply:o}){let s=!1;r.onChange(c=>{if(s){s=!1;return}let l=async i=>{if(i){s=!0,r.setValue(!c);let i=new e(t).setTitle(n(`remoteMigration`)).setContent(createFragment(e=>{let t=a(c);e.append(t instanceof DocumentFragment?t:createEl(`p`,{text:t}),n(`migrationInstruction`))})).addCancelButton(n(`cancel`)).addButton(e=>e.setButtonText(n(`confirm`)).setCta().onClick(()=>(s=!0,r.setValue(c),o(c))));i.contentEl.addClass(`markdown-rendered`),i.open()}else await o(c)},u=i?.(c)??!0;u instanceof Promise?u.then(l):l(u)})}export{t as default};
@@ -1 +1 @@
1
- import{encodeURIComponent3986 as e}from"../../../shared/src/path.js";import{setIcon as t}from"obsidian";function n(e,t){return t?Object.assign(e,t):e}function r(){let n=`--sync-engine-warning`;if(activeDocument.body.style.getPropertyValue(n))return;let r=createDiv();t(r,`triangle-alert`),r.firstElementChild.setAttr(`stroke`,getComputedStyle(activeDocument.body).getPropertyValue(`--text-warning`)),activeDocument.body.style.setProperty(n,`url("data:image/svg+xml,${e(r.innerHTML)}")`)}function i({text:e,parse:t,onSave:n,format:i=String,immediate:a=!1}){r();let o,s=`sync-engine-invalid-input`,c=n=>{o=t(n),o===void 0?e.inputEl.addClass(s):e.inputEl.removeClass(s)};e.onChange(c).inputEl.addEventListener(`blur`,()=>{o!==void 0&&(n(o),e.setValue(i(o)))}),a&&c(e.getValue())}function a({memoryDB:e,items:t,identifier:n,saveSettings:r,rerenderSettingTab:i,defaultValue:a,render:o,translations:{add:s,empty:c,heading:l},extraButtons:u}){let d=e.getStore(`ephemeralEditableLists`),f=d.get(n),p;f?p=f:(p=t.map(e=>({new:!1,valid:!0,value:e})),d.set(n,p));let m=()=>{let e=p.filter(({valid:e})=>e).map(({value:e})=>e);JSON.stringify(e)!==JSON.stringify(t)&&(t.length=0,t.push(...e),r())};return{addItem:{action:()=>{p.push({new:!0,valid:!1,value:structuredClone(a)}),i()},name:s},emptyState:c,extraButtons:u?u.map(e=>t=>e(t,p,m)):void 0,heading:l,items:p.map(e=>({name:``,render:t=>(t.settingEl.addClass(`sync-engine-editable-list`),t.settingEl.querySelector(`.setting-item-control`)?.addClass(`w-100%!`),o(t,e,m)),searchable:!1})),onDelete:e=>{p.splice(e,1),m(),i()},type:`list`}}export{a as generateEditableList,i as reactivelyValidate,n as s};
1
+ import{encodeURIComponent3986 as e}from"../../../shared/src/path.js";import{setIcon as t}from"obsidian";function n(e,t){return t?Object.assign(e,t):e}function r(){let n=`--sync-engine-warning`;if(activeDocument.body.style.getPropertyValue(n))return;let r=createDiv();t(r,`triangle-alert`),r.firstElementChild.setAttr(`stroke`,getComputedStyle(activeDocument.body).getPropertyValue(`--text-warning`)),activeDocument.body.style.setProperty(n,`url("data:image/svg+xml,${e(r.innerHTML)}")`)}function i({text:e,parse:t,onSave:n,format:i=String,immediate:a=!1}){r();let o,s=`sync-engine-invalid-input`,c=n=>{o=t(n),o===void 0?e.inputEl.addClass(s):e.inputEl.removeClass(s)};e.onChange(c).inputEl.addEventListener(`blur`,()=>{o!==void 0&&(n(o),e.setValue(i(o)))}),a&&c(e.getValue())}function a({memoryDB:e,items:t,identifier:n,saveSettings:r,rerenderSettingTab:i,defaultValue:a,render:o,translations:{add:s,empty:c,heading:l},extraButtons:u,reorder:d}){let f=e.getStore(`ephemeralEditableLists`),p=f.get(n)??t.map(e=>({new:!1,valid:!0,value:e}));f.set(n,p);let m=()=>{let e=p.filter(({valid:e})=>e).map(({value:e})=>e);t.length=0,t.push(...e),r()};return{addItem:{action:()=>{p.push({new:!0,valid:!1,value:structuredClone(a)}),i()},name:s},emptyState:c,extraButtons:u?u.map(e=>t=>e(t,p,m)):void 0,heading:l,items:p.map(e=>({name:``,render:t=>{t.settingEl.addClass(`sync-engine-editable-list`);let n=o(t,e,m);return e.new&&=!1,n},searchable:!1})),onDelete:e=>{p.splice(e,1),m(),i()},onReorder:d?(e,t)=>{let[n]=p.splice(e,1);p.splice(t,0,n),m(),i()}:void 0,type:`list`}}export{a as generateEditableList,i as reactivelyValidate,n as s};
@@ -0,0 +1 @@
1
+ import{getStatus as e}from"../../../shared/src/error.js";import{STREAM_RESERVATION_SIZE as t}from"../fs/wrappers/memory-control.js";import{Platform as n}from"obsidian";function r(){let e=5*1024**2;`deviceMemory`in navigator&&typeof navigator.deviceMemory==`number`?navigator.deviceMemory<=4&&(e/=2):navigator.hardwareConcurrency<=4&&(e/=2),n.isAndroidApp&&(e/=2);let r=e*.8;return{chunkSize:r,concurrency:Math.floor(t/r),streamThreshold:e}}const{chunkSize:i,concurrency:a,streamThreshold:o}=r();async function s({from:e,to:t,stat:n,key:r}){let i=await c(e,r,n);if(i)return l(t,r,i,n)}async function c(e,t,n){try{return n.size>o?await e.readStream(t,n):await e.read(t,n)}catch(e){if(u(e))return;throw e}}function l(e,t,n,r){return n instanceof ReadableStream?e.writeStream(t,n,r):e.write(t,n,r)}function u(t){return e(t)===404||(t.message??String(t)).toLocaleUpperCase().includes(`ENOENT`)}export{i as chunkSize,a as concurrency,s as pipe,c as readWithSize,l as writeWithValue};
@@ -0,0 +1 @@
1
+ import{taskMap as e}from"../src/sync/decision/interface.js";const t=new TextEncoder;function n(e){return t.encode(e)}function r(e,t={}){let{mtime:n=1,size:r=5,uid:i=`${e}-uid`}=t;return{isDir:!1,key:e,mtime:n,size:r,uid:i}}function i(e){return{isDir:!0,key:e}}function a(e,t){return{isDir:!1,local:e,remote:t}}function o(){return{isDir:!0}}function s(t,n){let r=n.localStats??/* @__PURE__ */ new Map,i=n.remoteStats??/* @__PURE__ */ new Map,a=n.records??/* @__PURE__ */ new Map,o=[];return t({localStats:r,records:a,remoteStats:i,taskFactory:((t,n)=>{let r=e[t],i=new r({...n,localFs:{},record:{},remoteFs:{}});return i.name=t,i.prettyName=t,o.push({key:n.key,name:t,...n.local!==void 0&&{local:n.local},...n.remote!==void 0&&{remote:n.remote}}),i})}),o}function c(e){return e.map(e=>e.name)}function l(e){return e.map(e=>e.key)}function u(e,t){let n=e.filter(e=>e.key===t);if(n.length!==1)throw Error(`Expected one task for ${t}, found ${n.length}.`);return n[0]}function d(e){return e===`/`||e.endsWith(`/`)?i(e):r(e,{mtime:10,size:5,uid:`uid`})}function f(e=[]){return new ReadableStream({start(t){for(let r of e)t.enqueue(typeof r==`string`?n(r):r);t.close()}})}function p(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),reject:t,resolve:e}}async function m(e=4){for(let t=0;t<e;t+=1)await new Promise(e=>{queueMicrotask(e)})}function h(){return{delete:[],exists:[],list:[],mkdir:[],move:[],read:[],readStream:[],stat:[],write:[],writeStream:[]}}function g(e={}){return{delete:()=>{},exists:()=>!1,getUid:()=>`FsControl`,list:e=>[d(e),i(`${e}folder/`),r(`${e}folder/note.md`,{mtime:12,size:7,uid:`note-2`})],mkdir:()=>{},move:()=>{},read:()=>n(``),readStream:()=>f(),stat:e=>d(e),write:()=>`write-uid`,writeStream:()=>`stream-uid`,...e}}const _=()=>n(`ok`),v=()=>`ok`,y=()=>({});function b(e={}){return{bytes:_,headers:{},status:200,text:v,...e,json:e.json??y}}function x(e){let t=[];return{calls:t,request:async(n,r)=>(t.push({url:n,...r}),b(await e(n,r??{})))}}function S(e={}){let t=h(),n=g(e.control),r=e.uid??`uid`;return{calls:t,control:n,fs:{delete:e=>(t.delete.push(e),n.delete(e)),exists:e=>(t.exists.push(e),n.exists(e)),getUid:()=>r,list:(e,r)=>(t.list.push(e),n.list(e,r)),mkdir:(e,r)=>(t.mkdir.push(e),n.mkdir(e,r)),move:(e,r)=>(t.move.push([e,r]),n.move(e,r)),read:(e,r)=>(t.read.push([e,r]),n.read(e,r)),readStream:(e,r)=>(t.readStream.push([e,r]),n.readStream(e,r)),stat:e=>(t.stat.push(e),n.stat(e)),write:(e,r,i)=>(t.write.push([e,r,i]),n.write(e,r,i)),writeStream:(e,r,i)=>(t.writeStream.push([e,i]),n.writeStream(e,r,i))}}}const C={bytes:n,deferred:p,file:r,fileRecord:a,findTask:u,flush:m,folder:i,folderRecord:o,fs:S,request:x,runDecider:s,stream:f,taskKeys:l,taskNames:c};export{C as default};
package/dist/prefix.js CHANGED
@@ -1 +1 @@
1
- import{normalizeBaseDir as e}from"./packages/shared/src/path.js";function t(e,t){return t===`/`?e:e===`/`?t:`${e}${t}`}function n(e,t){if(e===`/`)return t;if(!t.startsWith(e))throw Error(`Accessed out-of-scope path "${t}"`);return t=t.slice(e.length),t===``?`/`:t}function r(e,t){return Object.assign(t,{key:n(e,t.key)})}function i(e,t){return t.map(t=>r(e,t)).filter(e=>e.key!==`/`)}var a=class{original;prefix;constructor(e,t){this.original=e,this.prefix=t}getUid(){return`${this.original.getUid()}~${this.prefix}`}read(e,n){return this.original.read(t(this.prefix,e),n)}readStream(e,n){return this.original.readStream(t(this.prefix,e),n)}write(e,n,r){return this.original.write(t(this.prefix,e),n,r)}writeStream(e,n,r){return this.original.writeStream(t(this.prefix,e),n,r)}delete(e){return this.original.delete(t(this.prefix,e))}move(e,n){return this.original.move(t(this.prefix,e),t(this.prefix,n))}mkdir(e,n){return this.original.mkdir(t(this.prefix,e),n)}async stat(e){let n=await this.original.stat(t(this.prefix,e));return r(this.prefix,n)}exists(e){return this.original.exists(t(this.prefix,e))}async list(e,r){let a=await this.original.list(t(this.prefix,e),e=>r(Object.assign(e,{current:n(this.prefix,e.current)})));return i(this.prefix,a)}};function o(t,n){return new a(t,e(n))}export{o as default};
1
+ import{normalizeBaseDir as e}from"./shared/src/path.js";function t(e,t){return t===`/`?e:e===`/`?t:`${e}${t}`}function n(e,t){if(e===`/`)return t;if(!t.startsWith(e))throw Error(`Accessed out-of-scope path "${t}"`);return t=t.slice(e.length),t===``?`/`:t}function r(e,t){return Object.assign(t,{key:n(e,t.key)})}function i(e,t){return t.map(t=>r(e,t)).filter(e=>e.key!==`/`)}var a=class{original;prefix;constructor(e,t){this.original=e,this.prefix=t}getUid(){return`${this.original.getUid()}~${this.prefix}`}read(e,n){return this.original.read(t(this.prefix,e),n)}readStream(e,n){return this.original.readStream(t(this.prefix,e),n)}write(e,n,r){return this.original.write(t(this.prefix,e),n,r)}writeStream(e,n,r){return this.original.writeStream(t(this.prefix,e),n,r)}delete(e){return this.original.delete(t(this.prefix,e))}move(e,n){return this.original.move(t(this.prefix,e),t(this.prefix,n))}mkdir(e,n){return this.original.mkdir(t(this.prefix,e),n)}async stat(e){let n=await this.original.stat(t(this.prefix,e));return r(this.prefix,n)}exists(e){return this.original.exists(t(this.prefix,e))}async list(e,r){let a=await this.original.list(t(this.prefix,e),e=>r(Object.assign(e,{current:n(this.prefix,e.current)})));return i(this.prefix,a)}};function o(t,n){return new a(t,e(n))}export{o as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hesprs/sync-engine-sdk",
3
- "version": "3.1.8",
3
+ "version": "3.2.0",
4
4
  "description": "Official SDK for developing modules targeting Sync Engine, the extensible Obsidian syncing plugin.",
5
5
  "keywords": [
6
6
  "obsidian-plugin",
@@ -1 +0,0 @@
1
- function e(e,n){let{equals:r=(e,t)=>e===t}=n??{},i=e,a=/* @__PURE__ */ new Set,o=(e=>{if(e===void 0)return t?.(o),i;if(r(e,i))return;let n=i;i=e;for(let t of[...a])if(t(e,n)===`stop`)break});return o.subscribe=(e,t)=>(a.add(e),t?.immediate&&e(i,i),()=>o.unsubscribe(e)),o.clear=a.clear.bind(a),o.unsubscribe=e=>a.delete(e),o}let t;export{e as ref};
@@ -1 +0,0 @@
1
- import{ref as e}from"../../../../node_modules/.bun/synthkernel@._synthkernel.tgz/node_modules/synthkernel/dist/reactive.js";import t from"./render-progress.js";import n from"../utils/round-percent.js";import r from"../utils/to-error-message.js";import{Modal as i,Notice as a,Setting as o}from"obsidian";var s=class extends i{ctx;options;cleanupCallbacks=[];completed=e(0);current=e(``);constructor(e,t){super(e.app),this.ctx=e,this.options=t,this.contentEl.addClass(`markdown-rendered`),this.setTitle(e.translate(`remoteMigration`))}onOpen(){let{contentEl:e,options:{content:t,apply:n}}=this,{translate:r}=this.ctx;e.empty(),typeof t==`string`?e.createEl(`p`,{cls:`whitespace-pre-wrap`,text:t}):e.append(t),e.createEl(`p`,{cls:`whitespace-pre-wrap`,text:r(`migrationDescription`)}),new o(e).addButton(e=>e.setButtonText(r(`cancel`)).onClick(this.close.bind(this))).addButton(e=>e.setButtonText(r(`toggleWithoutMigration`)).onClick(async()=>{await n(),this.close()})).addButton(e=>e.setButtonText(r(`startMigration`)).setCta().onClick(this.handleMigration))}handleMigration=()=>{let{current:e,completed:r,ctx:i,cleanupCallbacks:a,contentEl:s,migrate:c}=this,{translate:l,dispatch:u}=i;s.empty(),this.setTitle(l(`migrationProcess`));let{left:d,right:f,bar:p}=t(s,`mb-3`),m,h=e=>{m?.remove(),m=new o(s).addButton(t=>t.setButtonText(l(e)).onClick(()=>this.close())).settingEl};h(`hide`),a.push(r.subscribe(e=>{f.setText(`${e}/3 ${l(`completed`)}`),p.setValue(n(e,3))}),e.subscribe(e=>d.setText(e))),c().then(e=>{h(`done`),e.success||(u(`errorGeneral`,`Migration failed.`),d.setText(l(`migrationFailed`)))})};migrate=async()=>{let{current:e,completed:t,ctx:n}=this,{dispatch:i,requestSync:o,initializeSync:s,translate:c,memoryDB:l}=n,u=(e,t)=>{if(e.result===`failed`)return{reason:`Phase ${t}: ${e.error}`,success:!1};if(e.result===`cancelled`)return{reason:`Phase ${t}: sync cancelled`,success:!1}};i(`logGeneral`,`Migration started.`),t(0),e(c(`migrationPhase1Description`));let d=u(await o(`nonInteractiveManual`),1);if(d)return d;t(1),e(c(`migrationPhase2Description`));try{let{record:e,remoteFs:t}=s();await Promise.all([e.clear(),this.options.apply(),...l.getStore(`remoteContext20000`).keys().sort((e,t)=>t.length-e.length).map(e=>t.delete(e))])}catch(e){let t=r(e);return new a(`${c(`migrationFailed`)}: ${t}`),{reason:`Phase 2: ${t}`,success:!1}}return t(2),e(c(`migrationPhase3Description`)),u(await o(`migration`),3)||(t(3),e(c(`completed`)),{success:!0})};onClose(){this.cleanupCallbacks.splice(0).forEach(e=>e()),this.contentEl.empty()}};function c(e,{toggle:t,needMigration:n,content:r,apply:i}){let a=!1;t.onChange(o=>{if(a){a=!1;return}let c=async n=>{n?(a=!0,t.setValue(!o),new s(e,{apply:async()=>{await i(o),a=!0,t.setValue(o)},content:r(o)}).open()):await i(o)},l=n?.(o)??!0;l instanceof Promise?l.then(c):c(l)})}export{c as default};
@@ -1 +0,0 @@
1
- import{ProgressBarComponent as e}from"obsidian";function t(t,n){let r=t.createDiv(`flex flex-col gap-2 ${n??``}`),i=r.createDiv(`flex flex-row text-3 text-[--text-muted] whitespace-nowrap`),a=i.createDiv(`truncate mr-auto`),o=i.createDiv(`ml-2`);return{bar:new e(r),left:a,right:o}}export{t as default};
@@ -1 +0,0 @@
1
- import{getStatus as e}from"../../../shared/src/get-status.js";import{STREAM_RESERVATION_SIZE as t}from"../fs/wrappers/memory-control.js";import{Platform as n}from"obsidian";function r(){let e=5*1024**2;`deviceMemory`in navigator&&typeof navigator.deviceMemory==`number`?navigator.deviceMemory<=4&&(e/=2):navigator.hardwareConcurrency<=4&&(e/=2),n.isAndroidApp&&(e/=2);let r=e*.8;return{chunkSize:r,concurrency:Math.floor(t/r),streamThreshold:e}}const{chunkSize:i,concurrency:a,streamThreshold:o}=r();async function s({from:e,to:t,stat:n,key:r}){let i=await c(e,r,n);if(i)return l(t,r,i,n)}async function c(e,t,n){try{return n.size>o?await e.readStream(t,n):await e.read(t,n)}catch(e){if(u(e))return;throw e}}function l(e,t,n,r){return n instanceof ReadableStream?e.writeStream(t,n,r):e.write(t,n,r)}function u(t){return e(t)===404||(t.message??String(t)).toLocaleUpperCase().includes(`ENOENT`)}export{i as chunkSize,a as concurrency,s as pipe,c as readWithSize,l as writeWithValue};
@@ -1 +0,0 @@
1
- function e(e,t){return Math.round(e/(t||1)*1e4)/100}export{e as default};
@@ -1 +0,0 @@
1
- function e(e){return e instanceof Error?e.message:String(e)}export{e as default};
@@ -1 +0,0 @@
1
- import{taskMap as e}from"../src/sync/decision/interface.js";const t=new TextEncoder;function n(e){return t.encode(e)}function r(e,t={}){let{mtime:n=1,size:r=5,uid:i=`${e}-uid`}=t;return{isDir:!1,key:e,mtime:n,size:r,uid:i}}function i(e){return{isDir:!0,key:e}}function a(e,t){return{isDir:!1,local:e,remote:t}}function o(){return{isDir:!0}}function s(t,n){let r=n.localStats??/* @__PURE__ */ new Map,i=n.remoteStats??/* @__PURE__ */ new Map,a=n.records??/* @__PURE__ */ new Map,o=[];return t({localStats:r,logger:()=>{},records:a,remoteStats:i,taskFactory:((t,n)=>{let r=e[t],i=new r({...n,localFs:{},record:{},remoteFs:{}});return i.name=t,i.prettyName=t,o.push({key:n.key,name:t,...n.local!==void 0&&{local:n.local},...n.remote!==void 0&&{remote:n.remote}}),i})}),o}function c(e){return e.map(e=>e.name)}function l(e){return e.map(e=>e.key)}function u(e,t){let n=e.filter(e=>e.key===t);if(n.length!==1)throw Error(`Expected one task for ${t}, found ${n.length}.`);return n[0]}function d(e){return e===`/`||e.endsWith(`/`)?i(e):r(e,{mtime:10,size:5,uid:`uid`})}function f(e=[]){return new ReadableStream({start(t){for(let r of e)t.enqueue(typeof r==`string`?n(r):r);t.close()}})}function p(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),reject:t,resolve:e}}async function m(e=4){for(let t=0;t<e;t+=1)await new Promise(e=>{queueMicrotask(e)})}function h(){return{delete:[],exists:[],list:[],mkdir:[],move:[],read:[],readStream:[],stat:[],write:[],writeStream:[]}}function g(e={}){return{delete:()=>{},exists:()=>!1,getUid:()=>`FsControl`,list:e=>[d(e),i(`${e}folder/`),r(`${e}folder/note.md`,{mtime:12,size:7,uid:`note-2`})],mkdir:()=>{},move:()=>{},read:()=>n(``),readStream:()=>f(),stat:e=>d(e),write:()=>`write-uid`,writeStream:()=>`stream-uid`,...e}}function _(e){let t=[];return{calls:t,request:n=>(t.push(n),e(n))}}function v(e={}){let t=h(),n=g(e.control),r=e.uid??`uid`;return{calls:t,control:n,fs:{delete:e=>(t.delete.push(e),n.delete(e)),exists:e=>(t.exists.push(e),n.exists(e)),getUid:()=>r,list:(e,r)=>(t.list.push(e),n.list(e,r)),mkdir:(e,r)=>(t.mkdir.push(e),n.mkdir(e,r)),move:(e,r)=>(t.move.push([e,r]),n.move(e,r)),read:(e,r)=>(t.read.push([e,r]),n.read(e,r)),readStream:(e,r)=>(t.readStream.push([e,r]),n.readStream(e,r)),stat:e=>(t.stat.push(e),n.stat(e)),write:(e,r,i)=>(t.write.push([e,r,i]),n.write(e,r,i)),writeStream:(e,r,i)=>(t.writeStream.push([e,i]),n.writeStream(e,r,i))}}}const y={bytes:n,deferred:p,file:r,fileRecord:a,findTask:u,flush:m,folder:i,folderRecord:o,fs:v,request:_,runDecider:s,stream:f,taskKeys:l,taskNames:c};export{y as default};
File without changes