@vrtmrz/livesync-commonlib 0.1.32 → 0.1.34

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.
@@ -0,0 +1,21 @@
1
+ import type { DocumentID, EntryLeaf } from "../common/types.js";
2
+ type MissingChunkAction = {
3
+ kind: "missing";
4
+ } | {
5
+ kind: "retry";
6
+ missingResponses: number;
7
+ delayMs: number;
8
+ };
9
+ export declare function decideMissingChunkAction({ missingResponses, finiteReplicationActive, completedDuringRequest, }: {
10
+ missingResponses: number;
11
+ finiteReplicationActive: boolean;
12
+ completedDuringRequest: boolean;
13
+ }): MissingChunkAction;
14
+ export type FetchedChunkClassification = {
15
+ chunks: EntryLeaf[];
16
+ invalidChunks: unknown[];
17
+ missingIds: DocumentID[];
18
+ invalidIds: DocumentID[];
19
+ };
20
+ export declare function classifyFetchedChunks(requestedIds: readonly DocumentID[], fetched: readonly unknown[]): FetchedChunkClassification;
21
+ export {};
@@ -0,0 +1,43 @@
1
+ const REMOTE_MISSING_RETRY_STEP_MS = 2e3;
2
+ const REMOTE_MISSING_RETRY_MAX_DELAY_MS = 1e4;
3
+ function decideMissingChunkAction({
4
+ missingResponses,
5
+ finiteReplicationActive,
6
+ completedDuringRequest
7
+ }) {
8
+ if (missingResponses > 0 && !finiteReplicationActive && !completedDuringRequest) {
9
+ return { kind: "missing" };
10
+ }
11
+ const nextMissingResponses = missingResponses + 1;
12
+ return {
13
+ kind: "retry",
14
+ missingResponses: nextMissingResponses,
15
+ delayMs: completedDuringRequest ? 0 : Math.min(nextMissingResponses * REMOTE_MISSING_RETRY_STEP_MS, REMOTE_MISSING_RETRY_MAX_DELAY_MS)
16
+ };
17
+ }
18
+ function isValidChunk(chunk) {
19
+ const candidate = chunk;
20
+ return !!candidate && typeof candidate._id === "string" && typeof candidate.data === "string";
21
+ }
22
+ function classifyFetchedChunks(requestedIds, fetched) {
23
+ const chunks = [];
24
+ const invalidChunks = [];
25
+ const observedIds = /* @__PURE__ */ new Set();
26
+ for (const chunk of fetched) {
27
+ const candidate = chunk;
28
+ if (typeof candidate?._id === "string") observedIds.add(candidate._id);
29
+ if (isValidChunk(chunk)) chunks.push(chunk);
30
+ else invalidChunks.push(chunk);
31
+ }
32
+ const validIds = new Set(chunks.map((chunk) => chunk._id));
33
+ return {
34
+ chunks,
35
+ invalidChunks,
36
+ missingIds: requestedIds.filter((id) => !observedIds.has(id)),
37
+ invalidIds: requestedIds.filter((id) => observedIds.has(id) && !validIds.has(id))
38
+ };
39
+ }
40
+ export {
41
+ classifyFetchedChunks,
42
+ decideMissingChunkAction
43
+ };
@@ -10,6 +10,10 @@ export declare const lockStats: import("octagonal-wheels/dataobject/reactive_v2"
10
10
  count: number;
11
11
  }>;
12
12
  export declare const collectingChunks: import("octagonal-wheels/dataobject/reactive_v2").ReactiveSource<number>;
13
+ export declare const chunkFetchCounts: import("octagonal-wheels/dataobject/reactive_v2").ReactiveSource<{
14
+ initial: number;
15
+ retrying: number;
16
+ }>;
13
17
  export declare const pluginScanningCount: import("octagonal-wheels/dataobject/reactive_v2").ReactiveSource<number>;
14
18
  export declare const hiddenFilesProcessingCount: import("octagonal-wheels/dataobject/reactive_v2").ReactiveSource<number>;
15
19
  export declare const hiddenFilesEventCount: import("octagonal-wheels/dataobject/reactive_v2").ReactiveSource<number>;
@@ -1,11 +1,13 @@
1
1
  import { reactiveSource } from "octagonal-wheels/dataobject/reactive";
2
2
  const lockStats = reactiveSource({ pending: [], running: [], count: 0 });
3
3
  const collectingChunks = reactiveSource(0);
4
+ const chunkFetchCounts = reactiveSource({ initial: 0, retrying: 0 });
4
5
  const pluginScanningCount = reactiveSource(0);
5
6
  const hiddenFilesProcessingCount = reactiveSource(0);
6
7
  const hiddenFilesEventCount = reactiveSource(0);
7
8
  const logMessages = reactiveSource([]);
8
9
  export {
10
+ chunkFetchCounts,
9
11
  collectingChunks,
10
12
  hiddenFilesEventCount,
11
13
  hiddenFilesProcessingCount,
@@ -4,7 +4,7 @@ export declare function createHostingDB(env: ReplicatorHostEnv): {
4
4
  info: () => Promise<PouchDB.Core.DatabaseInfo>;
5
5
  changes: (options: PouchDB.Core.ChangesOptions) => PouchDB.Core.Changes<EntryDoc>;
6
6
  revsDiff: (diff: PouchDB.Core.RevisionDiffOptions) => Promise<PouchDB.Core.RevisionDiffResponse>;
7
- bulkDocs: (docs: PouchDB.Core.PutDocument<EntryDoc & Record<string, unknown>>[], options?: PouchDB.Core.BulkDocsOptions) => Promise<(PouchDB.Core.Response | PouchDB.Core.Error)[]>;
7
+ bulkDocs: (docs: PouchDB.Core.PutDocument<EntryDoc & Record<string, unknown>>[], options?: PouchDB.Core.BulkDocsOptions) => Promise<(PouchDB.Core.Error | PouchDB.Core.Response)[]>;
8
8
  bulkGet: (options: PouchDB.Core.BulkGetOptions) => Promise<PouchDB.Core.BulkGetResponse<EntryDoc>>;
9
9
  put: (doc: PouchDB.Core.PutDocument<EntryDoc & Record<string, unknown>>, options?: PouchDB.Core.PutOptions) => Promise<PouchDB.Core.Response>;
10
10
  get: (id: string, options?: PouchDB.Core.GetOptions) => Promise<EntryDoc & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta>;