@backstage/backend-defaults 0.5.1-next.0 → 0.5.1-next.2
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/CHANGELOG.md +46 -0
- package/auth/package.json +1 -1
- package/cache/package.json +1 -1
- package/database/package.json +1 -1
- package/discovery/package.json +1 -1
- package/dist/CreateBackend.cjs.js +49 -0
- package/dist/CreateBackend.cjs.js.map +1 -0
- package/dist/PackageDiscoveryService.cjs.js +109 -0
- package/dist/PackageDiscoveryService.cjs.js.map +1 -0
- package/dist/auth.cjs.js +2 -996
- package/dist/auth.cjs.js.map +1 -1
- package/dist/cache.cjs.js +4 -204
- package/dist/cache.cjs.js.map +1 -1
- package/dist/database.cjs.js +4 -957
- package/dist/database.cjs.js.map +1 -1
- package/dist/database.d.ts +4 -1
- package/dist/discovery.cjs.js +4 -92
- package/dist/discovery.cjs.js.map +1 -1
- package/dist/discoveryFeatureLoader.cjs.js +19 -0
- package/dist/discoveryFeatureLoader.cjs.js.map +1 -0
- package/dist/entrypoints/auth/DefaultAuthService.cjs.js +130 -0
- package/dist/entrypoints/auth/DefaultAuthService.cjs.js.map +1 -0
- package/dist/entrypoints/auth/JwksClient.cjs.js +49 -0
- package/dist/entrypoints/auth/JwksClient.cjs.js.map +1 -0
- package/dist/entrypoints/auth/authServiceFactory.cjs.js +57 -0
- package/dist/entrypoints/auth/authServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/ExternalTokenHandler.cjs.js +78 -0
- package/dist/entrypoints/auth/external/ExternalTokenHandler.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/helpers.cjs.js +92 -0
- package/dist/entrypoints/auth/external/helpers.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/jwks.cjs.js +63 -0
- package/dist/entrypoints/auth/external/jwks.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/legacy.cjs.js +73 -0
- package/dist/entrypoints/auth/external/legacy.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/static.cjs.js +33 -0
- package/dist/entrypoints/auth/external/static.cjs.js.map +1 -0
- package/dist/{cjs/helpers-D2f1CG0o.cjs.js → entrypoints/auth/helpers.cjs.js} +1 -1
- package/dist/entrypoints/auth/helpers.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/PluginTokenHandler.cjs.js +147 -0
- package/dist/entrypoints/auth/plugin/PluginTokenHandler.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/DatabaseKeyStore.cjs.js +73 -0
- package/dist/entrypoints/auth/plugin/keys/DatabaseKeyStore.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/DatabasePluginKeySource.cjs.js +75 -0
- package/dist/entrypoints/auth/plugin/keys/DatabasePluginKeySource.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.cjs.js +91 -0
- package/dist/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/createPluginKeySource.cjs.js +29 -0
- package/dist/entrypoints/auth/plugin/keys/createPluginKeySource.cjs.js.map +1 -0
- package/dist/entrypoints/auth/user/UserTokenHandler.cjs.js +110 -0
- package/dist/entrypoints/auth/user/UserTokenHandler.cjs.js.map +1 -0
- package/dist/entrypoints/cache/CacheClient.cjs.js +50 -0
- package/dist/entrypoints/cache/CacheClient.cjs.js.map +1 -0
- package/dist/entrypoints/cache/CacheManager.cjs.js +147 -0
- package/dist/entrypoints/cache/CacheManager.cjs.js.map +1 -0
- package/dist/entrypoints/cache/cacheServiceFactory.cjs.js +22 -0
- package/dist/entrypoints/cache/cacheServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/cache/types.cjs.js +10 -0
- package/dist/entrypoints/cache/types.cjs.js.map +1 -0
- package/dist/entrypoints/database/DatabaseManager.cjs.js +173 -0
- package/dist/entrypoints/database/DatabaseManager.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/defaultNameOverride.cjs.js +14 -0
- package/dist/entrypoints/database/connectors/defaultNameOverride.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/defaultSchemaOverride.cjs.js +12 -0
- package/dist/entrypoints/database/connectors/defaultSchemaOverride.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/mergeDatabaseConfig.cjs.js +10 -0
- package/dist/entrypoints/database/connectors/mergeDatabaseConfig.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/mysql.cjs.js +278 -0
- package/dist/entrypoints/database/connectors/mysql.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/postgres.cjs.js +304 -0
- package/dist/entrypoints/database/connectors/postgres.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/sqlite3.cjs.js +251 -0
- package/dist/entrypoints/database/connectors/sqlite3.cjs.js.map +1 -0
- package/dist/entrypoints/database/databaseServiceFactory.cjs.js +36 -0
- package/dist/entrypoints/database/databaseServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/discovery/HostDiscovery.cjs.js +86 -0
- package/dist/entrypoints/discovery/HostDiscovery.cjs.js.map +1 -0
- package/dist/entrypoints/discovery/discoveryServiceFactory.cjs.js +17 -0
- package/dist/entrypoints/discovery/discoveryServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/httpAuth/httpAuthServiceFactory.cjs.js +192 -0
- package/dist/entrypoints/httpAuth/httpAuthServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createAuthIntegrationRouter.cjs.js +19 -0
- package/dist/entrypoints/httpRouter/createAuthIntegrationRouter.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.cjs.js +26 -0
- package/dist/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createCredentialsBarrier.cjs.js +63 -0
- package/dist/entrypoints/httpRouter/createCredentialsBarrier.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createLifecycleMiddleware.cjs.js +52 -0
- package/dist/entrypoints/httpRouter/createLifecycleMiddleware.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js +48 -0
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/lifecycle/lifecycleServiceFactory.cjs.js +88 -0
- package/dist/entrypoints/lifecycle/lifecycleServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/logger/loggerServiceFactory.cjs.js +17 -0
- package/dist/entrypoints/logger/loggerServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/permissions/permissionsServiceFactory.cjs.js +22 -0
- package/dist/entrypoints/permissions/permissionsServiceFactory.cjs.js.map +1 -0
- package/dist/{cjs/createConfigSecretEnumerator-DShyoWWL.cjs.js → entrypoints/rootConfig/createConfigSecretEnumerator.cjs.js} +1 -1
- package/dist/entrypoints/rootConfig/createConfigSecretEnumerator.cjs.js.map +1 -0
- package/dist/entrypoints/rootConfig/rootConfigServiceFactory.cjs.js +26 -0
- package/dist/entrypoints/rootConfig/rootConfigServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootHealth/rootHealthServiceFactory.cjs.js +41 -0
- package/dist/entrypoints/rootHealth/rootHealthServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/DefaultRootHttpRouter.cjs.js +77 -0
- package/dist/entrypoints/rootHttpRouter/DefaultRootHttpRouter.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/createHealthRouter.cjs.js +29 -0
- package/dist/entrypoints/rootHttpRouter/createHealthRouter.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js +187 -0
- package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/applyInternalErrorFilter.cjs.js +28 -0
- package/dist/entrypoints/rootHttpRouter/http/applyInternalErrorFilter.cjs.js.map +1 -0
- package/dist/{cjs/config-BDOwXIyo.cjs.js → entrypoints/rootHttpRouter/http/config.cjs.js} +1 -1
- package/dist/entrypoints/rootHttpRouter/http/config.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/createHttpServer.cjs.js +88 -0
- package/dist/entrypoints/rootHttpRouter/http/createHttpServer.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/getGeneratedCertificate.cjs.js +130 -0
- package/dist/entrypoints/rootHttpRouter/http/getGeneratedCertificate.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/readCorsOptions.cjs.js +51 -0
- package/dist/entrypoints/rootHttpRouter/http/readCorsOptions.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/readHelmetOptions.cjs.js +62 -0
- package/dist/entrypoints/rootHttpRouter/http/readHelmetOptions.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js +73 -0
- package/dist/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootLifecycle/rootLifecycleServiceFactory.cjs.js +76 -0
- package/dist/entrypoints/rootLifecycle/rootLifecycleServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootLogger/WinstonLogger.cjs.js +114 -0
- package/dist/entrypoints/rootLogger/WinstonLogger.cjs.js.map +1 -0
- package/dist/entrypoints/rootLogger/rootLoggerServiceFactory.cjs.js +30 -0
- package/dist/entrypoints/rootLogger/rootLoggerServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/database/migrateBackendTasks.cjs.js +18 -0
- package/dist/entrypoints/scheduler/database/migrateBackendTasks.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/database/tables.cjs.js +8 -0
- package/dist/entrypoints/scheduler/database/tables.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/DefaultSchedulerService.cjs.js +37 -0
- package/dist/entrypoints/scheduler/lib/DefaultSchedulerService.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/LocalTaskWorker.cjs.js +105 -0
- package/dist/entrypoints/scheduler/lib/LocalTaskWorker.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.cjs.js +138 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerJanitor.cjs.js +59 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerJanitor.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/TaskWorker.cjs.js +275 -0
- package/dist/entrypoints/scheduler/lib/TaskWorker.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/types.cjs.js +60 -0
- package/dist/entrypoints/scheduler/lib/types.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/util.cjs.js +66 -0
- package/dist/entrypoints/scheduler/lib/util.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/schedulerServiceFactory.cjs.js +19 -0
- package/dist/entrypoints/scheduler/schedulerServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.cjs.js +274 -0
- package/dist/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js +261 -0
- package/dist/entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AzureUrlReader.cjs.js +148 -0
- package/dist/entrypoints/urlReader/lib/AzureUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/BitbucketCloudUrlReader.cjs.js +174 -0
- package/dist/entrypoints/urlReader/lib/BitbucketCloudUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/BitbucketServerUrlReader.cjs.js +170 -0
- package/dist/entrypoints/urlReader/lib/BitbucketServerUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/BitbucketUrlReader.cjs.js +182 -0
- package/dist/entrypoints/urlReader/lib/BitbucketUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js +132 -0
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GerritUrlReader.cjs.js +147 -0
- package/dist/entrypoints/urlReader/lib/GerritUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js +122 -0
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GithubUrlReader.cjs.js +226 -0
- package/dist/entrypoints/urlReader/lib/GithubUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js +277 -0
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GoogleGcsUrlReader.cjs.js +129 -0
- package/dist/entrypoints/urlReader/lib/GoogleGcsUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/HarnessUrlReader.cjs.js +120 -0
- package/dist/entrypoints/urlReader/lib/HarnessUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js +49 -0
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/UrlReaderPredicateMux.cjs.js +46 -0
- package/dist/entrypoints/urlReader/lib/UrlReaderPredicateMux.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/UrlReaders.cjs.js +68 -0
- package/dist/entrypoints/urlReader/lib/UrlReaders.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js +46 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadableArrayResponse.cjs.js +78 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadableArrayResponse.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/TarArchiveResponse.cjs.js +147 -0
- package/dist/entrypoints/urlReader/lib/tree/TarArchiveResponse.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/ZipArchiveResponse.cjs.js +161 -0
- package/dist/entrypoints/urlReader/lib/tree/ZipArchiveResponse.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/util.cjs.js +28 -0
- package/dist/entrypoints/urlReader/lib/tree/util.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/util.cjs.js +11 -0
- package/dist/entrypoints/urlReader/lib/util.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/urlReaderServiceFactory.cjs.js +29 -0
- package/dist/entrypoints/urlReader/urlReaderServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/userInfo/DefaultUserInfoService.cjs.js +59 -0
- package/dist/entrypoints/userInfo/DefaultUserInfoService.cjs.js.map +1 -0
- package/dist/entrypoints/userInfo/userInfoServiceFactory.cjs.js +17 -0
- package/dist/entrypoints/userInfo/userInfoServiceFactory.cjs.js.map +1 -0
- package/dist/httpAuth.cjs.js +3 -187
- package/dist/httpAuth.cjs.js.map +1 -1
- package/dist/httpRouter.cjs.js +2 -166
- package/dist/httpRouter.cjs.js.map +1 -1
- package/dist/index.cjs.js +4 -160
- package/dist/index.cjs.js.map +1 -1
- package/dist/lib/escapeRegExp.cjs.js +8 -0
- package/dist/lib/escapeRegExp.cjs.js.map +1 -0
- package/dist/lifecycle.cjs.js +3 -58
- package/dist/lifecycle.cjs.js.map +1 -1
- package/dist/logger.cjs.js +3 -12
- package/dist/logger.cjs.js.map +1 -1
- package/dist/package.json.cjs.js +252 -0
- package/dist/package.json.cjs.js.map +1 -0
- package/dist/permissions.cjs.js +3 -17
- package/dist/permissions.cjs.js.map +1 -1
- package/dist/rootConfig.cjs.js +4 -22
- package/dist/rootConfig.cjs.js.map +1 -1
- package/dist/rootHealth.cjs.js +3 -35
- package/dist/rootHealth.cjs.js.map +1 -1
- package/dist/rootHttpRouter.cjs.js +15 -651
- package/dist/rootHttpRouter.cjs.js.map +1 -1
- package/dist/rootLifecycle.cjs.js +3 -70
- package/dist/rootLifecycle.cjs.js.map +1 -1
- package/dist/rootLogger.cjs.js +4 -137
- package/dist/rootLogger.cjs.js.map +1 -1
- package/dist/scheduler.cjs.js +4 -693
- package/dist/scheduler.cjs.js.map +1 -1
- package/dist/scheduler.d.ts +2 -1
- package/dist/urlReader.cjs.js +32 -2962
- package/dist/urlReader.cjs.js.map +1 -1
- package/dist/userInfo.cjs.js +2 -64
- package/dist/userInfo.cjs.js.map +1 -1
- package/httpAuth/package.json +1 -1
- package/httpRouter/package.json +1 -1
- package/lifecycle/package.json +1 -1
- package/logger/package.json +1 -1
- package/package.json +20 -20
- package/permissions/package.json +1 -1
- package/rootConfig/package.json +1 -1
- package/rootHealth/package.json +1 -1
- package/rootHttpRouter/package.json +1 -1
- package/rootLifecycle/package.json +1 -1
- package/rootLogger/package.json +1 -1
- package/scheduler/package.json +1 -1
- package/urlReader/package.json +1 -1
- package/userInfo/package.json +1 -1
- package/dist/cjs/config-BDOwXIyo.cjs.js.map +0 -1
- package/dist/cjs/createConfigSecretEnumerator-DShyoWWL.cjs.js.map +0 -1
- package/dist/cjs/helpers-D2f1CG0o.cjs.js.map +0 -1
|
@@ -1,658 +1,22 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var platformPath = require('path');
|
|
12
|
-
var forge = require('node-forge');
|
|
13
|
-
var cors = require('cors');
|
|
14
|
-
var helmet = require('helmet');
|
|
15
|
-
var morgan = require('morgan');
|
|
16
|
-
var compression = require('compression');
|
|
17
|
-
var kebabCase = require('lodash/kebabCase');
|
|
18
|
-
var minimatch = require('minimatch');
|
|
19
|
-
var errors = require('@backstage/errors');
|
|
20
|
-
var crypto = require('crypto');
|
|
21
|
-
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
3
|
+
var DefaultRootHttpRouter = require('./entrypoints/rootHttpRouter/DefaultRootHttpRouter.cjs.js');
|
|
4
|
+
var createHealthRouter = require('./entrypoints/rootHttpRouter/createHealthRouter.cjs.js');
|
|
5
|
+
var config = require('./entrypoints/rootHttpRouter/http/config.cjs.js');
|
|
6
|
+
var createHttpServer = require('./entrypoints/rootHttpRouter/http/createHttpServer.cjs.js');
|
|
7
|
+
var MiddlewareFactory = require('./entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js');
|
|
8
|
+
var readCorsOptions = require('./entrypoints/rootHttpRouter/http/readCorsOptions.cjs.js');
|
|
9
|
+
var readHelmetOptions = require('./entrypoints/rootHttpRouter/http/readHelmetOptions.cjs.js');
|
|
10
|
+
var rootHttpRouterServiceFactory = require('./entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js');
|
|
22
11
|
|
|
23
|
-
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
24
12
|
|
|
25
|
-
function _interopNamespaceCompat(e) {
|
|
26
|
-
if (e && typeof e === 'object' && 'default' in e) return e;
|
|
27
|
-
var n = Object.create(null);
|
|
28
|
-
if (e) {
|
|
29
|
-
Object.keys(e).forEach(function (k) {
|
|
30
|
-
if (k !== 'default') {
|
|
31
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
32
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
get: function () { return e[k]; }
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
n.default = e;
|
|
40
|
-
return Object.freeze(n);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
var express__default = /*#__PURE__*/_interopDefaultCompat(express);
|
|
44
|
-
var trimEnd__default = /*#__PURE__*/_interopDefaultCompat(trimEnd);
|
|
45
|
-
var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
46
|
-
var http__namespace = /*#__PURE__*/_interopNamespaceCompat(http);
|
|
47
|
-
var https__namespace = /*#__PURE__*/_interopNamespaceCompat(https);
|
|
48
|
-
var stoppableServer__default = /*#__PURE__*/_interopDefaultCompat(stoppableServer);
|
|
49
|
-
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
50
|
-
var forge__default = /*#__PURE__*/_interopDefaultCompat(forge);
|
|
51
|
-
var cors__default = /*#__PURE__*/_interopDefaultCompat(cors);
|
|
52
|
-
var helmet__default = /*#__PURE__*/_interopDefaultCompat(helmet);
|
|
53
|
-
var morgan__default = /*#__PURE__*/_interopDefaultCompat(morgan);
|
|
54
|
-
var compression__default = /*#__PURE__*/_interopDefaultCompat(compression);
|
|
55
|
-
var kebabCase__default = /*#__PURE__*/_interopDefaultCompat(kebabCase);
|
|
56
|
-
|
|
57
|
-
function normalizePath(path) {
|
|
58
|
-
return `${trimEnd__default.default(path, "/")}/`;
|
|
59
|
-
}
|
|
60
|
-
class DefaultRootHttpRouter {
|
|
61
|
-
#indexPath;
|
|
62
|
-
#router = express.Router();
|
|
63
|
-
#namedRoutes = express.Router();
|
|
64
|
-
#indexRouter = express.Router();
|
|
65
|
-
#existingPaths = new Array();
|
|
66
|
-
static create(options) {
|
|
67
|
-
let indexPath;
|
|
68
|
-
if (options?.indexPath === false) {
|
|
69
|
-
indexPath = void 0;
|
|
70
|
-
} else if (options?.indexPath === void 0) {
|
|
71
|
-
indexPath = "/api/app";
|
|
72
|
-
} else if (options?.indexPath === "") {
|
|
73
|
-
throw new Error("indexPath option may not be an empty string");
|
|
74
|
-
} else {
|
|
75
|
-
indexPath = options.indexPath;
|
|
76
|
-
}
|
|
77
|
-
return new DefaultRootHttpRouter(indexPath);
|
|
78
|
-
}
|
|
79
|
-
constructor(indexPath) {
|
|
80
|
-
this.#indexPath = indexPath;
|
|
81
|
-
this.#router.use(this.#namedRoutes);
|
|
82
|
-
this.#router.use("/api/", (_req, _res, next) => {
|
|
83
|
-
next("router");
|
|
84
|
-
});
|
|
85
|
-
if (this.#indexPath) {
|
|
86
|
-
this.#router.use(this.#indexRouter);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
use(path, handler) {
|
|
90
|
-
if (path.match(/^[/\s]*$/)) {
|
|
91
|
-
throw new Error(`Root router path may not be empty`);
|
|
92
|
-
}
|
|
93
|
-
const conflictingPath = this.#findConflictingPath(path);
|
|
94
|
-
if (conflictingPath) {
|
|
95
|
-
throw new Error(
|
|
96
|
-
`Path ${path} conflicts with the existing path ${conflictingPath}`
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
this.#existingPaths.push(path);
|
|
100
|
-
this.#namedRoutes.use(path, handler);
|
|
101
|
-
if (this.#indexPath === path) {
|
|
102
|
-
this.#indexRouter.use(handler);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
handler() {
|
|
106
|
-
return this.#router;
|
|
107
|
-
}
|
|
108
|
-
#findConflictingPath(newPath) {
|
|
109
|
-
const normalizedNewPath = normalizePath(newPath);
|
|
110
|
-
for (const path of this.#existingPaths) {
|
|
111
|
-
const normalizedPath = normalizePath(path);
|
|
112
|
-
if (normalizedPath.startsWith(normalizedNewPath)) {
|
|
113
|
-
return path;
|
|
114
|
-
}
|
|
115
|
-
if (normalizedNewPath.startsWith(normalizedPath)) {
|
|
116
|
-
return path;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return void 0;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function createHealthRouter(options) {
|
|
124
|
-
const router = Router__default.default();
|
|
125
|
-
router.get(
|
|
126
|
-
"/.backstage/health/v1/readiness",
|
|
127
|
-
async (_request, response) => {
|
|
128
|
-
const { status, payload } = await options.health.getReadiness();
|
|
129
|
-
response.status(status).json(payload);
|
|
130
|
-
}
|
|
131
|
-
);
|
|
132
|
-
router.get(
|
|
133
|
-
"/.backstage/health/v1/liveness",
|
|
134
|
-
async (_request, response) => {
|
|
135
|
-
const { status, payload } = await options.health.getLiveness();
|
|
136
|
-
response.status(status).json(payload);
|
|
137
|
-
}
|
|
138
|
-
);
|
|
139
|
-
return router;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const FIVE_DAYS_IN_MS = 5 * 24 * 60 * 60 * 1e3;
|
|
143
|
-
const IP_HOSTNAME_REGEX = /:|^\d+\.\d+\.\d+\.\d+$/;
|
|
144
|
-
async function getGeneratedCertificate(hostname, logger) {
|
|
145
|
-
const hasModules = await fs__default.default.pathExists("node_modules");
|
|
146
|
-
let certPath;
|
|
147
|
-
if (hasModules) {
|
|
148
|
-
certPath = platformPath.resolve(
|
|
149
|
-
"node_modules/.cache/backstage-backend/dev-cert.pem"
|
|
150
|
-
);
|
|
151
|
-
await fs__default.default.ensureDir(platformPath.dirname(certPath));
|
|
152
|
-
} else {
|
|
153
|
-
certPath = platformPath.resolve(".dev-cert.pem");
|
|
154
|
-
}
|
|
155
|
-
if (await fs__default.default.pathExists(certPath)) {
|
|
156
|
-
try {
|
|
157
|
-
const cert = await fs__default.default.readFile(certPath);
|
|
158
|
-
const crt = forge__default.default.pki.certificateFromPem(cert.toString());
|
|
159
|
-
const remainingMs = crt.validity.notAfter.getTime() - Date.now();
|
|
160
|
-
if (remainingMs > FIVE_DAYS_IN_MS) {
|
|
161
|
-
logger.info("Using existing self-signed certificate");
|
|
162
|
-
return {
|
|
163
|
-
key: cert,
|
|
164
|
-
cert
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
} catch (error) {
|
|
168
|
-
logger.warn(`Unable to use existing self-signed certificate, ${error}`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
logger.info("Generating new self-signed certificate");
|
|
172
|
-
const newCert = await generateCertificate(hostname);
|
|
173
|
-
await fs__default.default.writeFile(certPath, newCert.cert + newCert.key, "utf8");
|
|
174
|
-
return newCert;
|
|
175
|
-
}
|
|
176
|
-
async function generateCertificate(hostname) {
|
|
177
|
-
const attributes = [
|
|
178
|
-
{
|
|
179
|
-
name: "commonName",
|
|
180
|
-
value: "dev-cert"
|
|
181
|
-
}
|
|
182
|
-
];
|
|
183
|
-
const sans = [
|
|
184
|
-
{
|
|
185
|
-
type: 2,
|
|
186
|
-
// DNS
|
|
187
|
-
value: "localhost"
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
type: 2,
|
|
191
|
-
value: "localhost.localdomain"
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
type: 2,
|
|
195
|
-
value: "[::1]"
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
type: 7,
|
|
199
|
-
// IP
|
|
200
|
-
ip: "127.0.0.1"
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
type: 7,
|
|
204
|
-
ip: "fe80::1"
|
|
205
|
-
}
|
|
206
|
-
];
|
|
207
|
-
if (!sans.find(({ value, ip }) => value === hostname || ip === hostname)) {
|
|
208
|
-
sans.push(
|
|
209
|
-
IP_HOSTNAME_REGEX.test(hostname) ? {
|
|
210
|
-
type: 7,
|
|
211
|
-
ip: hostname
|
|
212
|
-
} : {
|
|
213
|
-
type: 2,
|
|
214
|
-
value: hostname
|
|
215
|
-
}
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
const params = {
|
|
219
|
-
algorithm: "sha256",
|
|
220
|
-
keySize: 2048,
|
|
221
|
-
days: 30,
|
|
222
|
-
extensions: [
|
|
223
|
-
{
|
|
224
|
-
name: "keyUsage",
|
|
225
|
-
keyCertSign: true,
|
|
226
|
-
digitalSignature: true,
|
|
227
|
-
nonRepudiation: true,
|
|
228
|
-
keyEncipherment: true,
|
|
229
|
-
dataEncipherment: true
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
name: "extKeyUsage",
|
|
233
|
-
serverAuth: true,
|
|
234
|
-
clientAuth: true,
|
|
235
|
-
codeSigning: true,
|
|
236
|
-
timeStamping: true
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
name: "subjectAltName",
|
|
240
|
-
altNames: sans
|
|
241
|
-
}
|
|
242
|
-
]
|
|
243
|
-
};
|
|
244
|
-
return new Promise(
|
|
245
|
-
(resolve, reject) => require("selfsigned").generate(
|
|
246
|
-
attributes,
|
|
247
|
-
params,
|
|
248
|
-
(err, bundle) => {
|
|
249
|
-
if (err) {
|
|
250
|
-
reject(err);
|
|
251
|
-
} else {
|
|
252
|
-
resolve({ key: bundle.private, cert: bundle.cert });
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
)
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
async function createHttpServer(listener, options, deps) {
|
|
260
|
-
const server = await createServer(listener, options, deps);
|
|
261
|
-
const stopper = stoppableServer__default.default(server, 0);
|
|
262
|
-
const stopServer = stopper.stop.bind(stopper);
|
|
263
|
-
return Object.assign(server, {
|
|
264
|
-
start() {
|
|
265
|
-
return new Promise((resolve, reject) => {
|
|
266
|
-
const handleStartupError = (error) => {
|
|
267
|
-
server.close();
|
|
268
|
-
reject(error);
|
|
269
|
-
};
|
|
270
|
-
server.on("error", handleStartupError);
|
|
271
|
-
const { host, port } = options.listen;
|
|
272
|
-
server.listen(port, host, () => {
|
|
273
|
-
server.off("error", handleStartupError);
|
|
274
|
-
deps.logger.info(`Listening on ${host}:${port}`);
|
|
275
|
-
resolve();
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
},
|
|
279
|
-
stop() {
|
|
280
|
-
return new Promise((resolve, reject) => {
|
|
281
|
-
stopServer((error) => {
|
|
282
|
-
if (error) {
|
|
283
|
-
reject(error);
|
|
284
|
-
} else {
|
|
285
|
-
resolve();
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
},
|
|
290
|
-
port() {
|
|
291
|
-
const address = server.address();
|
|
292
|
-
if (typeof address === "string" || address === null) {
|
|
293
|
-
throw new Error(`Unexpected server address '${address}'`);
|
|
294
|
-
}
|
|
295
|
-
return address.port;
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
async function createServer(listener, options, deps) {
|
|
300
|
-
if (options.https) {
|
|
301
|
-
const { certificate } = options.https;
|
|
302
|
-
if (certificate.type === "generated") {
|
|
303
|
-
const credentials = await getGeneratedCertificate(
|
|
304
|
-
certificate.hostname,
|
|
305
|
-
deps.logger
|
|
306
|
-
);
|
|
307
|
-
return https__namespace.createServer(credentials, listener);
|
|
308
|
-
}
|
|
309
|
-
return https__namespace.createServer(certificate, listener);
|
|
310
|
-
}
|
|
311
|
-
return http__namespace.createServer(listener);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
function readHelmetOptions(config) {
|
|
315
|
-
const cspOptions = readCspDirectives(config);
|
|
316
|
-
return {
|
|
317
|
-
contentSecurityPolicy: {
|
|
318
|
-
useDefaults: false,
|
|
319
|
-
directives: applyCspDirectives(cspOptions)
|
|
320
|
-
},
|
|
321
|
-
// These are all disabled in order to maintain backwards compatibility
|
|
322
|
-
// when bumping helmet v5. We can't enable these by default because
|
|
323
|
-
// there is no way for users to configure them.
|
|
324
|
-
// TODO(Rugvip): We should give control of this setup to consumers
|
|
325
|
-
crossOriginEmbedderPolicy: false,
|
|
326
|
-
crossOriginOpenerPolicy: false,
|
|
327
|
-
crossOriginResourcePolicy: false,
|
|
328
|
-
originAgentCluster: false
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
function readCspDirectives(config) {
|
|
332
|
-
const cc = config?.getOptionalConfig("csp");
|
|
333
|
-
if (!cc) {
|
|
334
|
-
return void 0;
|
|
335
|
-
}
|
|
336
|
-
const result = {};
|
|
337
|
-
for (const key of cc.keys()) {
|
|
338
|
-
if (cc.get(key) === false) {
|
|
339
|
-
result[key] = false;
|
|
340
|
-
} else {
|
|
341
|
-
result[key] = cc.getStringArray(key);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
return result;
|
|
345
|
-
}
|
|
346
|
-
function applyCspDirectives(directives) {
|
|
347
|
-
const result = helmet__default.default.contentSecurityPolicy.getDefaultDirectives();
|
|
348
|
-
result["script-src"] = ["'self'", "'unsafe-eval'"];
|
|
349
|
-
delete result["form-action"];
|
|
350
|
-
if (directives) {
|
|
351
|
-
for (const [key, value] of Object.entries(directives)) {
|
|
352
|
-
const kebabCaseKey = kebabCase__default.default(key);
|
|
353
|
-
if (value === false) {
|
|
354
|
-
delete result[kebabCaseKey];
|
|
355
|
-
} else {
|
|
356
|
-
result[kebabCaseKey] = value;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
return result;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
function readCorsOptions(config) {
|
|
364
|
-
const cc = config?.getOptionalConfig("cors");
|
|
365
|
-
if (!cc) {
|
|
366
|
-
return { origin: false };
|
|
367
|
-
}
|
|
368
|
-
return removeUnknown({
|
|
369
|
-
origin: createCorsOriginMatcher(readStringArray(cc, "origin")),
|
|
370
|
-
methods: readStringArray(cc, "methods"),
|
|
371
|
-
allowedHeaders: readStringArray(cc, "allowedHeaders"),
|
|
372
|
-
exposedHeaders: readStringArray(cc, "exposedHeaders"),
|
|
373
|
-
credentials: cc.getOptionalBoolean("credentials"),
|
|
374
|
-
maxAge: cc.getOptionalNumber("maxAge"),
|
|
375
|
-
preflightContinue: cc.getOptionalBoolean("preflightContinue"),
|
|
376
|
-
optionsSuccessStatus: cc.getOptionalNumber("optionsSuccessStatus")
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
function removeUnknown(obj) {
|
|
380
|
-
return Object.fromEntries(
|
|
381
|
-
Object.entries(obj).filter(([, v]) => v !== void 0)
|
|
382
|
-
);
|
|
383
|
-
}
|
|
384
|
-
function readStringArray(config, key) {
|
|
385
|
-
const value = config.getOptional(key);
|
|
386
|
-
if (typeof value === "string") {
|
|
387
|
-
return [value];
|
|
388
|
-
} else if (!value) {
|
|
389
|
-
return void 0;
|
|
390
|
-
}
|
|
391
|
-
return config.getStringArray(key);
|
|
392
|
-
}
|
|
393
|
-
function createCorsOriginMatcher(allowedOriginPatterns) {
|
|
394
|
-
if (!allowedOriginPatterns) {
|
|
395
|
-
return void 0;
|
|
396
|
-
}
|
|
397
|
-
const allowedOriginMatchers = allowedOriginPatterns.map(
|
|
398
|
-
(pattern) => new minimatch.Minimatch(pattern, { nocase: true, noglobstar: true })
|
|
399
|
-
);
|
|
400
|
-
return (origin, callback) => {
|
|
401
|
-
return callback(
|
|
402
|
-
null,
|
|
403
|
-
allowedOriginMatchers.some((pattern) => pattern.match(origin ?? ""))
|
|
404
|
-
);
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
function handleBadError(error, logger) {
|
|
409
|
-
const logId = crypto.randomBytes(10).toString("hex");
|
|
410
|
-
logger.child({ logId }).error(`Filtered internal error with logId=${logId} from response`, error);
|
|
411
|
-
const newError = new Error(`An internal error occurred logId=${logId}`);
|
|
412
|
-
delete newError.stack;
|
|
413
|
-
return newError;
|
|
414
|
-
}
|
|
415
|
-
function applyInternalErrorFilter(error, logger) {
|
|
416
|
-
try {
|
|
417
|
-
errors.assertError(error);
|
|
418
|
-
} catch (assertionError) {
|
|
419
|
-
errors.assertError(assertionError);
|
|
420
|
-
return handleBadError(assertionError, logger);
|
|
421
|
-
}
|
|
422
|
-
const constructorName = error.constructor.name;
|
|
423
|
-
if (constructorName === "DatabaseError") {
|
|
424
|
-
return handleBadError(error, logger);
|
|
425
|
-
}
|
|
426
|
-
return error;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
class MiddlewareFactory {
|
|
430
|
-
#config;
|
|
431
|
-
#logger;
|
|
432
|
-
/**
|
|
433
|
-
* Creates a new {@link MiddlewareFactory}.
|
|
434
|
-
*/
|
|
435
|
-
static create(options) {
|
|
436
|
-
return new MiddlewareFactory(options);
|
|
437
|
-
}
|
|
438
|
-
constructor(options) {
|
|
439
|
-
this.#config = options.config;
|
|
440
|
-
this.#logger = options.logger;
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* Returns a middleware that unconditionally produces a 404 error response.
|
|
444
|
-
*
|
|
445
|
-
* @remarks
|
|
446
|
-
*
|
|
447
|
-
* Typically you want to place this middleware at the end of the chain, such
|
|
448
|
-
* that it's the last one attempted after no other routes matched.
|
|
449
|
-
*
|
|
450
|
-
* @returns An Express request handler
|
|
451
|
-
*/
|
|
452
|
-
notFound() {
|
|
453
|
-
return (_req, res) => {
|
|
454
|
-
res.status(404).end();
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
/**
|
|
458
|
-
* Returns the compression middleware.
|
|
459
|
-
*
|
|
460
|
-
* @remarks
|
|
461
|
-
*
|
|
462
|
-
* The middleware will attempt to compress response bodies for all requests
|
|
463
|
-
* that traverse through the middleware.
|
|
464
|
-
*/
|
|
465
|
-
compression() {
|
|
466
|
-
return compression__default.default();
|
|
467
|
-
}
|
|
468
|
-
/**
|
|
469
|
-
* Returns a request logging middleware.
|
|
470
|
-
*
|
|
471
|
-
* @remarks
|
|
472
|
-
*
|
|
473
|
-
* Typically you want to place this middleware at the start of the chain, such
|
|
474
|
-
* that it always logs requests whether they are "caught" by handlers farther
|
|
475
|
-
* down or not.
|
|
476
|
-
*
|
|
477
|
-
* @returns An Express request handler
|
|
478
|
-
*/
|
|
479
|
-
logging() {
|
|
480
|
-
const logger = this.#logger.child({
|
|
481
|
-
type: "incomingRequest"
|
|
482
|
-
});
|
|
483
|
-
const customMorganFormat = '[:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"';
|
|
484
|
-
return morgan__default.default(customMorganFormat, {
|
|
485
|
-
stream: {
|
|
486
|
-
write(message) {
|
|
487
|
-
logger.info(message.trimEnd());
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* Returns a middleware that implements the helmet library.
|
|
494
|
-
*
|
|
495
|
-
* @remarks
|
|
496
|
-
*
|
|
497
|
-
* This middleware applies security policies to incoming requests and outgoing
|
|
498
|
-
* responses. It is configured using config keys such as `backend.csp`.
|
|
499
|
-
*
|
|
500
|
-
* @see {@link https://helmetjs.github.io/}
|
|
501
|
-
*
|
|
502
|
-
* @returns An Express request handler
|
|
503
|
-
*/
|
|
504
|
-
helmet() {
|
|
505
|
-
return helmet__default.default(readHelmetOptions(this.#config.getOptionalConfig("backend")));
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* Returns a middleware that implements the cors library.
|
|
509
|
-
*
|
|
510
|
-
* @remarks
|
|
511
|
-
*
|
|
512
|
-
* This middleware handles CORS. It is configured using the config key
|
|
513
|
-
* `backend.cors`.
|
|
514
|
-
*
|
|
515
|
-
* @see {@link https://github.com/expressjs/cors}
|
|
516
|
-
*
|
|
517
|
-
* @returns An Express request handler
|
|
518
|
-
*/
|
|
519
|
-
cors() {
|
|
520
|
-
return cors__default.default(readCorsOptions(this.#config.getOptionalConfig("backend")));
|
|
521
|
-
}
|
|
522
|
-
/**
|
|
523
|
-
* Express middleware to handle errors during request processing.
|
|
524
|
-
*
|
|
525
|
-
* @remarks
|
|
526
|
-
*
|
|
527
|
-
* This is commonly the very last middleware in the chain.
|
|
528
|
-
*
|
|
529
|
-
* Its primary purpose is not to do translation of business logic exceptions,
|
|
530
|
-
* but rather to be a global catch-all for uncaught "fatal" errors that are
|
|
531
|
-
* expected to result in a 500 error. However, it also does handle some common
|
|
532
|
-
* error types (such as http-error exceptions, and the well-known error types
|
|
533
|
-
* in the `@backstage/errors` package) and returns the enclosed status code
|
|
534
|
-
* accordingly.
|
|
535
|
-
*
|
|
536
|
-
* It will also produce a response body with a serialized form of the error,
|
|
537
|
-
* unless a previous handler already did send a body. See
|
|
538
|
-
* {@link @backstage/errors#ErrorResponseBody} for the response shape used.
|
|
539
|
-
*
|
|
540
|
-
* @returns An Express error request handler
|
|
541
|
-
*/
|
|
542
|
-
error(options = {}) {
|
|
543
|
-
const showStackTraces = options.showStackTraces ?? process.env.NODE_ENV === "development";
|
|
544
|
-
const logger = this.#logger.child({
|
|
545
|
-
type: "errorHandler"
|
|
546
|
-
});
|
|
547
|
-
return (rawError, req, res, next) => {
|
|
548
|
-
const error = applyInternalErrorFilter(rawError, logger);
|
|
549
|
-
const statusCode = getStatusCode(error);
|
|
550
|
-
if (options.logAllErrors || statusCode >= 500) {
|
|
551
|
-
logger.error(`Request failed with status ${statusCode}`, error);
|
|
552
|
-
}
|
|
553
|
-
if (res.headersSent) {
|
|
554
|
-
next(error);
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
const body = {
|
|
558
|
-
error: errors.serializeError(error, { includeStack: showStackTraces }),
|
|
559
|
-
request: { method: req.method, url: req.url },
|
|
560
|
-
response: { statusCode }
|
|
561
|
-
};
|
|
562
|
-
res.status(statusCode).json(body);
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
function getStatusCode(error) {
|
|
567
|
-
const knownStatusCodeFields = ["statusCode", "status"];
|
|
568
|
-
for (const field of knownStatusCodeFields) {
|
|
569
|
-
const statusCode = error[field];
|
|
570
|
-
if (typeof statusCode === "number" && (statusCode | 0) === statusCode && // is whole integer
|
|
571
|
-
statusCode >= 100 && statusCode <= 599) {
|
|
572
|
-
return statusCode;
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
switch (error.name) {
|
|
576
|
-
case errors.NotModifiedError.name:
|
|
577
|
-
return 304;
|
|
578
|
-
case errors.InputError.name:
|
|
579
|
-
return 400;
|
|
580
|
-
case errors.AuthenticationError.name:
|
|
581
|
-
return 401;
|
|
582
|
-
case errors.NotAllowedError.name:
|
|
583
|
-
return 403;
|
|
584
|
-
case errors.NotFoundError.name:
|
|
585
|
-
return 404;
|
|
586
|
-
case errors.ConflictError.name:
|
|
587
|
-
return 409;
|
|
588
|
-
case errors.NotImplementedError.name:
|
|
589
|
-
return 501;
|
|
590
|
-
case errors.ServiceUnavailableError.name:
|
|
591
|
-
return 503;
|
|
592
|
-
}
|
|
593
|
-
return 500;
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
function defaultConfigure({ applyDefaults }) {
|
|
597
|
-
applyDefaults();
|
|
598
|
-
}
|
|
599
|
-
const rootHttpRouterServiceFactoryWithOptions = (options) => backendPluginApi.createServiceFactory({
|
|
600
|
-
service: backendPluginApi.coreServices.rootHttpRouter,
|
|
601
|
-
deps: {
|
|
602
|
-
config: backendPluginApi.coreServices.rootConfig,
|
|
603
|
-
rootLogger: backendPluginApi.coreServices.rootLogger,
|
|
604
|
-
lifecycle: backendPluginApi.coreServices.rootLifecycle,
|
|
605
|
-
health: backendPluginApi.coreServices.rootHealth
|
|
606
|
-
},
|
|
607
|
-
async factory({ config: config$1, rootLogger, lifecycle, health }) {
|
|
608
|
-
const { indexPath, configure = defaultConfigure } = options ?? {};
|
|
609
|
-
const logger = rootLogger.child({ service: "rootHttpRouter" });
|
|
610
|
-
const app = express__default.default();
|
|
611
|
-
const router = DefaultRootHttpRouter.create({ indexPath });
|
|
612
|
-
const middleware = MiddlewareFactory.create({ config: config$1, logger });
|
|
613
|
-
const routes = router.handler();
|
|
614
|
-
const healthRouter = createHealthRouter({ health });
|
|
615
|
-
const server = await createHttpServer(
|
|
616
|
-
app,
|
|
617
|
-
config.readHttpServerOptions(config$1.getOptionalConfig("backend")),
|
|
618
|
-
{ logger }
|
|
619
|
-
);
|
|
620
|
-
configure({
|
|
621
|
-
app,
|
|
622
|
-
server,
|
|
623
|
-
routes,
|
|
624
|
-
middleware,
|
|
625
|
-
config: config$1,
|
|
626
|
-
logger,
|
|
627
|
-
lifecycle,
|
|
628
|
-
healthRouter,
|
|
629
|
-
applyDefaults() {
|
|
630
|
-
app.use(middleware.helmet());
|
|
631
|
-
app.use(middleware.cors());
|
|
632
|
-
app.use(middleware.compression());
|
|
633
|
-
app.use(middleware.logging());
|
|
634
|
-
app.use(healthRouter);
|
|
635
|
-
app.use(routes);
|
|
636
|
-
app.use(middleware.notFound());
|
|
637
|
-
app.use(middleware.error());
|
|
638
|
-
}
|
|
639
|
-
});
|
|
640
|
-
lifecycle.addShutdownHook(() => server.stop());
|
|
641
|
-
await server.start();
|
|
642
|
-
return router;
|
|
643
|
-
}
|
|
644
|
-
});
|
|
645
|
-
const rootHttpRouterServiceFactory = Object.assign(
|
|
646
|
-
rootHttpRouterServiceFactoryWithOptions,
|
|
647
|
-
rootHttpRouterServiceFactoryWithOptions()
|
|
648
|
-
);
|
|
649
13
|
|
|
14
|
+
exports.DefaultRootHttpRouter = DefaultRootHttpRouter.DefaultRootHttpRouter;
|
|
15
|
+
exports.createHealthRouter = createHealthRouter.createHealthRouter;
|
|
650
16
|
exports.readHttpServerOptions = config.readHttpServerOptions;
|
|
651
|
-
exports.
|
|
652
|
-
exports.MiddlewareFactory = MiddlewareFactory;
|
|
653
|
-
exports.
|
|
654
|
-
exports.
|
|
655
|
-
exports.
|
|
656
|
-
exports.readHelmetOptions = readHelmetOptions;
|
|
657
|
-
exports.rootHttpRouterServiceFactory = rootHttpRouterServiceFactory;
|
|
17
|
+
exports.createHttpServer = createHttpServer.createHttpServer;
|
|
18
|
+
exports.MiddlewareFactory = MiddlewareFactory.MiddlewareFactory;
|
|
19
|
+
exports.readCorsOptions = readCorsOptions.readCorsOptions;
|
|
20
|
+
exports.readHelmetOptions = readHelmetOptions.readHelmetOptions;
|
|
21
|
+
exports.rootHttpRouterServiceFactory = rootHttpRouterServiceFactory.rootHttpRouterServiceFactory;
|
|
658
22
|
//# sourceMappingURL=rootHttpRouter.cjs.js.map
|