@backstage/backend-defaults 0.2.18 → 0.3.0-next.1

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/cache/package.json +6 -0
  3. package/config.d.ts +39 -0
  4. package/database/package.json +6 -0
  5. package/discovery/package.json +6 -0
  6. package/dist/cache.cjs.js +193 -0
  7. package/dist/cache.cjs.js.map +1 -0
  8. package/dist/cache.d.ts +84 -0
  9. package/dist/database.cjs.js +1093 -0
  10. package/dist/database.cjs.js.map +1 -0
  11. package/dist/database.d.ts +68 -0
  12. package/dist/discovery.cjs.js +97 -0
  13. package/dist/discovery.cjs.js.map +1 -0
  14. package/dist/discovery.d.ts +55 -0
  15. package/dist/index.cjs.js +18 -9
  16. package/dist/index.cjs.js.map +1 -1
  17. package/dist/lifecycle.cjs.js +63 -0
  18. package/dist/lifecycle.cjs.js.map +1 -0
  19. package/dist/lifecycle.d.ts +11 -0
  20. package/dist/permissions.cjs.js +24 -0
  21. package/dist/permissions.cjs.js.map +1 -0
  22. package/dist/permissions.d.ts +8 -0
  23. package/dist/rootConfig.cjs.js +23 -0
  24. package/dist/rootConfig.cjs.js.map +1 -0
  25. package/dist/rootConfig.d.ts +23 -0
  26. package/dist/rootLifecycle.cjs.js +75 -0
  27. package/dist/rootLifecycle.cjs.js.map +1 -0
  28. package/dist/rootLifecycle.d.ts +11 -0
  29. package/dist/scheduler.cjs.js +694 -0
  30. package/dist/scheduler.cjs.js.map +1 -0
  31. package/dist/scheduler.d.ts +10 -0
  32. package/dist/urlReader.cjs.js +21 -0
  33. package/dist/urlReader.cjs.js.map +1 -0
  34. package/dist/urlReader.d.ts +7 -0
  35. package/lifecycle/package.json +6 -0
  36. package/migrations/scheduler/20210928160613_init.js +64 -0
  37. package/package.json +111 -23
  38. package/permissions/package.json +6 -0
  39. package/rootConfig/package.json +6 -0
  40. package/rootLifecycle/package.json +6 -0
  41. package/scheduler/package.json +6 -0
  42. package/urlReader/package.json +6 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # @backstage/backend-defaults
2
2
 
3
+ ## 0.3.0-next.1
4
+
5
+ ### Minor Changes
6
+
7
+ - 02103be: Deprecated and moved over core services to `@backstage/backend-defaults`
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @backstage/backend-app-api@0.7.6-next.1
13
+ - @backstage/backend-plugin-api@0.6.19-next.1
14
+ - @backstage/plugin-permission-node@0.7.30-next.1
15
+ - @backstage/backend-common@0.23.0-next.1
16
+ - @backstage/config-loader@1.8.0
17
+ - @backstage/plugin-events-node@0.3.5-next.0
18
+
19
+ ## 0.2.19-next.0
20
+
21
+ ### Patch Changes
22
+
23
+ - 6551b3d: Added core service factories and implementations from
24
+ `@backstage/backend-app-api`. They are now available as subpath exports, e.g.
25
+ `@backstage/backend-defaults/scheduler` is where the service factory and default
26
+ implementation of `coreServices.scheduler` now lives. They have been marked as
27
+ deprecated in their old locations.
28
+ - Updated dependencies
29
+ - @backstage/backend-app-api@0.7.6-next.0
30
+ - @backstage/backend-common@0.22.1-next.0
31
+ - @backstage/plugin-events-node@0.3.5-next.0
32
+ - @backstage/backend-plugin-api@0.6.19-next.0
33
+ - @backstage/plugin-permission-node@0.7.30-next.0
34
+ - @backstage/config-loader@1.8.0
35
+ - @backstage/config@1.2.0
36
+ - @backstage/errors@1.2.4
37
+ - @backstage/types@1.1.1
38
+
3
39
  ## 0.2.18
4
40
 
