@balena/open-balena-api 52.0.3 → 52.0.4
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.
|
@@ -5,6 +5,9 @@ import { version } from "../../lib/config.js";
|
|
|
5
5
|
import { getRedisOptions } from "../redis/config.js";
|
|
6
6
|
const DEFAULT_LOCAL_MAX = 500;
|
|
7
7
|
const DEFAULT_LOCAL_TTL = Infinity;
|
|
8
|
+
// The largest Smi on builds with 31 bit Smis, eg with pointer compression, which is used as the expiry of entries without
|
|
9
|
+
// a ttl so that the expiries of all entries can stay Smis
|
|
10
|
+
const NO_EXPIRY = 2 ** 30 - 1;
|
|
8
11
|
const usedCacheKeys = new Set();
|
|
9
12
|
// All stores share a single connection rather than one each, which also lets node-redis pipeline commands across all
|
|
10
13
|
// of them. We create it here rather than using `infra/redis` because importing that also imports pinejs, and this
|
|
@@ -33,6 +36,17 @@ const getSharedRedis = () => {
|
|
|
33
36
|
sharedRedis ??= createSharedRedis();
|
|
34
37
|
return sharedRedis;
|
|
35
38
|
};
|
|
39
|
+
/**
|
|
40
|
+
* Whole seconds since the process started, which stays a Smi so that storing it per entry does not need a HeapNumber
|
|
41
|
+
* like a millisecond timestamp would. A timer updates it twice a second because reading the clock was a large part of
|
|
42
|
+
* the cost of a local hit, and it reads the clock rather than counting ticks because timers run late, which would add up
|
|
43
|
+
* and make entries outlive their ttl by more the longer the ttl
|
|
44
|
+
*/
|
|
45
|
+
const readNowSeconds = () => Math.floor(process.uptime());
|
|
46
|
+
let nowSeconds = readNowSeconds();
|
|
47
|
+
setInterval(() => {
|
|
48
|
+
nowSeconds = readNowSeconds();
|
|
49
|
+
}, 500).unref();
|
|
36
50
|
/**
|
|
37
51
|
* A plain Map LRU with a ttl, which avoids the cost of generic machinery on such a hot path. Maps iterate in insertion
|
|
38
52
|
* order, so re-inserting on every hit keeps the least recently used entry first
|
|
@@ -40,10 +54,11 @@ const getSharedRedis = () => {
|
|
|
40
54
|
class LocalCache {
|
|
41
55
|
entries = new Map();
|
|
42
56
|
max;
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
ttl;
|
|
58
|
+
/** @param ttl In whole seconds, or `Infinity` for no expiry */
|
|
59
|
+
constructor(max, ttl) {
|
|
45
60
|
this.max = max;
|
|
46
|
-
this.
|
|
61
|
+
this.ttl = ttl;
|
|
47
62
|
}
|
|
48
63
|
get(key) {
|
|
49
64
|
const entry = this.entries.get(key);
|
|
@@ -51,7 +66,9 @@ class LocalCache {
|
|
|
51
66
|
return;
|
|
52
67
|
}
|
|
53
68
|
this.entries.delete(key);
|
|
54
|
-
|
|
69
|
+
// Expiring only once the current second is past `expiresAt` means entries live for at least their ttl, less the half
|
|
70
|
+
// a second that `nowSeconds` can lag behind the clock
|
|
71
|
+
if (entry.expiresAt < nowSeconds) {
|
|
55
72
|
return;
|
|
56
73
|
}
|
|
57
74
|
this.entries.set(key, entry);
|
|
@@ -62,7 +79,10 @@ class LocalCache {
|
|
|
62
79
|
if (this.entries.size >= this.max) {
|
|
63
80
|
this.entries.delete(this.entries.keys().next().value);
|
|
64
81
|
}
|
|
65
|
-
this.entries.set(key, {
|
|
82
|
+
this.entries.set(key, {
|
|
83
|
+
value,
|
|
84
|
+
expiresAt: this.ttl === Infinity ? NO_EXPIRY : nowSeconds + this.ttl,
|
|
85
|
+
});
|
|
66
86
|
}
|
|
67
87
|
delete(key) {
|
|
68
88
|
this.entries.delete(key);
|
|
@@ -82,8 +102,9 @@ export function createMultiLevelStore(cacheKey, opts) {
|
|
|
82
102
|
let localCache;
|
|
83
103
|
if (local !== false) {
|
|
84
104
|
const { max, ttl } = { ...baseOpts, ...local };
|
|
85
|
-
// A max of 0 uses the default, as does a ttl of 0 for no expiry, the same as cache-manager's memory store
|
|
86
|
-
|
|
105
|
+
// A max of 0 uses the default, as does a ttl of 0 for no expiry, the same as cache-manager's memory store. The local
|
|
106
|
+
// expiry is only tracked to the second, so a fractional ttl is rounded up
|
|
107
|
+
localCache = new LocalCache(max == null || max === 0 ? DEFAULT_LOCAL_MAX : max, ttl ? Math.ceil(ttl) : DEFAULT_LOCAL_TTL);
|
|
87
108
|
}
|
|
88
109
|
const { ttl: sharedTtl, refreshThreshold } = { ...baseOpts, ...global };
|
|
89
110
|
// redis cannot cache undefined/null values whilst others can, so we explicitly mark those as uncacheable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-level-store.js","sourceRoot":"","sources":["../../../src/infra/cache/multi-level-store.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AACvB,OAAO,KAAK,SAAS,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,iBAAiB,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"multi-level-store.js","sourceRoot":"","sources":["../../../src/infra/cache/multi-level-store.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AACvB,OAAO,KAAK,SAAS,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AACnC,0HAA0H;AAC1H,0DAA0D;AAC1D,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAE9B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;AAcxC,qHAAqH;AACrH,kHAAkH;AAClH,yGAAyG;AACzG,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC9B,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,IAAI,WAAW,CAAC;IAChB,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC9B,WAAW,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAU,EAAE,EAAE;QAC1C,uEAAuE;QACvE,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;IAChB,wCAAwC;IACxC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC,wGAAwG;IACxG,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,WAAW,CAAC;AACpB,CAAC,CAAC;AACF,IAAI,WAA6D,CAAC;AAClE,MAAM,cAAc,GAAG,GAAG,EAAE;IAC3B,WAAW,KAAK,iBAAiB,EAAE,CAAC;IACpC,OAAO,WAAW,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;AAClC,WAAW,CAAC,GAAG,EAAE;IAChB,UAAU,GAAG,cAAc,EAAE,CAAC;AAC/B,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;AAEhB;;;GAGG;AACH,MAAM,UAAU;IACP,OAAO,GAAG,IAAI,GAAG,EAA2C,CAAC;IAC7D,GAAG,CAAC;IACJ,GAAG,CAAC;IACZ,+DAA+D;IAC/D,YAAY,GAAW,EAAE,GAAW;QACnC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAEM,GAAG,CAAC,GAAW;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,qHAAqH;QACrH,sDAAsD;QACtD,IAAI,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;YAClC,OAAO;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,KAAQ;QAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACrB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG;SACpE,CAAC,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,GAAW;QACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACpC,QAAgB,EAChB,IAgBC;IAOD,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,0BAA0B,CAAC,CAAC;IACnE,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC9D,MAAM,EAAE,gBAAgB,EAAE,GAAG,QAAQ,CAAC;IACtC,IAAI,UAAqC,CAAC;IAC1C,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;QAC/C,qHAAqH;QACrH,0EAA0E;QAC1E,UAAU,GAAG,IAAI,UAAU,CAC1B,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAClD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CACxC,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IACxE,yGAAyG;IACzG,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAc,EAAE,CACxD,KAAK,IAAI,IAAI;QACb,CAAC,gBAAgB,IAAI,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,uHAAuH;IACvH,wGAAwG;IACxG,IAAI,SAAiB,CAAC;IACtB,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;QACpC,uHAAuH;QACvH,uHAAuH;QACvH,8DAA8D;QAC9D,SAAS,KAAK,SAAS,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,GAAG,CAAC;QAChE,OAAO,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO;QACR,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACR,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,GAAW,EAAE,KAAQ,EAAE,EAAE;QAC9C,UAAU,EAAE,GAAG,CACd,GAAG,EACH,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CACxE,CAAC;QACF,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC;YACpD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,SAAS,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE;oBAChC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;iBAC5C,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAwB,EAAQ,EAAE;QAC3E,IAAI,CAAC,gBAAgB,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO;QACR,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/C,IAAI,gBAAgB,GAAG,GAAG,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;oBACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACzB,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC1B,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,+EAA+E;YAChF,CAAC;oBAAS,CAAC;gBACV,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;IACN,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EACxB,GAAW,EACX,EAAwB,EACX,EAAE;QACf,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IACF,0DAA0D;IAC1D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;IAErD,OAAO;QACN,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAClB,MAAM,UAAU,GAAG,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,UAAU,CAAC;YACnB,CAAC;YACD,qFAAqF;YACrF,OAAO,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;QACtC,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACzB,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;YACvB,MAAM,UAAU,GAAG,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,UAAU,CAAC;YACnB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACpB,mBAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7B,sFAAsF;gBACtF,UAAU,EAAE,GAAG,CACd,GAAG,EACH,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;oBAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;oBACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CACf,CAAC;gBACF,OAAO,MAAM,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,IAAI,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACrB,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC3C,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBACH,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,MAAM,OAAO,CAAC;QACtB,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/open-balena-api",
|
|
3
3
|
"description": "Internet of things, Made Simple",
|
|
4
|
-
"version": "52.0.
|
|
4
|
+
"version": "52.0.4",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -175,6 +175,6 @@
|
|
|
175
175
|
"_": "index.js"
|
|
176
176
|
},
|
|
177
177
|
"versionist": {
|
|
178
|
-
"publishedAt": "2026-11-
|
|
178
|
+
"publishedAt": "2026-11-02T04:08:13.391Z"
|
|
179
179
|
}
|
|
180
180
|
}
|