@platformatic/runtime 2.5.6-alpha.2 → 2.6.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/config.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * and run json-schema-to-typescript to regenerate this file.
6
6
  */
7
7
 
8
- export type HttpsSchemasPlatformaticDevPlatformaticRuntime256Alpha2Json = {
8
+ export type HttpsSchemasPlatformaticDevPlatformaticRuntime260Json = {
9
9
  [k: string]: unknown;
10
10
  } & {
11
11
  $schema?: string;
@@ -109,17 +109,6 @@ export type HttpsSchemasPlatformaticDevPlatformaticRuntime256Alpha2Json = {
109
109
  };
110
110
  [k: string]: unknown;
111
111
  };
112
- httpCache?:
113
- | boolean
114
- | {
115
- store?: string;
116
- /**
117
- * @minItems 1
118
- */
119
- methods?: [string, ...string[]];
120
- cacheTagsHeader?: string;
121
- [k: string]: unknown;
122
- };
123
112
  watch?: boolean | string;
124
113
  managementApi?:
125
114
  | boolean
@@ -193,15 +193,6 @@ async function managementApiPlugin (app, opts) {
193
193
  const logFileStream = await runtime.getLogFileStream(logId, runtimePID)
194
194
  return logFileStream
195
195
  })
196
-
197
- app.get('/http-cache/requests', async () => {
198
- return runtime.getCachedHttpRequests()
199
- })
200
-
201
- app.post('/http-cache/invalidate', async (req) => {
202
- const { origin, routes, tags } = req.body
203
- await runtime.invalidateHttpCache({ origin, routes, tags })
204
- })
205
196
  }
206
197
 
207
198
  async function startManagementApi (runtime, configManager) {
package/lib/runtime.js CHANGED
@@ -16,7 +16,6 @@ const errors = require('./errors')
16
16
  const { createLogger } = require('./logger')
17
17
  const { startManagementApi } = require('./management-api')
18
18
  const { startPrometheusServer } = require('./prom-server')
19
- const { createSharedStore } = require('./shared-http-cache')
20
19
  const { getRuntimeTmpDir } = require('./utils')
21
20
  const { sendViaITC, waitEventFromITC } = require('./worker/itc')
22
21
  const { kId, kITC, kConfig } = require('./worker/symbols')
@@ -54,7 +53,6 @@ class Runtime extends EventEmitter {
54
53
  #bootstrapAttempts
55
54
  #inspectors
56
55
  #inspectorServer
57
- #sharedHttpCache
58
56
 
59
57
  constructor (configManager, runtimeLogsDir, env) {
60
58
  super()
@@ -74,7 +72,6 @@ class Runtime extends EventEmitter {
74
72
  this.#restartPromises = new Map()
75
73
  this.#bootstrapAttempts = new Map()
76
74
  this.#inspectors = []
77
- this.#sharedHttpCache = null
78
75
  }
79
76
 
80
77
  async init () {
@@ -119,11 +116,6 @@ class Runtime extends EventEmitter {
119
116
  throw e
120
117
  }
121
118
 
122
- this.#sharedHttpCache = createSharedStore(
123
- this.#configManager.dirname,
124
- config.httpCache
125
- )
126
-
127
119
  this.#updateStatus('init')
128
120
  }
129
121
 
@@ -763,24 +755,6 @@ class Runtime extends EventEmitter {
763
755
  return createReadStream(filePath)
764
756
  }
765
757
 
766
- async getCachedHttpRequests () {
767
- return this.#sharedHttpCache.getRoutes()
768
- }
769
-
770
- async invalidateHttpCache (options = {}) {
771
- const { origin, routes, tags } = options
772
-
773
- if (!this.#sharedHttpCache) return
774
-
775
- if (routes && routes.length > 0) {
776
- await this.#sharedHttpCache.deleteRoutes(routes)
777
- }
778
-
779
- if (tags && tags.length > 0) {
780
- await this.#sharedHttpCache.deleteByCacheTags(origin, tags)
781
- }
782
- }
783
-
784
758
  #updateStatus (status) {
785
759
  this.#status = status
786
760
  this.emit(status)
@@ -891,18 +865,7 @@ class Runtime extends EventEmitter {
891
865
  port: service,
892
866
  handlers: {
893
867
  getServiceMeta: this.getServiceMeta.bind(this),
894
- getServices: this.getServices.bind(this),
895
- isHttpCacheFull: () => this.#sharedHttpCache.isFull(),
896
- getHttpCacheValue: opts => this.#sharedHttpCache.getValue(opts.request),
897
- setHttpCacheValue: opts => this.#sharedHttpCache.setValue(
898
- opts.request,
899
- opts.response,
900
- opts.payload
901
- ),
902
- deleteHttpCacheValue: opts => this.#sharedHttpCache.deleteByOrigin(
903
- opts.origin
904
- ),
905
- invalidateHttpCache: opts => this.invalidateHttpCache(opts),
868
+ getServices: this.getServices.bind(this)
906
869
  }
907
870
  })