5
41
  ### Patch Changes
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@backstage/backend-defaults",
3
+ "version": "0.3.0-next.1",
4
+ "main": "../dist/cache.cjs.js",
5
+ "types": "../dist/cache.d.ts"
6
+ }
package/config.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ /*
2
+ * Copyright 2020 The Backstage Authors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export interface Config {
18
+ /**
19
+ * Options used by the default discovery service.
20
+ */
21
+ discovery?: {
22
+ /**
23
+ * A list of target baseUrls and the associated plugins.
24
+ */
25
+ endpoints: Array<{
26
+ /**
27
+ * The target base URL to use for the plugin.
28
+ *
29
+ * Can be either a string or an object with internal and external keys.
30
+ * Targets with `{{pluginId}}` or `{{ pluginId }} in the URL will be replaced with the plugin ID.
31
+ */
32
+ target: string | { internal: string; external: string };
33
+ /**
34
+ * Array of plugins which use the target base URL.
35
+ */
36
+ plugins: string[];
37
+ }>;
38
+ };
39
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@backstage/backend-defaults",
3
+ "version": "0.3.0-next.1",
4
+ "main": "../dist/database.cjs.js",
5
+ "types": "../dist/database.d.ts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@backstage/backend-defaults",
3
+ "version": "0.3.0-next.1",
4
+ "main": "../dist/discovery.cjs.js",
5
+ "types": "../dist/discovery.d.ts"
6
+ }
@@ -0,0 +1,193 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var Keyv = require('keyv');
5
+ var crypto = require('crypto');
6
+
7
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
8
+
9
+ var Keyv__default = /*#__PURE__*/_interopDefaultCompat(Keyv);
10
+
11
+ class DefaultCacheClient {
12
+ #client;
13
+ #clientFactory;
14
+ #options;
15
+ constructor(client, clientFactory, options) {
16
+ this.#client = client;
17
+ this.#clientFactory = clientFactory;
18
+ this.#options = options;
19
+ }
20
+ async get(key) {
21
+ const k = this.getNormalizedKey(key);
22
+ const value = await this.#client.get(k);
23
+ return value;
24
+ }
25
+ async set(key, value, opts = {}) {
26
+ const k = this.getNormalizedKey(key);
27
+ await this.#client.set(k, value, opts.ttl);
28
+ }
29
+ async delete(key) {
30
+ const k = this.getNormalizedKey(key);
31
+ await this.#client.delete(k);
32
+ }
33
+ withOptions(options) {
34
+ const newOptions = { ...this.#options, ...options };
35
+ return new DefaultCacheClient(
36
+ this.#clientFactory(newOptions),
37
+ this.#clientFactory,
38
+ newOptions
39
+ );
40
+ }
41
+ /**
42
+ * Ensures keys are well-formed for any/all cache stores.
43
+ */
44
+ getNormalizedKey(candidateKey) {
45
+ const wellFormedKey = Buffer.from(candidateKey).toString("base64");
46
+ if (wellFormedKey.length < 200) {
47
+ return wellFormedKey;
48
+ }
49
+ return crypto.createHash("sha256").update(candidateKey).digest("base64");
50
+ }
51
+ }
52
+
53
+ class CacheManager {
54
+ /**
55
+ * Keys represent supported `backend.cache.store` values, mapped to factories
56
+ * that return Keyv instances appropriate to the store.
57
+ */
58
+ storeFactories = {
59
+ redis: this.createRedisStoreFactory(),
60
+ memcache: this.createMemcacheStoreFactory(),
61
+ memory: this.createMemoryStoreFactory()
62
+ };
63
+ logger;
64
+ store;
65
+ connection;
66
+ useRedisSets;
67
+ errorHandler;
68
+ defaultTtl;
69
+ /**
70
+ * Creates a new {@link CacheManager} instance by reading from the `backend`
71
+ * config section, specifically the `.cache` key.
72
+ *
73
+ * @param config - The loaded application configuration.
74
+ */
75
+ static fromConfig(config, options = {}) {
76
+ const store = config.getOptionalString("backend.cache.store") || "memory";
77
+ const defaultTtl = config.getOptionalNumber("backend.cache.defaultTtl");
78
+ const connectionString = config.getOptionalString("backend.cache.connection") || "";
79
+ const useRedisSets = config.getOptionalBoolean("backend.cache.useRedisSets") ?? true;
80
+ const logger = options.logger?.child({
81
+ type: "cacheManager"
82
+ });
83
+ return new CacheManager(
84
+ store,
85
+ connectionString,
86
+ useRedisSets,
87
+ options.onError,
88
+ logger,
89
+ defaultTtl
90
+ );
91
+ }
92
+ /** @internal */
93
+ constructor(store, connectionString, useRedisSets, errorHandler, logger, defaultTtl) {
94
+ if (!this.storeFactories.hasOwnProperty(store)) {
95
+ throw new Error(`Unknown cache store: ${store}`);
96
+ }
97
+ this.logger = logger;
98
+ this.store = store;
99
+ this.connection = connectionString;
100
+ this.useRedisSets = useRedisSets;
101
+ this.errorHandler = errorHandler;
102
+ this.defaultTtl = defaultTtl;
103
+ }
104
+ /**
105
+ * Generates a PluginCacheManager for consumption by plugins.
106
+ *
107
+ * @param pluginId - The plugin that the cache manager should be created for.
108
+ * Plugin names should be unique.
109
+ */
110
+ forPlugin(pluginId) {
111
+ return {
112
+ getClient: (defaultOptions = {}) => {
113
+ const clientFactory = (options) => {
114
+ const concreteClient = this.getClientWithTtl(
115
+ pluginId,
116
+ options.defaultTtl ?? this.defaultTtl
117
+ );
118
+ concreteClient.on("error", (err) => {
119
+ this.logger?.error("Failed to create cache client", err);
120
+ if (typeof this.errorHandler === "function") {
121
+ this.errorHandler(err);
122
+ }
123
+ });
124
+ return concreteClient;
125
+ };
126
+ return new DefaultCacheClient(
127
+ clientFactory(defaultOptions),
128
+ clientFactory,
129
+ defaultOptions
130
+ );
131
+ }
132
+ };
133
+ }
134
+ getClientWithTtl(pluginId, ttl) {
135
+ return this.storeFactories[this.store](pluginId, ttl);
136
+ }
137
+ createRedisStoreFactory() {
138
+ const KeyvRedis = require("@keyv/redis");
139
+ let store;
140
+ return (pluginId, defaultTtl) => {
141
+ if (!store) {
142
+ store = new KeyvRedis(this.connection);
143
+ }
144
+ return new Keyv__default.default({
145
+ namespace: pluginId,
146
+ ttl: defaultTtl,
147
+ store,
148
+ useRedisSets: this.useRedisSets
149
+ });
150
+ };
151
+ }
152
+ createMemcacheStoreFactory() {
153
+ const KeyvMemcache = require("@keyv/memcache");
154
+ let store;
155
+ return (pluginId, defaultTtl) => {
156
+ if (!store) {
157
+ store = new KeyvMemcache(this.connection);
158
+ }
159
+ return new Keyv__default.default({
160
+ namespace: pluginId,
161
+ ttl: defaultTtl,
162
+ store
163
+ });
164
+ };
165
+ }
166
+ createMemoryStoreFactory() {
167
+ const store = /* @__PURE__ */ new Map();
168
+ return (pluginId, defaultTtl) => new Keyv__default.default({
169
+ namespace: pluginId,
170
+ ttl: defaultTtl,
171
+ store
172
+ });
173
+ }
174
+ }
175
+
176
+ const cacheServiceFactory = backendPluginApi.createServiceFactory({
177
+ service: backendPluginApi.coreServices.cache,
178
+ deps: {
179
+ config: backendPluginApi.coreServices.rootConfig,
180
+ plugin: backendPluginApi.coreServices.pluginMetadata,
181
+ logger: backendPluginApi.coreServices.rootLogger
182
+ },
183
+ async createRootContext({ config, logger }) {
184
+ return CacheManager.fromConfig(config, { logger });
185
+ },
186
+ async factory({ plugin }, manager) {
187
+ return manager.forPlugin(plugin.getId()).getClient();
188
+ }
189
+ });
190
+
191
+ exports.CacheManager = CacheManager;
192
+ exports.cacheServiceFactory = cacheServiceFactory;
193
+ //# sourceMappingURL=cache.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.cjs.js","sources":["../src/entrypoints/cache/CacheClient.ts","../src/entrypoints/cache/CacheManager.ts","../src/entrypoints/cache/cacheServiceFactory.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CacheService,\n CacheServiceOptions,\n CacheServiceSetOptions,\n} from '@backstage/backend-plugin-api';\nimport { JsonValue } from '@backstage/types';\nimport { createHash } from 'crypto';\nimport Keyv from 'keyv';\n\nexport type CacheClientFactory = (options: CacheServiceOptions) => Keyv;\n\n/**\n * A basic, concrete implementation of the CacheService, suitable for almost\n * all uses in Backstage.\n */\nexport class DefaultCacheClient implements CacheService {\n #client: Keyv;\n #clientFactory: CacheClientFactory;\n #options: CacheServiceOptions;\n\n constructor(\n client: Keyv,\n clientFactory: CacheClientFactory,\n options: CacheServiceOptions,\n ) {\n this.#client = client;\n this.#clientFactory = clientFactory;\n this.#options = options;\n }\n\n async get<TValue extends JsonValue>(\n key: string,\n ): Promise<TValue | undefined> {\n const k = this.getNormalizedKey(key);\n const value = await this.#client.get(k);\n return value as TValue | undefined;\n }\n\n async set(\n key: string,\n value: JsonValue,\n opts: CacheServiceSetOptions = {},\n ): Promise<void> {\n const k = this.getNormalizedKey(key);\n await this.#client.set(k, value, opts.ttl);\n }\n\n async delete(key: string): Promise<void> {\n const k = this.getNormalizedKey(key);\n await this.#client.delete(k);\n }\n\n withOptions(options: CacheServiceOptions): CacheService {\n const newOptions = { ...this.#options, ...options };\n return new DefaultCacheClient(\n this.#clientFactory(newOptions),\n this.#clientFactory,\n newOptions,\n );\n }\n\n /**\n * Ensures keys are well-formed for any/all cache stores.\n */\n private getNormalizedKey(candidateKey: string): string {\n // Remove potentially invalid characters.\n const wellFormedKey = Buffer.from(candidateKey).toString('base64');\n\n // Memcache in particular doesn't do well with keys > 250 bytes.\n // Padded because a plugin ID is also prepended to the key.\n if (wellFormedKey.length < 200) {\n return wellFormedKey;\n }\n\n return createHash('sha256').update(candidateKey).digest('base64');\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CacheService,\n CacheServiceOptions,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport Keyv from 'keyv';\nimport { DefaultCacheClient } from './CacheClient';\nimport { CacheManagerOptions } from './types';\n\ntype StoreFactory = (pluginId: string, defaultTtl: number | undefined) => Keyv;\n\n/*\n * TODO(freben): This class intentionally inlines the CacheManagerOptions and\n * PluginCacheManager types, to not break the api reports in backend-common\n * which re-exports it. When backend-common is deprecated, we can stop inlining\n * those types.\n */\n\n/**\n * Implements a Cache Manager which will automatically create new cache clients\n * for plugins when requested. All requested cache clients are created with the\n * connection details provided.\n *\n * @public\n */\nexport class CacheManager {\n /**\n * Keys represent supported `backend.cache.store` values, mapped to factories\n * that return Keyv instances appropriate to the store.\n */\n private readonly storeFactories = {\n redis: this.createRedisStoreFactory(),\n memcache: this.createMemcacheStoreFactory(),\n memory: this.createMemoryStoreFactory(),\n };\n\n private readonly logger?: LoggerService;\n private readonly store: keyof CacheManager['storeFactories'];\n private readonly connection: string;\n private readonly useRedisSets: boolean;\n private readonly errorHandler: CacheManagerOptions['onError'];\n private readonly defaultTtl?: number;\n\n /**\n * Creates a new {@link CacheManager} instance by reading from the `backend`\n * config section, specifically the `.cache` key.\n *\n * @param config - The loaded application configuration.\n */\n static fromConfig(\n config: Config,\n options: {\n /**\n * An optional logger for use by the PluginCacheManager.\n */\n logger?: LoggerService;\n\n /**\n * An optional handler for connection errors emitted from the underlying data\n * store.\n */\n onError?: (err: Error) => void;\n } = {},\n ): CacheManager {\n // If no `backend.cache` config is provided, instantiate the CacheManager\n // with an in-memory cache client.\n const store = config.getOptionalString('backend.cache.store') || 'memory';\n const defaultTtl = config.getOptionalNumber('backend.cache.defaultTtl');\n const connectionString =\n config.getOptionalString('backend.cache.connection') || '';\n const useRedisSets =\n config.getOptionalBoolean('backend.cache.useRedisSets') ?? true;\n const logger = options.logger?.child({\n type: 'cacheManager',\n });\n return new CacheManager(\n store,\n connectionString,\n useRedisSets,\n options.onError,\n logger,\n defaultTtl,\n );\n }\n\n /** @internal */\n constructor(\n store: string,\n connectionString: string,\n useRedisSets: boolean,\n errorHandler: CacheManagerOptions['onError'],\n logger?: LoggerService,\n defaultTtl?: number,\n ) {\n if (!this.storeFactories.hasOwnProperty(store)) {\n throw new Error(`Unknown cache store: ${store}`);\n }\n this.logger = logger;\n this.store = store as keyof CacheManager['storeFactories'];\n this.connection = connectionString;\n this.useRedisSets = useRedisSets;\n this.errorHandler = errorHandler;\n this.defaultTtl = defaultTtl;\n }\n\n /**\n * Generates a PluginCacheManager for consumption by plugins.\n *\n * @param pluginId - The plugin that the cache manager should be created for.\n * Plugin names should be unique.\n */\n forPlugin(pluginId: string): {\n getClient(options?: CacheServiceOptions): CacheService;\n } {\n return {\n getClient: (defaultOptions = {}) => {\n const clientFactory = (options: CacheServiceOptions) => {\n const concreteClient = this.getClientWithTtl(\n pluginId,\n options.defaultTtl ?? this.defaultTtl,\n );\n\n // Always provide an error handler to avoid stopping the process.\n concreteClient.on('error', (err: Error) => {\n // In all cases, just log the error.\n this.logger?.error('Failed to create cache client', err);\n\n // Invoke any custom error handler if provided.\n if (typeof this.errorHandler === 'function') {\n this.errorHandler(err);\n }\n });\n\n return concreteClient;\n };\n\n return new DefaultCacheClient(\n clientFactory(defaultOptions),\n clientFactory,\n defaultOptions,\n );\n },\n };\n }\n\n private getClientWithTtl(pluginId: string, ttl: number | undefined): Keyv {\n return this.storeFactories[this.store](pluginId, ttl);\n }\n\n private createRedisStoreFactory(): StoreFactory {\n const KeyvRedis = require('@keyv/redis');\n let store: typeof KeyvRedis | undefined;\n return (pluginId, defaultTtl) => {\n if (!store) {\n store = new KeyvRedis(this.connection);\n }\n return new Keyv({\n namespace: pluginId,\n ttl: defaultTtl,\n store,\n useRedisSets: this.useRedisSets,\n });\n };\n }\n\n private createMemcacheStoreFactory(): StoreFactory {\n const KeyvMemcache = require('@keyv/memcache');\n let store: typeof KeyvMemcache | undefined;\n return (pluginId, defaultTtl) => {\n if (!store) {\n store = new KeyvMemcache(this.connection);\n }\n return new Keyv({\n namespace: pluginId,\n ttl: defaultTtl,\n store,\n });\n };\n }\n\n private createMemoryStoreFactory(): StoreFactory {\n const store = new Map();\n return (pluginId, defaultTtl) =>\n new Keyv({\n namespace: pluginId,\n ttl: defaultTtl,\n store,\n });\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { CacheManager } from './CacheManager';\n\n/**\n * @public\n */\nexport const cacheServiceFactory = createServiceFactory({\n service: coreServices.cache,\n deps: {\n config: coreServices.rootConfig,\n plugin: coreServices.pluginMetadata,\n logger: coreServices.rootLogger,\n },\n async createRootContext({ config, logger }) {\n return CacheManager.fromConfig(config, { logger });\n },\n async factory({ plugin }, manager) {\n return manager.forPlugin(plugin.getId()).getClient();\n },\n});\n"],"names":["createHash","Keyv","createServiceFactory","coreServices"],"mappings":";;;;;;;;;;AA+BO,MAAM,kBAA2C,CAAA;AAAA,EACtD,OAAA,CAAA;AAAA,EACA,cAAA,CAAA;AAAA,EACA,QAAA,CAAA;AAAA,EAEA,WAAA,CACE,MACA,EAAA,aAAA,EACA,OACA,EAAA;AACA,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA,CAAA;AACf,IAAA,IAAA,CAAK,cAAiB,GAAA,aAAA,CAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,OAAA,CAAA;AAAA,GAClB;AAAA,EAEA,MAAM,IACJ,GAC6B,EAAA;AAC7B,IAAM,MAAA,CAAA,GAAI,IAAK,CAAA,gBAAA,CAAiB,GAAG,CAAA,CAAA;AACnC,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AACtC,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,GACJ,CAAA,GAAA,EACA,KACA,EAAA,IAAA,GAA+B,EAChB,EAAA;AACf,IAAM,MAAA,CAAA,GAAI,IAAK,CAAA,gBAAA,CAAiB,GAAG,CAAA,CAAA;AACnC,IAAA,MAAM,KAAK,OAAQ,CAAA,GAAA,CAAI,CAAG,EAAA,KAAA,EAAO,KAAK,GAAG,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,MAAM,OAAO,GAA4B,EAAA;AACvC,IAAM,MAAA,CAAA,GAAI,IAAK,CAAA,gBAAA,CAAiB,GAAG,CAAA,CAAA;AACnC,IAAM,MAAA,IAAA,CAAK,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,YAAY,OAA4C,EAAA;AACtD,IAAA,MAAM,aAAa,EAAE,GAAG,IAAK,CAAA,QAAA,EAAU,GAAG,OAAQ,EAAA,CAAA;AAClD,IAAA,OAAO,IAAI,kBAAA;AAAA,MACT,IAAA,CAAK,eAAe,UAAU,CAAA;AAAA,MAC9B,IAAK,CAAA,cAAA;AAAA,MACL,UAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,YAA8B,EAAA;AAErD,IAAA,MAAM,gBAAgB,MAAO,CAAA,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAA;AAIjE,IAAI,IAAA,aAAA,CAAc,SAAS,GAAK,EAAA;AAC9B,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAA,OAAOA,kBAAW,QAAQ,CAAA,CAAE,OAAO,YAAY,CAAA,CAAE,OAAO,QAAQ,CAAA,CAAA;AAAA,GAClE;AACF;;AClDO,MAAM,YAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKP,cAAiB,GAAA;AAAA,IAChC,KAAA,EAAO,KAAK,uBAAwB,EAAA;AAAA,IACpC,QAAA,EAAU,KAAK,0BAA2B,EAAA;AAAA,IAC1C,MAAA,EAAQ,KAAK,wBAAyB,EAAA;AAAA,GACxC,CAAA;AAAA,EAEiB,MAAA,CAAA;AAAA,EACA,KAAA,CAAA;AAAA,EACA,UAAA,CAAA;AAAA,EACA,YAAA,CAAA;AAAA,EACA,YAAA,CAAA;AAAA,EACA,UAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,OAAO,UAAA,CACL,MACA,EAAA,OAAA,GAWI,EACU,EAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,iBAAkB,CAAA,qBAAqB,CAAK,IAAA,QAAA,CAAA;AACjE,IAAM,MAAA,UAAA,GAAa,MAAO,CAAA,iBAAA,CAAkB,0BAA0B,CAAA,CAAA;AACtE,IAAA,MAAM,gBACJ,GAAA,MAAA,CAAO,iBAAkB,CAAA,0BAA0B,CAAK,IAAA,EAAA,CAAA;AAC1D,IAAA,MAAM,YACJ,GAAA,MAAA,CAAO,kBAAmB,CAAA,4BAA4B,CAAK,IAAA,IAAA,CAAA;AAC7D,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,EAAQ,KAAM,CAAA;AAAA,MACnC,IAAM,EAAA,cAAA;AAAA,KACP,CAAA,CAAA;AACD,IAAA,OAAO,IAAI,YAAA;AAAA,MACT,KAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAQ,CAAA,OAAA;AAAA,MACR,MAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA,EAGA,YACE,KACA,EAAA,gBAAA,EACA,YACA,EAAA,YAAA,EACA,QACA,UACA,EAAA;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,cAAe,CAAA,cAAA,CAAe,KAAK,CAAG,EAAA;AAC9C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAwB,qBAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,KACjD;AACA,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,IAAA,IAAA,CAAK,UAAa,GAAA,gBAAA,CAAA;AAClB,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA,CAAA;AACpB,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA,CAAA;AACpB,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,QAER,EAAA;AACA,IAAO,OAAA;AAAA,MACL,SAAW,EAAA,CAAC,cAAiB,GAAA,EAAO,KAAA;AAClC,QAAM,MAAA,aAAA,GAAgB,CAAC,OAAiC,KAAA;AACtD,UAAA,MAAM,iBAAiB,IAAK,CAAA,gBAAA;AAAA,YAC1B,QAAA;AAAA,YACA,OAAA,CAAQ,cAAc,IAAK,CAAA,UAAA;AAAA,WAC7B,CAAA;AAGA,UAAe,cAAA,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,GAAe,KAAA;AAEzC,YAAK,IAAA,CAAA,MAAA,EAAQ,KAAM,CAAA,+BAAA,EAAiC,GAAG,CAAA,CAAA;AAGvD,YAAI,IAAA,OAAO,IAAK,CAAA,YAAA,KAAiB,UAAY,EAAA;AAC3C,cAAA,IAAA,CAAK,aAAa,GAAG,CAAA,CAAA;AAAA,aACvB;AAAA,WACD,CAAA,CAAA;AAED,UAAO,OAAA,cAAA,CAAA;AAAA,SACT,CAAA;AAEA,QAAA,OAAO,IAAI,kBAAA;AAAA,UACT,cAAc,cAAc,CAAA;AAAA,UAC5B,aAAA;AAAA,UACA,cAAA;AAAA,SACF,CAAA;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEQ,gBAAA,CAAiB,UAAkB,GAA+B,EAAA;AACxE,IAAA,OAAO,KAAK,cAAe,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,UAAU,GAAG,CAAA,CAAA;AAAA,GACtD;AAAA,EAEQ,uBAAwC,GAAA;AAC9C,IAAM,MAAA,SAAA,GAAY,QAAQ,aAAa,CAAA,CAAA;AACvC,IAAI,IAAA,KAAA,CAAA;AACJ,IAAO,OAAA,CAAC,UAAU,UAAe,KAAA;AAC/B,MAAA,IAAI,CAAC,KAAO,EAAA;AACV,QAAQ,KAAA,GAAA,IAAI,SAAU,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,OACvC;AACA,MAAA,OAAO,IAAIC,qBAAK,CAAA;AAAA,QACd,SAAW,EAAA,QAAA;AAAA,QACX,GAAK,EAAA,UAAA;AAAA,QACL,KAAA;AAAA,QACA,cAAc,IAAK,CAAA,YAAA;AAAA,OACpB,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AAAA,EAEQ,0BAA2C,GAAA;AACjD,IAAM,MAAA,YAAA,GAAe,QAAQ,gBAAgB,CAAA,CAAA;AAC7C,IAAI,IAAA,KAAA,CAAA;AACJ,IAAO,OAAA,CAAC,UAAU,UAAe,KAAA;AAC/B,MAAA,IAAI,CAAC,KAAO,EAAA;AACV,QAAQ,KAAA,GAAA,IAAI,YAAa,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,OAC1C;AACA,MAAA,OAAO,IAAIA,qBAAK,CAAA;AAAA,QACd,SAAW,EAAA,QAAA;AAAA,QACX,GAAK,EAAA,UAAA;AAAA,QACL,KAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AAAA,EAEQ,wBAAyC,GAAA;AAC/C,IAAM,MAAA,KAAA,uBAAY,GAAI,EAAA,CAAA;AACtB,IAAA,OAAO,CAAC,QAAA,EAAU,UAChB,KAAA,IAAIA,qBAAK,CAAA;AAAA,MACP,SAAW,EAAA,QAAA;AAAA,MACX,GAAK,EAAA,UAAA;AAAA,MACL,KAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACL;AACF;;ACrLO,MAAM,sBAAsBC,qCAAqB,CAAA;AAAA,EACtD,SAASC,6BAAa,CAAA,KAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACJ,QAAQA,6BAAa,CAAA,UAAA;AAAA,IACrB,QAAQA,6BAAa,CAAA,cAAA;AAAA,IACrB,QAAQA,6BAAa,CAAA,UAAA;AAAA,GACvB;AAAA,EACA,MAAM,iBAAA,CAAkB,EAAE,MAAA,EAAQ,QAAU,EAAA;AAC1C,IAAA,OAAO,YAAa,CAAA,UAAA,CAAW,MAAQ,EAAA,EAAE,QAAQ,CAAA,CAAA;AAAA,GACnD;AAAA,EACA,MAAM,OAAA,CAAQ,EAAE,MAAA,IAAU,OAAS,EAAA;AACjC,IAAA,OAAO,QAAQ,SAAU,CAAA,MAAA,CAAO,KAAM,EAAC,EAAE,SAAU,EAAA,CAAA;AAAA,GACrD;AACF,CAAC;;;;;"}
@@ -0,0 +1,84 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+ import { LoggerService, CacheServiceOptions, CacheService } from '@backstage/backend-plugin-api';
3
+ import { Config } from '@backstage/config';
4
+
5
+ /**
6
+ * @public
7
+ */
8
+ declare const cacheServiceFactory: () => _backstage_backend_plugin_api.ServiceFactory<_backstage_backend_plugin_api.CacheService, "plugin">;
9
+
10
+ /**
11
+ * Implements a Cache Manager which will automatically create new cache clients
12
+ * for plugins when requested. All requested cache clients are created with the
13
+ * connection details provided.
14
+ *
15
+ * @public
16
+ */
17
+ declare class CacheManager {
18
+ /**
19
+ * Keys represent supported `backend.cache.store` values, mapped to factories
20
+ * that return Keyv instances appropriate to the store.
21
+ */
22
+ private readonly storeFactories;
23
+ private readonly logger?;
24
+ private readonly store;
25
+ private readonly connection;
26
+ private readonly useRedisSets;
27
+ private readonly errorHandler;
28
+ private readonly defaultTtl?;
29
+ /**
30
+ * Creates a new {@link CacheManager} instance by reading from the `backend`
31
+ * config section, specifically the `.cache` key.
32
+ *
33
+ * @param config - The loaded application configuration.
34
+ */
35
+ static fromConfig(config: Config, options?: {
36
+ /**
37
+ * An optional logger for use by the PluginCacheManager.
38
+ */
39
+ logger?: LoggerService;
40
+ /**
41
+ * An optional handler for connection errors emitted from the underlying data
42
+ * store.
43
+ */
44
+ onError?: (err: Error) => void;
45
+ }): CacheManager;
46
+ /**
47
+ * Generates a PluginCacheManager for consumption by plugins.
48
+ *
49
+ * @param pluginId - The plugin that the cache manager should be created for.
50
+ * Plugin names should be unique.
51
+ */
52
+ forPlugin(pluginId: string): {
53
+ getClient(options?: CacheServiceOptions): CacheService;
54
+ };
55
+ private getClientWithTtl;
56
+ private createRedisStoreFactory;
57
+ private createMemcacheStoreFactory;
58
+ private createMemoryStoreFactory;
59
+ }
60
+
61
+ /**
62
+ * Options given when constructing a {@link CacheManager}.
63
+ *
64
+ * @public
65
+ */
66
+ type CacheManagerOptions = {
67
+ /**
68
+ * An optional logger for use by the PluginCacheManager.
69
+ */
70
+ logger?: LoggerService;
71
+ /**
72
+ * An optional handler for connection errors emitted from the underlying data
73
+ * store.
74
+ */
75
+ onError?: (err: Error) => void;
76
+ };
77
+ /**
78
+ * @public
79
+ */
80
+ interface PluginCacheManager {
81
+ getClient(options?: CacheServiceOptions): CacheService;
82
+ }
83
+
84
+ export { CacheManager, type CacheManagerOptions, type PluginCacheManager, cacheServiceFactory };