@platformatic/next 2.19.0-alpha.3 → 2.19.0-alpha.5
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/config.d.ts +0 -6
- package/index.js +2 -14
- package/lib/loader.js +12 -34
- package/lib/schema.js +1 -32
- package/package.json +6 -8
- package/schema.json +1 -36
- package/lib/caching/valkey.js +0 -222
package/config.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -59,10 +59,8 @@ export class NextStackable extends BaseStackable {
|
|
|
59
59
|
return this.stopCommand()
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
globalThis.platformatic.events.emit('plt:next:close')
|
|
63
|
-
|
|
64
62
|
if (this.isProduction) {
|
|
65
|
-
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
66
64
|
this.#server.close(error => {
|
|
67
65
|
/* c8 ignore next 3 */
|
|
68
66
|
if (error) {
|
|
@@ -72,8 +70,6 @@ export class NextStackable extends BaseStackable {
|
|
|
72
70
|
resolve()
|
|
73
71
|
})
|
|
74
72
|
})
|
|
75
|
-
|
|
76
|
-
await this.childManager.close()
|
|
77
73
|
} else {
|
|
78
74
|
const exitPromise = once(this.#child, 'exit')
|
|
79
75
|
await this.childManager.close()
|
|
@@ -100,8 +96,7 @@ export class NextStackable extends BaseStackable {
|
|
|
100
96
|
/* c8 ignore next 5 */
|
|
101
97
|
async getWatchConfig () {
|
|
102
98
|
return {
|
|
103
|
-
enabled: false
|
|
104
|
-
path: this.root
|
|
99
|
+
enabled: false
|
|
105
100
|
}
|
|
106
101
|
}
|
|
107
102
|
|
|
@@ -136,7 +131,6 @@ export class NextStackable extends BaseStackable {
|
|
|
136
131
|
this.childManager = new ChildManager({
|
|
137
132
|
loader: loaderUrl,
|
|
138
133
|
context: {
|
|
139
|
-
config: this.configManager.current,
|
|
140
134
|
serviceId: this.serviceId,
|
|
141
135
|
workerId: this.workerId,
|
|
142
136
|
// Always use URL to avoid serialization problem in Windows
|
|
@@ -189,7 +183,6 @@ export class NextStackable extends BaseStackable {
|
|
|
189
183
|
this.childManager = new ChildManager({
|
|
190
184
|
loader: loaderUrl,
|
|
191
185
|
context: {
|
|
192
|
-
config: this.configManager.current,
|
|
193
186
|
serviceId: this.serviceId,
|
|
194
187
|
workerId: this.workerId,
|
|
195
188
|
// Always use URL to avoid serialization problem in Windows
|
|
@@ -209,7 +202,6 @@ export class NextStackable extends BaseStackable {
|
|
|
209
202
|
|
|
210
203
|
async #startProductionNext () {
|
|
211
204
|
try {
|
|
212
|
-
globalThis.platformatic.config = this.configManager.current
|
|
213
205
|
await this.childManager.inject()
|
|
214
206
|
const { nextStart } = await importFile(pathResolve(this.#next, './dist/cli/next-start.js'))
|
|
215
207
|
|
|
@@ -250,10 +242,6 @@ function transformConfig () {
|
|
|
250
242
|
this.current.watch = { enabled: this.current.watch || false }
|
|
251
243
|
}
|
|
252
244
|
|
|
253
|
-
if (this.current.cache?.adapter === 'redis') {
|
|
254
|
-
this.current.cache.adapter = 'valkey'
|
|
255
|
-
}
|
|
256
|
-
|
|
257
245
|
basicTransformConfig.call(this)
|
|
258
246
|
}
|
|
259
247
|
|
package/lib/loader.js
CHANGED
|
@@ -11,12 +11,10 @@ import {
|
|
|
11
11
|
variableDeclarator
|
|
12
12
|
} from '@babel/types'
|
|
13
13
|
import { readFile, realpath } from 'node:fs/promises'
|
|
14
|
-
import { sep } from 'node:path'
|
|
15
14
|
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
16
15
|
|
|
17
16
|
const originalId = '__pltOriginalNextConfig'
|
|
18
17
|
|
|
19
|
-
let config
|
|
20
18
|
let candidates
|
|
21
19
|
let basePath
|
|
22
20
|
|
|
@@ -37,11 +35,6 @@ function parseSingleExpression (expr) {
|
|
|
37
35
|
__pltOriginalNextConfig.basePath = basePath
|
|
38
36
|
}
|
|
39
37
|
|
|
40
|
-
if(typeof __pltOriginalNextConfig.cacheHandler === 'undefined') {
|
|
41
|
-
__pltOriginalNextConfig.cacheHandler = $PATH
|
|
42
|
-
__pltOriginalNextConfig.cacheMaxMemorySize = 0
|
|
43
|
-
}
|
|
44
|
-
|
|
45
38
|
// This is to send the configuraion when Next is executed in a child process (development)
|
|
46
39
|
globalThis[Symbol.for('plt.children.itc')]?.notify('config', __pltOriginalNextConfig)
|
|
47
40
|
|
|
@@ -52,35 +45,21 @@ function parseSingleExpression (expr) {
|
|
|
52
45
|
}
|
|
53
46
|
*/
|
|
54
47
|
function createEvaluatorWrapperFunction (original) {
|
|
55
|
-
const cacheHandler = config?.cache
|
|
56
|
-
? fileURLToPath(new URL(`./caching/${config.cache.adapter ?? 'foo'}.js`, import.meta.url)).replaceAll(sep, '/')
|
|
57
|
-
: undefined
|
|
58
|
-
|
|
59
48
|
return functionDeclaration(
|
|
60
49
|
null,
|
|
61
50
|
[restElement(identifier('args'))],
|
|
62
|
-
blockStatement(
|
|
63
|
-
[
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
${originalId}.cacheHandler = '${cacheHandler}'
|
|
75
|
-
${originalId}.cacheMaxMemorySize = 0
|
|
76
|
-
}
|
|
77
|
-
`)
|
|
78
|
-
: undefined,
|
|
79
|
-
parseSingleExpression(`globalThis[Symbol.for('plt.children.itc')]?.notify('config', ${originalId})`),
|
|
80
|
-
parseSingleExpression(`process.emit('plt:next:config', ${originalId})`),
|
|
81
|
-
returnStatement(identifier(originalId))
|
|
82
|
-
].filter(e => e)
|
|
83
|
-
),
|
|
51
|
+
blockStatement([
|
|
52
|
+
variableDeclaration('let', [variableDeclarator(identifier(originalId), original)]),
|
|
53
|
+
parseSingleExpression(
|
|
54
|
+
`if (typeof ${originalId} === 'function') { ${originalId} = await ${originalId}(...args) }`
|
|
55
|
+
),
|
|
56
|
+
parseSingleExpression(
|
|
57
|
+
`if (typeof ${originalId}.basePath === 'undefined') { ${originalId}.basePath = "${basePath}" }`
|
|
58
|
+
),
|
|
59
|
+
parseSingleExpression(`globalThis[Symbol.for('plt.children.itc')]?.notify('config', ${originalId})`),
|
|
60
|
+
parseSingleExpression(`process.emit('plt:next:config', ${originalId})`),
|
|
61
|
+
returnStatement(identifier(originalId))
|
|
62
|
+
]),
|
|
84
63
|
false,
|
|
85
64
|
true
|
|
86
65
|
)
|
|
@@ -146,7 +125,6 @@ export async function initialize (data) {
|
|
|
146
125
|
// Keep in sync with https://github.com/vercel/next.js/blob/main/packages/next/src/shared/lib/constants.ts
|
|
147
126
|
candidates = ['next.config.js', 'next.config.mjs'].map(c => new URL(c, realRoot).toString())
|
|
148
127
|
basePath = data.basePath ?? ''
|
|
149
|
-
config = data.config
|
|
150
128
|
}
|
|
151
129
|
|
|
152
130
|
export async function load (url, context, nextLoad) {
|
package/lib/schema.js
CHANGED
|
@@ -4,36 +4,6 @@ import { readFileSync } from 'node:fs'
|
|
|
4
4
|
|
|
5
5
|
export const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'))
|
|
6
6
|
|
|
7
|
-
export const cache = {
|
|
8
|
-
type: 'object',
|
|
9
|
-
properties: {
|
|
10
|
-
adapter: {
|
|
11
|
-
type: 'string',
|
|
12
|
-
enum: ['redis', 'valkey']
|
|
13
|
-
},
|
|
14
|
-
url: {
|
|
15
|
-
type: 'string'
|
|
16
|
-
},
|
|
17
|
-
prefix: {
|
|
18
|
-
type: 'string'
|
|
19
|
-
},
|
|
20
|
-
maxTTL: {
|
|
21
|
-
default: 86400 * 7, // One week
|
|
22
|
-
anyOf: [
|
|
23
|
-
{
|
|
24
|
-
type: 'number',
|
|
25
|
-
minimum: 0
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
type: 'string'
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
required: ['adapter', 'url'],
|
|
34
|
-
additionalProperties: false
|
|
35
|
-
}
|
|
36
|
-
|
|
37
7
|
export const schema = {
|
|
38
8
|
$id: `https://schemas.platformatic.dev/@platformatic/next/${packageJson.version}.json`,
|
|
39
9
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
@@ -46,8 +16,7 @@ export const schema = {
|
|
|
46
16
|
logger: utilsSchemaComponents.logger,
|
|
47
17
|
server: utilsSchemaComponents.server,
|
|
48
18
|
watch: schemaComponents.watch,
|
|
49
|
-
application: schemaComponents.application
|
|
50
|
-
cache
|
|
19
|
+
application: schemaComponents.application
|
|
51
20
|
},
|
|
52
21
|
additionalProperties: false
|
|
53
22
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platformatic/next",
|
|
3
|
-
"version": "2.19.0-alpha.
|
|
3
|
+
"version": "2.19.0-alpha.5",
|
|
4
4
|
"description": "Platformatic Next.js Stackable",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -19,12 +19,10 @@
|
|
|
19
19
|
"@babel/parser": "^7.25.3",
|
|
20
20
|
"@babel/traverse": "^7.25.3",
|
|
21
21
|
"@babel/types": "^7.25.2",
|
|
22
|
-
"iovalkey": "^0.2.1",
|
|
23
|
-
"msgpackr": "^1.11.2",
|
|
24
22
|
"semver": "^7.6.3",
|
|
25
|
-
"@platformatic/basic": "2.19.0-alpha.
|
|
26
|
-
"@platformatic/config": "2.19.0-alpha.
|
|
27
|
-
"@platformatic/utils": "2.19.0-alpha.
|
|
23
|
+
"@platformatic/basic": "2.19.0-alpha.5",
|
|
24
|
+
"@platformatic/config": "2.19.0-alpha.5",
|
|
25
|
+
"@platformatic/utils": "2.19.0-alpha.5"
|
|
28
26
|
},
|
|
29
27
|
"devDependencies": {
|
|
30
28
|
"@fastify/reply-from": "^11.0.0",
|
|
@@ -38,8 +36,8 @@
|
|
|
38
36
|
"react-dom": "^18.3.1",
|
|
39
37
|
"typescript": "^5.5.4",
|
|
40
38
|
"ws": "^8.18.0",
|
|
41
|
-
"@platformatic/composer": "2.19.0-alpha.
|
|
42
|
-
"@platformatic/service": "2.19.0-alpha.
|
|
39
|
+
"@platformatic/composer": "2.19.0-alpha.5",
|
|
40
|
+
"@platformatic/service": "2.19.0-alpha.5"
|
|
43
41
|
},
|
|
44
42
|
"scripts": {
|
|
45
43
|
"test": "npm run lint && borp --concurrency=1 --no-timeout",
|
package/schema.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://schemas.platformatic.dev/@platformatic/next/2.19.0-alpha.
|
|
2
|
+
"$id": "https://schemas.platformatic.dev/@platformatic/next/2.19.0-alpha.5.json",
|
|
3
3
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
4
4
|
"title": "Platformatic Next.js Stackable",
|
|
5
5
|
"type": "object",
|
|
@@ -296,41 +296,6 @@
|
|
|
296
296
|
},
|
|
297
297
|
"additionalProperties": false,
|
|
298
298
|
"default": {}
|
|
299
|
-
},
|
|
300
|
-
"cache": {
|
|
301
|
-
"type": "object",
|
|
302
|
-
"properties": {
|
|
303
|
-
"adapter": {
|
|
304
|
-
"type": "string",
|
|
305
|
-
"enum": [
|
|
306
|
-
"redis",
|
|
307
|
-
"valkey"
|
|
308
|
-
]
|
|
309
|
-
},
|
|
310
|
-
"url": {
|
|
311
|
-
"type": "string"
|
|
312
|
-
},
|
|
313
|
-
"prefix": {
|
|
314
|
-
"type": "string"
|
|
315
|
-
},
|
|
316
|
-
"maxTTL": {
|
|
317
|
-
"default": 604800,
|
|
318
|
-
"anyOf": [
|
|
319
|
-
{
|
|
320
|
-
"type": "number",
|
|
321
|
-
"minimum": 0
|
|
322
|
-
},
|
|
323
|
-
{
|
|
324
|
-
"type": "string"
|
|
325
|
-
}
|
|
326
|
-
]
|
|
327
|
-
}
|
|
328
|
-
},
|
|
329
|
-
"required": [
|
|
330
|
-
"adapter",
|
|
331
|
-
"url"
|
|
332
|
-
],
|
|
333
|
-
"additionalProperties": false
|
|
334
299
|
}
|
|
335
300
|
},
|
|
336
301
|
"additionalProperties": false
|
package/lib/caching/valkey.js
DELETED
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { ensureLoggableError } from '@platformatic/utils'
|
|
2
|
-
import { Redis } from 'iovalkey'
|
|
3
|
-
import { pack, unpack } from 'msgpackr'
|
|
4
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
5
|
-
import { hostname } from 'node:os'
|
|
6
|
-
import { resolve } from 'node:path'
|
|
7
|
-
import { fileURLToPath } from 'node:url'
|
|
8
|
-
import { pino } from 'pino'
|
|
9
|
-
|
|
10
|
-
export const MAX_BATCH_SIZE = 100
|
|
11
|
-
|
|
12
|
-
const sections = {
|
|
13
|
-
values: 'values',
|
|
14
|
-
tags: 'tags'
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const clients = new Map()
|
|
18
|
-
|
|
19
|
-
export function keyFor (prefix, subprefix, section, key) {
|
|
20
|
-
return [prefix, 'cache:next', subprefix, section, key ? Buffer.from(key).toString('base64url') : undefined]
|
|
21
|
-
.filter(c => c)
|
|
22
|
-
.join(':')
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function getConnection (url) {
|
|
26
|
-
let client = clients.get(url)
|
|
27
|
-
|
|
28
|
-
if (!client) {
|
|
29
|
-
client = new Redis(url, { enableAutoPipelining: true })
|
|
30
|
-
clients.set(url, client)
|
|
31
|
-
|
|
32
|
-
globalThis.platformatic.events.on('plt:next:close', () => {
|
|
33
|
-
client.disconnect(false)
|
|
34
|
-
})
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return client
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export class CacheHandler {
|
|
41
|
-
#config
|
|
42
|
-
#logger
|
|
43
|
-
#store
|
|
44
|
-
#subprefix
|
|
45
|
-
#maxTTL
|
|
46
|
-
|
|
47
|
-
constructor () {
|
|
48
|
-
this.#logger = this.#createLogger()
|
|
49
|
-
this.#config = globalThis.platformatic.config.cache
|
|
50
|
-
this.#store = getConnection(this.#config.url)
|
|
51
|
-
this.#maxTTL = this.#config.maxTTL
|
|
52
|
-
this.#subprefix = this.#getSubprefix()
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async get (cacheKey) {
|
|
56
|
-
this.#logger.trace({ key: cacheKey }, 'get')
|
|
57
|
-
|
|
58
|
-
const key = this.#keyFor(cacheKey, sections.values)
|
|
59
|
-
|
|
60
|
-
let rawValue
|
|
61
|
-
try {
|
|
62
|
-
rawValue = await this.#store.get(key)
|
|
63
|
-
|
|
64
|
-
if (!rawValue) {
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
} catch (e) {
|
|
68
|
-
this.#logger.error({ err: ensureLoggableError(e) }, 'Cannot read cache value from Valkey')
|
|
69
|
-
throw new Error('Cannot read cache value from Valkey', { cause: e })
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
let value
|
|
73
|
-
try {
|
|
74
|
-
value = this.#deserialize(rawValue)
|
|
75
|
-
} catch (e) {
|
|
76
|
-
this.#logger.error({ err: ensureLoggableError(e) }, 'Cannot deserialize cache value from Valkey')
|
|
77
|
-
|
|
78
|
-
// Avoid useless reads the next time
|
|
79
|
-
// Note that since the value was unserializable, we don't know its tags and thus
|
|
80
|
-
// we cannot remove it from the tags sets. TTL will take care of them.
|
|
81
|
-
await this.#store.del(key)
|
|
82
|
-
|
|
83
|
-
throw new Error('Cannot deserialize cache value from Valkey', { cause: e })
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (this.#maxTTL < value.revalidate) {
|
|
87
|
-
try {
|
|
88
|
-
await this.#refreshKey(key, value)
|
|
89
|
-
} catch (e) {
|
|
90
|
-
this.#logger.error({ err: ensureLoggableError(e) }, 'Cannot refresh cache key expiration in Valkey')
|
|
91
|
-
|
|
92
|
-
// We don't throw here since we want to use the cached value anyway
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return value
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async set (cacheKey, value, { tags, revalidate }) {
|
|
100
|
-
this.#logger.trace({ key: cacheKey, value, tags, revalidate }, 'set')
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
// Compute the parameters to save
|
|
104
|
-
const key = this.#keyFor(cacheKey, sections.values)
|
|
105
|
-
const data = this.#serialize({ value, tags, lastModified: Date.now(), revalidate, maxTTL: this.#maxTTL })
|
|
106
|
-
const expire = Math.min(revalidate, this.#maxTTL)
|
|
107
|
-
|
|
108
|
-
// Enqueue all the operations to perform in Valkey
|
|
109
|
-
const promises = []
|
|
110
|
-
promises.push(this.#store.set(key, data, 'EX', expire))
|
|
111
|
-
|
|
112
|
-
// As Next.js limits tags to 64, we don't need to manage batches here
|
|
113
|
-
if (Array.isArray(tags)) {
|
|
114
|
-
for (const tag of tags) {
|
|
115
|
-
const tagsKey = this.#keyFor(tag, sections.tags)
|
|
116
|
-
promises.push(this.#store.sadd(tagsKey, key))
|
|
117
|
-
promises.push(this.#store.expire(tagsKey, expire))
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Execute all the operations
|
|
122
|
-
await Promise.all(promises)
|
|
123
|
-
} catch (e) {
|
|
124
|
-
this.#logger.error({ err: ensureLoggableError(e) }, 'Cannot write cache value in Valkey')
|
|
125
|
-
throw new Error('Cannot write cache value in Valkey', { cause: e })
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
async revalidateTag (tags) {
|
|
130
|
-
this.#logger.trace({ tags }, 'revalidateTag')
|
|
131
|
-
|
|
132
|
-
if (typeof tags === 'string') {
|
|
133
|
-
tags = [tags]
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
try {
|
|
137
|
-
let promises = []
|
|
138
|
-
|
|
139
|
-
for (const tag of tags) {
|
|
140
|
-
const tagsKey = this.#keyFor(tag, sections.tags)
|
|
141
|
-
|
|
142
|
-
// For each key in the tag set, expire the key
|
|
143
|
-
for await (const keys of this.#store.sscanStream(tagsKey)) {
|
|
144
|
-
for (const key of keys) {
|
|
145
|
-
promises.push(this.#store.del(key))
|
|
146
|
-
|
|
147
|
-
// Batch full, execute it
|
|
148
|
-
if (promises.length >= MAX_BATCH_SIZE) {
|
|
149
|
-
await Promise.all(promises)
|
|
150
|
-
promises = []
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Delete the set, this will also take care of executing pending operation for a non full batch
|
|
156
|
-
promises.push(this.#store.del(tagsKey))
|
|
157
|
-
await Promise.all(promises)
|
|
158
|
-
promises = []
|
|
159
|
-
}
|
|
160
|
-
} catch (e) {
|
|
161
|
-
this.#logger.error({ err: ensureLoggableError(e) }, 'Cannot expire cache tags in Valkey')
|
|
162
|
-
throw new Error('Cannot expire cache tags in Valkey', { cause: e })
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
async #refreshKey (key, value) {
|
|
167
|
-
const life = Math.round((Date.now() - value.lastModified) / 1000)
|
|
168
|
-
const expire = Math.min(value.revalidate - life, this.#maxTTL)
|
|
169
|
-
|
|
170
|
-
if (expire > 0) {
|
|
171
|
-
const promises = []
|
|
172
|
-
promises.push(this.#store.expire(key, expire, 'gt'))
|
|
173
|
-
|
|
174
|
-
if (Array.isArray(value.tags)) {
|
|
175
|
-
for (const tag of value.tags) {
|
|
176
|
-
const tagsKey = this.#keyFor(tag, sections.tags)
|
|
177
|
-
promises.push(this.#store.expire(tagsKey, expire, 'gt'))
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
await Promise.all(promises)
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
#createLogger () {
|
|
186
|
-
const pinoOptions = {
|
|
187
|
-
level: globalThis.platformatic?.logLevel ?? 'info'
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (this.serviceId) {
|
|
191
|
-
pinoOptions.name = `cache:${this.serviceId}`
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (typeof globalThis.platformatic.workerId !== 'undefined') {
|
|
195
|
-
pinoOptions.base = { pid: process.pid, hostname: hostname(), worker: this.workerId }
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return pino(pinoOptions)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
#getSubprefix () {
|
|
202
|
-
const root = fileURLToPath(globalThis.platformatic.root)
|
|
203
|
-
|
|
204
|
-
return existsSync(resolve(root, '.next/BUILD_ID'))
|
|
205
|
-
? (this.#subprefix = readFileSync(resolve(root, '.next/BUILD_ID'), 'utf-8').trim())
|
|
206
|
-
: 'development'
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
#keyFor (key, section) {
|
|
210
|
-
return keyFor(this.#config.prefix, this.#subprefix, section, key)
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
#serialize (data) {
|
|
214
|
-
return pack(data).toString('base64url')
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
#deserialize (data) {
|
|
218
|
-
return unpack(Buffer.from(data, 'base64url'))
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export default CacheHandler
|