@absolutejs/sync 1.12.3 → 1.14.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.
package/dist/testing.js CHANGED
@@ -707,8 +707,14 @@ var createSyncEngine = (options = {}) => {
707
707
  const active = new Map;
708
708
  const tableIndex = new Map;
709
709
  const changeLogSize = options.changeLogSize ?? 1024;
710
+ const changeLogRetainMs = options.changeLogRetainMs ?? null;
710
711
  const changeLog = [];
711
712
  let version = 0;
713
+ const engineStartedAt = Date.now();
714
+ let mutationsCompleted = 0;
715
+ let mutationsFailed = 0;
716
+ let mutationsRetried = 0;
717
+ let mutationsInFlight = 0;
712
718
  const reactiveCacheMax = options.reactiveCache?.max ?? 256;
713
719
  const reactiveCacheTtlMs = options.reactiveCache?.ttlMs ?? 60000;
714
720
  const cachedReruns = new Map;
@@ -1119,6 +1125,12 @@ var createSyncEngine = (options = {}) => {
1119
1125
  if (changeLog.length > changeLogSize) {
1120
1126
  changeLog.shift();
1121
1127
  }
1128
+ if (changeLogRetainMs !== null && changeLogRetainMs > 0) {
1129
+ const cutoff = entry.at - changeLogRetainMs;
1130
+ while (changeLog.length > 0 && changeLog[0].at < cutoff) {
1131
+ changeLog.shift();
1132
+ }
1133
+ }
1122
1134
  for (const subscriber of streamSubscribers) {
1123
1135
  subscriber(entry);
1124
1136
  }
@@ -1126,10 +1138,11 @@ var createSyncEngine = (options = {}) => {
1126
1138
  const applyChange = async (table, change, shouldBroadcast = true) => {
1127
1139
  version += 1;
1128
1140
  const changeVersion = version;
1129
- logChange(changeVersion, { version: changeVersion, table, change });
1141
+ const at = Date.now();
1142
+ logChange(changeVersion, { version: changeVersion, table, change, at });
1130
1143
  emitActivity({
1131
1144
  type: "change",
1132
- at: Date.now(),
1145
+ at,
1133
1146
  table,
1134
1147
  op: change.op,
1135
1148
  version: changeVersion
@@ -1160,11 +1173,12 @@ var createSyncEngine = (options = {}) => {
1160
1173
  const batchVersion = version;
1161
1174
  const perSubscription = new Map;
1162
1175
  const reactiveChanges = [];
1176
+ const batchAt = Date.now();
1163
1177
  for (const { table, change } of changes) {
1164
- logChange(batchVersion, { version: batchVersion, table, change });
1178
+ logChange(batchVersion, { version: batchVersion, table, change, at: batchAt });
1165
1179
  emitActivity({
1166
1180
  type: "change",
1167
- at: Date.now(),
1181
+ at: batchAt,
1168
1182
  table,
1169
1183
  op: change.op,
1170
1184
  version: batchVersion
@@ -1615,53 +1629,61 @@ var createSyncEngine = (options = {}) => {
1615
1629
  const startedAt = Date.now();
1616
1630
  let lastError;
1617
1631
  let attemptsMade = 0;
1618
- for (let attempt = 1;attempt <= maxAttempts; attempt++) {
1619
- attemptsMade = attempt;
1620
- try {
1621
- const { buffered, result } = runInTransaction !== undefined ? await runInTransaction((tx) => runHandler(tx)) : await runHandler(undefined);
1622
- await applyChangeBatch(buffered);
1623
- emitActivity({
1624
- type: "mutation",
1625
- at: Date.now(),
1626
- name,
1627
- status: "ok"
1628
- });
1629
- return result;
1630
- } catch (error) {
1631
- lastError = error;
1632
- const elapsedMs = Date.now() - startedAt;
1633
- const canRetry = attempt < maxAttempts && isRetryable(error) && elapsedMs < maxElapsedMs;
1634
- if (!canRetry)
1635
- break;
1636
- const rawDelay = computeDelay(attempt);
1637
- const remaining = maxElapsedMs - elapsedMs;
1638
- if (remaining <= 0)
1639
- break;
1640
- const delayMs = Math.max(0, Math.min(rawDelay, remaining));
1641
- emitActivity({
1642
- type: "mutationRetry",
1643
- at: Date.now(),
1644
- name,
1645
- attempt,
1646
- delayMs,
1647
- errorName: error instanceof Error ? error.name : "Error",
1648
- errorMessage: error instanceof Error ? error.message : String(error)
1649
- });
1650
- if (delayMs > 0) {
1651
- await new Promise((resolve) => setTimeout(resolve, delayMs));
1632
+ mutationsInFlight += 1;
1633
+ try {
1634
+ for (let attempt = 1;attempt <= maxAttempts; attempt++) {
1635
+ attemptsMade = attempt;
1636
+ try {
1637
+ const { buffered, result } = runInTransaction !== undefined ? await runInTransaction((tx) => runHandler(tx)) : await runHandler(undefined);
1638
+ await applyChangeBatch(buffered);
1639
+ mutationsCompleted += 1;
1640
+ emitActivity({
1641
+ type: "mutation",
1642
+ at: Date.now(),
1643
+ name,
1644
+ status: "ok"
1645
+ });
1646
+ return result;
1647
+ } catch (error) {
1648
+ lastError = error;
1649
+ const elapsedMs = Date.now() - startedAt;
1650
+ const canRetry = attempt < maxAttempts && isRetryable(error) && elapsedMs < maxElapsedMs;
1651
+ if (!canRetry)
1652
+ break;
1653
+ mutationsRetried += 1;
1654
+ const rawDelay = computeDelay(attempt);
1655
+ const remaining = maxElapsedMs - elapsedMs;
1656
+ if (remaining <= 0)
1657
+ break;
1658
+ const delayMs = Math.max(0, Math.min(rawDelay, remaining));
1659
+ emitActivity({
1660
+ type: "mutationRetry",
1661
+ at: Date.now(),
1662
+ name,
1663
+ attempt,
1664
+ delayMs,
1665
+ errorName: error instanceof Error ? error.name : "Error",
1666
+ errorMessage: error instanceof Error ? error.message : String(error)
1667
+ });
1668
+ if (delayMs > 0) {
1669
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
1670
+ }
1652
1671
  }
1653
1672
  }
1673
+ mutationsFailed += 1;
1674
+ emitActivity({
1675
+ type: "mutation",
1676
+ at: Date.now(),
1677
+ name,
1678
+ status: "error"
1679
+ });
1680
+ if (attemptsMade > 1) {
1681
+ throw new RetriesExhaustedError(attemptsMade, Date.now() - startedAt, lastError);
1682
+ }
1683
+ throw lastError;
1684
+ } finally {
1685
+ mutationsInFlight -= 1;
1654
1686
  }
1655
- emitActivity({
1656
- type: "mutation",
1657
- at: Date.now(),
1658
- name,
1659
- status: "error"
1660
- });
1661
- if (attemptsMade > 1) {
1662
- throw new RetriesExhaustedError(attemptsMade, Date.now() - startedAt, lastError);
1663
- }
1664
- throw lastError;
1665
1687
  },
1666
1688
  runMutations: async (specs, ctx) => {
1667
1689
  if (specs.length === 0)
@@ -1900,6 +1922,45 @@ var createSyncEngine = (options = {}) => {
1900
1922
  }))
1901
1923
  };
1902
1924
  },
1925
+ metrics: () => {
1926
+ const now = Date.now();
1927
+ const byCollection = {};
1928
+ let totalSubscriptions = 0;
1929
+ for (const [name, subs] of active) {
1930
+ byCollection[name] = subs.size;
1931
+ totalSubscriptions += subs.size;
1932
+ }
1933
+ const oldest = changeLog[0];
1934
+ return {
1935
+ at: now,
1936
+ changeLog: {
1937
+ capacity: changeLogSize,
1938
+ entries: changeLog.length,
1939
+ oldestAgeMs: oldest ? now - oldest.at : null,
1940
+ oldestVersion: oldest ? oldest.version : null,
1941
+ retainMs: changeLogRetainMs
1942
+ },
1943
+ mutations: {
1944
+ completed: mutationsCompleted,
1945
+ failed: mutationsFailed,
1946
+ inFlight: mutationsInFlight,
1947
+ retried: mutationsRetried
1948
+ },
1949
+ reactiveCache: {
1950
+ capacity: reactiveCacheMax,
1951
+ entries: cachedReruns.size
1952
+ },
1953
+ schedules: {
1954
+ registered: schedules.size
1955
+ },
1956
+ subscriptions: {
1957
+ byCollection,
1958
+ total: totalSubscriptions
1959
+ },
1960
+ uptimeMs: now - engineStartedAt,
1961
+ version
1962
+ };
1963
+ },
1903
1964
  onActivity: (listener) => {
1904
1965
  activityListeners.add(listener);
1905
1966
  return () => {
@@ -2003,5 +2064,5 @@ export {
2003
2064
  createTestEngine
2004
2065
  };
2005
2066
 
2006
- //# debugId=E33DC349D71B8BBE64756E2164756E21
2067
+ //# debugId=A0641EBADF80223264756E2164756E21
2007
2068
  //# sourceMappingURL=testing.js.map