908
871
  service[kITC].listen()
package/lib/schema.js CHANGED
@@ -142,32 +142,6 @@ const platformaticRuntimeSchema = {
142
142
  }
143
143
  }
144
144
  },
145
- httpCache: {
146
- oneOf: [
147
- {
148
- type: 'boolean'
149
- },
150
- {
151
- type: 'object',
152
- properties: {
153
- store: {
154
- type: 'string'
155
- },
156
- methods: {
157
- type: 'array',
158
- items: {
159
- type: 'string'
160
- },
161
- default: ['GET', 'HEAD'],
162
- minItems: 1
163
- },
164
- cacheTagsHeader: {
165
- type: 'string'
166
- }
167
- }
168
- }
169
- ]
170
- },
171
145
  watch: {
172
146
  anyOf: [
173
147
  {
@@ -7,11 +7,9 @@ const { pathToFileURL } = require('node:url')
7
7
  const inspector = require('node:inspector')
8
8
 
9
9
  const pino = require('pino')
10
- const { fetch, setGlobalDispatcher, getGlobalDispatcher, Agent } = require('undici')
10
+ const { fetch, setGlobalDispatcher, Agent } = require('undici')
11
11
  const { wire } = require('undici-thread-interceptor')
12
- const undici = require('undici')
13
12
 
14
- const RemoteCacheStore = require('./http-cache')
15
13
  const { PlatformaticApp } = require('./app')
16
14
  const { setupITC } = require('./itc')
17
15
  const loadInterceptors = require('./interceptors')
@@ -80,21 +78,10 @@ async function main () {
80
78
  }
81
79
  }
82
80
 
83
- const dispatcherOpts = { ...config.undici }
84
-
85
- if (Object.keys(interceptors).length > 0) {
86
- const clientInterceptors = [...interceptors.Agent, ...interceptors.Client]
87
- const poolInterceptors = [...interceptors.Agent, ...interceptors.Pool]
88
-
89
- dispatcherOpts.factory = (origin, opts) => {
90
- return opts && opts.connections === 1
91
- ? new undici.Client(origin, opts).compose(clientInterceptors)
92
- : new undici.Pool(origin, opts).compose(poolInterceptors)
93
- }
94
- }
95
-
96
- const globalDispatcher = new Agent(dispatcherOpts)
97
- .compose(composedInterceptors)
81
+ const globalDispatcher = new Agent({
82
+ ...config.undici,
83
+ interceptors
84
+ }).compose(composedInterceptors)
98
85
 
99
86
  setGlobalDispatcher(globalDispatcher)
100
87
 
@@ -103,15 +90,6 @@ async function main () {
103
90
  // TODO: make this configurable
104
91
  const threadDispatcher = wire({ port: parentPort, useNetwork: service.useHttp, timeout: 5 * 60 * 1000 })
105
92
 
106
- if (config.httpCache) {
107
- setGlobalDispatcher(
108
- getGlobalDispatcher().compose(undici.interceptors.cache({
109
- store: new RemoteCacheStore(),
110
- methods: config.httpCache.methods ?? ['GET', 'HEAD']
111
- }))
112
- )
113
- }
114
-
115
93
  // If the service is an entrypoint and runtime server config is defined, use it.
116
94
  let serverConfig = null
117
95
  if (config.server && service.entrypoint) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platformatic/runtime",
3
- "version": "2.5.6-alpha.2",
3
+ "version": "2.6.0",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -35,18 +35,17 @@
35
35
  "typescript": "^5.5.4",
36
36
  "undici-oidc-interceptor": "^0.5.0",
37
37
  "why-is-node-running": "^2.2.2",
38
- "@platformatic/composer": "2.5.6-alpha.2",
39
- "@platformatic/service": "2.5.6-alpha.2",
40
- "@platformatic/db": "2.5.6-alpha.2",
41
- "@platformatic/sql-graphql": "2.5.6-alpha.2",
42
- "@platformatic/sql-mapper": "2.5.6-alpha.2"
38
+ "@platformatic/composer": "2.6.0",
39
+ "@platformatic/db": "2.6.0",
40
+ "@platformatic/service": "2.6.0",
41
+ "@platformatic/sql-graphql": "2.6.0",
42
+ "@platformatic/sql-mapper": "2.6.0"
43
43
  },
44
44
  "dependencies": {
45
45
  "@fastify/error": "^4.0.0",
46
46
  "@fastify/websocket": "^11.0.0",
47
47
  "@hapi/topo": "^6.0.2",
48
48
  "@platformatic/http-metrics": "^0.2.1",
49
- "@platformatic/undici-cache-memory": "^0.3.0",
50
49
  "@watchable/unpromise": "^1.0.2",
51
50
  "boring-name-generator": "^1.0.3",
52
51
  "change-case-all": "^2.1.0",
@@ -68,16 +67,16 @@
68
67
  "semgrator": "^0.3.0",
69
68
  "tail-file-stream": "^0.2.0",
70
69
  "thread-cpu-usage": "^0.2.0",
71
- "undici": "7.0.0-alpha.3",
70
+ "undici": "^6.9.0",
72
71
  "undici-thread-interceptor": "^0.7.0",
73
72
  "ws": "^8.16.0",
74
- "@platformatic/basic": "2.5.6-alpha.2",
75
- "@platformatic/config": "2.5.6-alpha.2",
76
- "@platformatic/generators": "2.5.6-alpha.2",
77
- "@platformatic/telemetry": "2.5.6-alpha.2",
78
- "@platformatic/itc": "2.5.6-alpha.2",
79
- "@platformatic/ts-compiler": "2.5.6-alpha.2",
80
- "@platformatic/utils": "2.5.6-alpha.2"
73
+ "@platformatic/basic": "2.6.0",
74
+ "@platformatic/config": "2.6.0",
75
+ "@platformatic/generators": "2.6.0",
76
+ "@platformatic/itc": "2.6.0",
77
+ "@platformatic/telemetry": "2.6.0",
78
+ "@platformatic/ts-compiler": "2.6.0",
79
+ "@platformatic/utils": "2.6.0"
81
80
  },
82
81
  "scripts": {
83
82
  "test": "npm run lint && borp --concurrency=1 --timeout=180000 && tsd",
package/schema.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://schemas.platformatic.dev/@platformatic/runtime/2.5.6-alpha.2.json",
2
+ "$id": "https://schemas.platformatic.dev/@platformatic/runtime/2.6.0.json",
3
3
  "$schema": "http://json-schema.org/draft-07/schema#",
4
4
  "type": "object",
5
5
  "properties": {
@@ -379,35 +379,6 @@
379
379
  }
380
380
  }
381
381
  },
382
- "httpCache": {
383
- "oneOf": [
384
- {
385
- "type": "boolean"
386
- },
387
- {
388
- "type": "object",
389
- "properties": {
390
- "store": {
391
- "type": "string"
392
- },
393
- "methods": {
394
- "type": "array",
395
- "items": {
396
- "type": "string"
397
- },
398
- "default": [
399
- "GET",
400
- "HEAD"
401
- ],
402
- "minItems": 1
403
- },
404
- "cacheTagsHeader": {
405
- "type": "string"
406
- }
407
- }
408
- }
409
- ]
410
- },
411
382
  "watch": {
412
383
  "anyOf": [
413
384
  {
@@ -1,45 +0,0 @@
1
- 'use strict'
2
-
3
- const { join } = require('node:path')
4
- const { createRequire } = require('node:module')
5
- const MemoryCacheStore = require('@platformatic/undici-cache-memory')
6
-
7
- function createSharedStore (projectDir, httpCacheConfig = {}) {
8
- const runtimeRequire = createRequire(join(projectDir, 'file'))
9
-
10
- const { store, ...storeConfig } = httpCacheConfig
11
- const CacheStore = store ? runtimeRequire(store) : MemoryCacheStore
12
-
13
- class SharedCacheStore extends CacheStore {
14
- async getValue (req) {
15
- const readStream = await this.createReadStream(req)
16
- if (!readStream) return null
17
-
18
- let payload = ''
19
- for await (const chunk of readStream) {
20
- payload += chunk
21
- }
22
-
23
- const response = this.#sanitizeResponse(readStream.value)
24
- return { response, payload }
25
- }
26
-
27
- setValue (req, opts, data) {
28
- const writeStream = this.createWriteStream(req, opts)
29
- writeStream.write(data)
30
- writeStream.end()
31
- return null
32
- }
33
-
34
- #sanitizeResponse (response) {
35
- return {
36
- ...response,
37
- rawHeaders: response.rawHeaders.map(header => header.toString())
38
- }
39
- }
40
- }
41
-
42
- return new SharedCacheStore(storeConfig)
43
- }
44
-
45
- module.exports = { createSharedStore }
@@ -1,83 +0,0 @@
1
- 'use strict'
2
-
3
- const { Readable, Writable } = require('node:stream')
4
- const { kITC } = require('./symbols')
5
-
6
- class RemoteCacheStore {
7
- get isFull () {
8
- // TODO: make an itc call to the shared cache when interceptor supports
9
- // an async isFull method
10
- return false
11
- }
12
-
13
- async createReadStream (request) {
14
- const itc = globalThis[kITC]
15
- if (!itc) return
16
-
17
- const cachedValue = await itc.send('getHttpCacheValue', {
18
- request: this.#sanitizeRequest(request)
19
- })
20
- if (!cachedValue) return
21
-
22
- const readable = new Readable({
23
- read () {}
24
- })
25
-
26
- Object.defineProperty(readable, 'value', {
27
- get () { return cachedValue.response }
28
- })
29
-
30
- readable.push(cachedValue.payload)
31
- readable.push(null)
32
-
33
- return readable
34
- }
35
-
36
- createWriteStream (request, response) {
37
- const itc = globalThis[kITC]
38
- if (!itc) throw new Error('Cannot write to cache without an ITC instance')
39
-
40
- let payload = ''
41
-
42
- request = this.#sanitizeRequest(request)
43
- response = this.#sanitizeResponse(response)
44
-
45
- return new Writable({
46
- write (chunk, encoding, callback) {
47
- payload += chunk
48
- callback()
49
- },
50
- final (callback) {
51
- itc.send('setHttpCacheValue', { request, response, payload })
52
- .then(() => callback())
53
- .catch((err) => callback(err))
54
- }
55
- })
56
- }
57
-
58
- deleteByOrigin (origin) {
59
- const itc = globalThis[kITC]
60
- if (!itc) throw new Error('Cannot delete from cache without an ITC instance')
61
-
62
- itc.send('deleteHttpCacheValue', { origin })
63
- // TODO: return a Promise
64
- }
65
-
66
- #sanitizeRequest (request) {
67
- return {
68
- origin: request.origin,
69
- method: request.method,
70
- path: request.path,
71
- headers: request.headers
72
- }
73
- }
74
-
75
- #sanitizeResponse (response) {
76
- return {
77
- ...response,
78
- rawHeaders: response.rawHeaders.map(header => header.toString())
79
- }
80
- }
81
- }
82
-
83
- module.exports = RemoteCacheStore