@nxtedition/lib 22.1.4 → 23.0.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/app.js CHANGED
@@ -34,6 +34,7 @@ import { monitorEventLoopDelay } from 'node:perf_hooks'
34
34
  import { LRUCache } from 'lru-cache'
35
35
  import xuid from 'xuid'
36
36
  import undici from 'undici'
37
+ import { isTimeBetween } from './time.js'
37
38
 
38
39
  export function makeApp(appConfig, onTerminate) {
39
40
  let ds
@@ -76,6 +77,26 @@ export function makeApp(appConfig, onTerminate) {
76
77
  logger?.warn({ err }, 'warning')
77
78
  })
78
79
 
80
+ const dailyOffpeakTime = config.dailyOffpeakTime ?? '00:00-04:00'
81
+
82
+ if (dailyOffpeakTime) {
83
+ const [start, end] = dailyOffpeakTime.split('-')
84
+
85
+ let wasOffpeak = null
86
+
87
+ const offPeakInterval = setInterval(() => {
88
+ if (isTimeBetween(new Date(), start, end)) {
89
+ if (!wasOffpeak && global.gc) {
90
+ global.gc()
91
+ }
92
+ wasOffpeak = true
93
+ } else {
94
+ wasOffpeak = false
95
+ }
96
+ }, 60e3)
97
+ destroyers.unshift(() => clearInterval(offPeakInterval))
98
+ }
99
+
79
100
  const cleanAppConfig = ({
80
101
  status,
81
102
  stats,
package/couch.d.ts CHANGED
@@ -18,6 +18,7 @@ export interface CouchRequestOptions<Stream extends boolean = false> {
18
18
  endkey?: string
19
19
  update?: boolean
20
20
  }
21
+ seq?: string
21
22
  signal?: AbortSignal
22
23
  logger?: Logger
23
24
  stream?: Stream
package/errors.d.ts CHANGED
@@ -17,7 +17,9 @@ export interface NxtError {
17
17
  errors?: NxtError[] | null
18
18
  }
19
19
 
20
- export function serializeError(err: Error | string): NxtError[] | null
20
+ type SerializableError = null | undefined | Error | string | NxtError | SerializableError[]
21
+
22
+ export function serializeError(err: SerializableError): NxtError[] | null
21
23
 
22
24
  export type Message = {
23
25
  msg: string
package/http.js CHANGED
@@ -683,20 +683,3 @@ export async function retry(fn, options) {
683
683
  }
684
684
  }
685
685
  }
686
-
687
- export function parseHeaders(rawHeaders, obj = {}) {
688
- for (let i = 0; i < rawHeaders.length; i += 2) {
689
- const key = rawHeaders[i].toString().toLowerCase()
690
- let val = obj[key]
691
- if (!val) {
692
- obj[key] = rawHeaders[i + 1].toString()
693
- } else {
694
- if (!Array.isArray(val)) {
695
- val = [val]
696
- obj[key] = val
697
- }
698
- val.push(rawHeaders[i + 1].toString())
699
- }
700
- }
701
- return obj
702
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "22.1.4",
3
+ "version": "23.0.0",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "type": "module",
@@ -36,6 +36,7 @@
36
36
  "errors.js",
37
37
  "errors.d.ts",
38
38
  "worker.js",
39
+ "scheduler.js",
39
40
  "stream.js",
40
41
  "timeline.js",
41
42
  "docker-secrets.js"
@@ -58,10 +59,10 @@
58
59
  "singleQuote": true
59
60
  },
60
61
  "dependencies": {
61
- "@aws-sdk/client-s3": "^3.696.0",
62
+ "@aws-sdk/client-s3": "^3.723.0",
62
63
  "@elastic/elasticsearch": "^8.16.1",
63
64
  "@elastic/transport": "^8.9.1",
64
- "@nxtedition/nxt-undici": "^4.2.26",
65
+ "@nxtedition/nxt-undici": "^5.1.8",
65
66
  "@swc/wasm-web": "^1.10.1",
66
67
  "content-type": "^1.0.5",
67
68
  "date-fns": "^3.6.0",
@@ -72,42 +73,42 @@
72
73
  "koa-compose": "^4.1.0",
73
74
  "lodash": "^4.17.21",
74
75
  "lru-cache": "^11.0.2",
75
- "mime": "^4.0.4",
76
- "mitata": "^1.0.11",
76
+ "mime": "^4.0.6",
77
+ "mitata": "^1.0.26",
77
78
  "moment-timezone": "^0.5.46",
78
79
  "nconf": "^0.12.1",
79
80
  "nested-error-stacks": "^2.1.1",
80
81
  "object-hash": "^3.0.0",
81
82
  "p-queue": "^8.0.1",
82
- "pino": "^9.5.0",
83
+ "pino": "^9.6.0",
83
84
  "qs": "^6.13.1",
84
85
  "request-target": "^1.0.2",
85
86
  "smpte-timecode": "^1.3.6",
86
87
  "split-string": "^6.0.0",
87
- "undici": "^6.21.0",
88
+ "undici": "^7.2.0",
88
89
  "url-join": "^5.0.0",
89
90
  "xuid": "^4.1.3",
90
91
  "yocto-queue": "^1.1.1"
91
92
  },
92
93
  "devDependencies": {
93
94
  "@nxtedition/deepstream.io-client-js": ">=25.6.3",
94
- "@types/lodash": "^4.17.13",
95
- "@types/node": "^22.9.1",
95
+ "@types/lodash": "^4.17.14",
96
+ "@types/node": "^22.10.5",
96
97
  "eslint": "^9.15.0",
97
98
  "eslint-config-prettier": "^9.1.0",
98
99
  "eslint-config-standard": "^17.0.0",
99
100
  "eslint-plugin-import": "^2.31.0",
100
- "eslint-plugin-n": "^17.13.2",
101
+ "eslint-plugin-n": "^17.15.1",
101
102
  "eslint-plugin-node": "^11.1.0",
102
103
  "eslint-plugin-promise": "^7.2.1",
103
104
  "husky": "^9.1.7",
104
- "lint-staged": "^15.2.11",
105
+ "lint-staged": "^15.3.0",
105
106
  "pinst": "^3.0.0",
106
107
  "prettier": "^3.4.2",
107
108
  "rxjs": "^7.5.6",
108
109
  "send": "^0.18.0",
109
110
  "tap": "^21.0.1",
110
- "typescript-eslint": "^8.15.0"
111
+ "typescript-eslint": "^8.19.1"
111
112
  },
112
113
  "peerDependencies": {
113
114
  "@elastic/elasticsearch": "^8.6.0",
package/scheduler.js ADDED
@@ -0,0 +1,32 @@
1
+ import { setImmediate } from 'timers/promises'
2
+
3
+ let yieldTime = performance.now()
4
+ let yieldPromise = undefined
5
+
6
+ function reset() {
7
+ yieldTime = performance.now()
8
+ yieldPromise = undefined
9
+ }
10
+
11
+ setInterval(reset, 100).unref()
12
+
13
+ export function shouldYield() {
14
+ if (yieldPromise === undefined) {
15
+ yieldPromise = performance.now() - yieldTime > 50 ? null : undefined
16
+ }
17
+ return yieldPromise !== undefined
18
+ }
19
+
20
+ export function maybeYield() {
21
+ if (yieldPromise === undefined) {
22
+ yieldPromise = performance.now() - yieldTime > 50 ? null : undefined
23
+ }
24
+ if (yieldPromise === null) {
25
+ yieldPromise = setImmediate().then(reset)
26
+ }
27
+ return yieldPromise ?? null
28
+ }
29
+
30
+ export async function yield() {
31
+ return (yieldPromise ??= setImmediate().then(reset))
32
+ }
package/serializers.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { SIGNALS } from './platform.js'
2
- import { util } from 'undici'
2
+ import { parseHeaders } from '@nxtedition/nxt-undici'
3
3
 
4
4
  function getHeader(obj, key) {
5
5
  return obj?.headers?.get?.(key) || obj?.getHeader?.(key) || obj?.headers?.[key]
@@ -11,7 +11,7 @@ function getHeaders(obj) {
11
11
  }
12
12
 
13
13
  if (Array.isArray(obj.headers)) {
14
- return util.parseHeaders(obj.headers)
14
+ return parseHeaders(obj.headers)
15
15
  }
16
16
 
17
17
  return (
@@ -233,7 +233,6 @@ export default function ({ ds, proxify, compiler }) {
233
233
  this._wrap = null
234
234
  this._suspended = false
235
235
  this._errored = false
236
- this._refreshImpl = this._refreshImpl.bind(this)
237
236
 
238
237
  if (rxjs.isObservable(args)) {
239
238
  this._subscription = args.subscribe({
@@ -243,10 +242,6 @@ export default function ({ ds, proxify, compiler }) {
243
242
  },
244
243
  error: (err) => {
245
244
  this._observer.error(err)
246
- this._subscription = null
247
- },
248
- complete: () => {
249
- this._subscription = null
250
245
  },
251
246
  })
252
247
  } else {
@@ -338,7 +333,7 @@ export default function ({ ds, proxify, compiler }) {
338
333
  this._entries.clear()
339
334
  }
340
335
 
341
- _refreshImpl() {
336
+ _refreshImpl = () => {
342
337
  this._refreshing = false
343
338
 
344
339
  if (this._destroyed || this._disposing || this._args === kEmpty) {