@absolutejs/sync 1.12.2 → 1.13.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/engine/devtools.d.ts +53 -0
- package/dist/engine/index.d.ts +1 -1
- package/dist/engine/index.js +110 -49
- package/dist/engine/index.js.map +3 -3
- package/dist/engine/syncEngine.d.ts +28 -1
- package/dist/index.js +110 -49
- package/dist/index.js.map +3 -3
- package/dist/testing.js +110 -49
- package/dist/testing.js.map +3 -3
- package/package.json +1 -1
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
|
-
|
|
1141
|
+
const at = Date.now();
|
|
1142
|
+
logChange(changeVersion, { version: changeVersion, table, change, at });
|
|
1130
1143
|
emitActivity({
|
|
1131
1144
|
type: "change",
|
|
1132
|
-
at
|
|
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:
|
|
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
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
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=
|
|
2067
|
+
//# debugId=A0641EBADF80223264756E2164756E21
|
|
2007
2068
|
//# sourceMappingURL=testing.js.map
|