@pwrdrvr/microapps-router-lib 0.4.0-alpha.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/app-cache.d.ts +58 -0
  2. package/dist/app-cache.d.ts.map +1 -0
  3. package/dist/app-cache.js +154 -0
  4. package/dist/app-cache.js.map +1 -0
  5. package/dist/get-app-info.d.ts +9 -0
  6. package/dist/get-app-info.d.ts.map +1 -0
  7. package/dist/get-app-info.js +25 -0
  8. package/dist/get-app-info.js.map +1 -0
  9. package/dist/get-route.d.ts +83 -0
  10. package/dist/get-route.d.ts.map +1 -0
  11. package/dist/get-route.js +154 -0
  12. package/dist/get-route.js.map +1 -0
  13. package/dist/index.d.ts +6 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +14 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/log.d.ts +5 -0
  18. package/dist/lib/log.d.ts.map +1 -0
  19. package/dist/lib/log.js +11 -0
  20. package/dist/lib/log.js.map +1 -0
  21. package/dist/load-app-frame.d.ts +8 -0
  22. package/dist/load-app-frame.d.ts.map +1 -0
  23. package/dist/load-app-frame.js +38 -0
  24. package/dist/load-app-frame.js.map +1 -0
  25. package/dist/normalize-path-prefix.d.ts +8 -0
  26. package/dist/normalize-path-prefix.d.ts.map +1 -0
  27. package/dist/normalize-path-prefix.js +21 -0
  28. package/dist/normalize-path-prefix.js.map +1 -0
  29. package/dist/redirect-default-file.d.ts +18 -0
  30. package/dist/redirect-default-file.d.ts.map +1 -0
  31. package/dist/redirect-default-file.js +54 -0
  32. package/dist/redirect-default-file.js.map +1 -0
  33. package/dist/route-app.d.ts +23 -0
  34. package/dist/route-app.d.ts.map +1 -0
  35. package/dist/route-app.js +169 -0
  36. package/dist/route-app.js.map +1 -0
  37. package/package.json +5 -2
  38. package/src/app-cache.spec.ts +175 -0
  39. package/src/app-cache.ts +193 -0
  40. package/src/get-app-info.spec.ts +77 -0
  41. package/src/get-app-info.ts +31 -0
  42. package/src/get-route.spec.ts +585 -0
  43. package/src/get-route.ts +267 -0
  44. package/src/index.ts +5 -536
  45. package/src/load-app-frame.spec.ts +51 -0
  46. package/src/load-app-frame.ts +36 -0
  47. package/src/normalize-path-prefix.spec.ts +27 -0
  48. package/src/normalize-path-prefix.ts +18 -0
  49. package/src/redirect-default-file.spec.ts +98 -0
  50. package/src/redirect-default-file.ts +79 -0
  51. package/src/route-app.spec.ts +128 -0
  52. package/src/route-app.ts +202 -0
  53. package/src/index.spec.ts +0 -318
  54. /package/src/{index.prefix.spec.ts → get-route.prefix.spec.ts} +0 -0
@@ -0,0 +1,58 @@
1
+ import { DBManager, Rules, Version } from '@pwrdrvr/microapps-datalib';
2
+ export declare class AppVersionCache {
3
+ private negativeAppNameCache;
4
+ private appRulesCache;
5
+ private appVersionsCache;
6
+ private dbManager;
7
+ private static instance;
8
+ /**
9
+ * Get the AppVersionCache instance or create it
10
+ */
11
+ static GetInstance({ dbManager }: {
12
+ dbManager: DBManager;
13
+ }): AppVersionCache;
14
+ constructor({ dbManager }: {
15
+ dbManager: DBManager;
16
+ });
17
+ private get CacheIsEmpty();
18
+ /**
19
+ * Used to populate the cache when the cache is completely empty
20
+ * @param appName
21
+ */
22
+ private PopulateEmptyCache;
23
+ ClearCache(): void;
24
+ /**
25
+ * Get Rules for an app
26
+ *
27
+ * Populates the cache if empty
28
+ * Freshens a cache entry if it is stale
29
+ * Feturns the cached value if it is fresh
30
+ * Fetches a single item if the cache is not empty but the item is not in the cache
31
+ *
32
+ * @param appName
33
+ * @returns
34
+ */
35
+ GetRules({ key: { AppName }, }: {
36
+ key: {
37
+ AppName: string;
38
+ };
39
+ }): Promise<Rules | undefined>;
40
+ /**
41
+ * Get Version info for an app and semVer
42
+ *
43
+ * Populates the cache if empty
44
+ * Freshens a cache entry if it is stale
45
+ * Feturns the cached value if it is fresh
46
+ * Fetches a single item if the cache is not empty but the item is not in the cache
47
+ *
48
+ * @param appName
49
+ * @returns
50
+ */
51
+ GetVersionInfo({ key: { AppName, SemVer }, }: {
52
+ key: {
53
+ AppName: string;
54
+ SemVer: string;
55
+ };
56
+ }): Promise<Version | undefined>;
57
+ }
58
+ //# sourceMappingURL=app-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-cache.d.ts","sourceRoot":"","sources":["../src/app-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAOpF,qBAAa,eAAe;IAC1B,OAAO,CAAC,oBAAoB,CAAsC;IAClE,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,gBAAgB,CAAiD;IACzE,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;WACW,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,GAAG,eAAe;gBAQvE,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE;IAOnD,OAAO,KAAK,YAAY,GAEvB;IAED;;;OAGG;YACW,kBAAkB;IAoCzB,UAAU,IAAI,IAAI;IAKzB;;;;;;;;;;OAUG;IACU,QAAQ,CAAC,EACpB,GAAG,EAAE,EAAE,OAAO,EAAE,GACjB,EAAE;QACD,GAAG,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1B,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IA+B9B;;;;;;;;;;OAUG;IACU,cAAc,CAAC,EAC1B,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GACzB,EAAE;QACD,GAAG,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;CAiDjC"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppVersionCache = void 0;
4
+ const microapps_datalib_1 = require("@pwrdrvr/microapps-datalib");
5
+ class AppVersionCache {
6
+ /**
7
+ * Get the AppVersionCache instance or create it
8
+ */
9
+ static GetInstance({ dbManager }) {
10
+ if (!AppVersionCache.instance) {
11
+ AppVersionCache.instance = new AppVersionCache({ dbManager });
12
+ }
13
+ return AppVersionCache.instance;
14
+ }
15
+ constructor({ dbManager }) {
16
+ this.negativeAppNameCache = new Map();
17
+ this.appRulesCache = new Map();
18
+ this.appVersionsCache = new Map();
19
+ this.dbManager = dbManager;
20
+ }
21
+ get CacheIsEmpty() {
22
+ return this.appRulesCache.size === 0 && this.appVersionsCache.size === 0;
23
+ }
24
+ /**
25
+ * Used to populate the cache when the cache is completely empty
26
+ * @param appName
27
+ */
28
+ async PopulateEmptyCache({ key: { AppName }, }) {
29
+ const versionsAndRules = await microapps_datalib_1.Application.GetVersionsAndRules({
30
+ dbManager: this.dbManager,
31
+ key: { AppName },
32
+ });
33
+ if (!versionsAndRules || (versionsAndRules.Versions.length === 0 && !versionsAndRules.Rules)) {
34
+ this.negativeAppNameCache.set(AppName.toLowerCase(), {
35
+ timestamp: Date.now(),
36
+ data: undefined,
37
+ });
38
+ return;
39
+ }
40
+ // Remove negative cache entry if it exists
41
+ this.negativeAppNameCache.delete(AppName.toLowerCase());
42
+ this.appRulesCache.set(AppName.toLowerCase(), {
43
+ timestamp: Date.now(),
44
+ data: versionsAndRules.Rules,
45
+ });
46
+ const versionsMap = new Map();
47
+ for (const version of versionsAndRules.Versions) {
48
+ versionsMap.set(version.SemVer, {
49
+ timestamp: Date.now(),
50
+ data: version,
51
+ });
52
+ }
53
+ this.appVersionsCache.set(AppName.toLowerCase(), versionsMap);
54
+ }
55
+ ClearCache() {
56
+ this.appRulesCache.clear();
57
+ this.appVersionsCache.clear();
58
+ }
59
+ /**
60
+ * Get Rules for an app
61
+ *
62
+ * Populates the cache if empty
63
+ * Freshens a cache entry if it is stale
64
+ * Feturns the cached value if it is fresh
65
+ * Fetches a single item if the cache is not empty but the item is not in the cache
66
+ *
67
+ * @param appName
68
+ * @returns
69
+ */
70
+ async GetRules({ key: { AppName }, }) {
71
+ var _a;
72
+ const now = Date.now();
73
+ // Check the negative cache first
74
+ const negativeCacheEntry = this.negativeAppNameCache.get(AppName.toLowerCase());
75
+ if (negativeCacheEntry && now - negativeCacheEntry.timestamp < 60000) {
76
+ return undefined;
77
+ }
78
+ else if (negativeCacheEntry) {
79
+ this.negativeAppNameCache.delete(AppName.toLowerCase());
80
+ }
81
+ const ruleCacheEntry = this.appRulesCache.get(AppName.toLowerCase());
82
+ if (ruleCacheEntry && now - ruleCacheEntry.timestamp < 60000) {
83
+ return ruleCacheEntry.data;
84
+ }
85
+ if (this.CacheIsEmpty || !ruleCacheEntry) {
86
+ await this.PopulateEmptyCache({ key: { AppName } });
87
+ return (_a = this.appRulesCache.get(AppName.toLowerCase())) === null || _a === void 0 ? void 0 : _a.data;
88
+ }
89
+ const versionsAndRules = await microapps_datalib_1.Application.GetVersionsAndRules({
90
+ dbManager: this.dbManager,
91
+ key: { AppName: AppName },
92
+ });
93
+ this.appRulesCache.set(AppName.toLowerCase(), { timestamp: now, data: versionsAndRules.Rules });
94
+ return versionsAndRules.Rules;
95
+ }
96
+ /**
97
+ * Get Version info for an app and semVer
98
+ *
99
+ * Populates the cache if empty
100
+ * Freshens a cache entry if it is stale
101
+ * Feturns the cached value if it is fresh
102
+ * Fetches a single item if the cache is not empty but the item is not in the cache
103
+ *
104
+ * @param appName
105
+ * @returns
106
+ */
107
+ async GetVersionInfo({ key: { AppName, SemVer }, }) {
108
+ var _a, _b;
109
+ const now = Date.now();
110
+ // Check the negative cache first
111
+ const negativeCacheEntry = this.negativeAppNameCache.get(AppName.toLowerCase());
112
+ if (negativeCacheEntry && now - negativeCacheEntry.timestamp < 60000) {
113
+ return undefined;
114
+ }
115
+ else if (negativeCacheEntry) {
116
+ this.negativeAppNameCache.delete(AppName.toLowerCase());
117
+ }
118
+ // Check if we have the item cached and if it is fresh enough
119
+ const versionCacheEntry = this.appVersionsCache.get(AppName.toLowerCase());
120
+ if (versionCacheEntry) {
121
+ const versionInfo = versionCacheEntry.get(SemVer);
122
+ if (versionInfo && now - versionInfo.timestamp < 900000) {
123
+ return versionInfo.data;
124
+ }
125
+ }
126
+ if (this.CacheIsEmpty || !versionCacheEntry) {
127
+ await this.PopulateEmptyCache({ key: { AppName } });
128
+ if (!this.appVersionsCache) {
129
+ return undefined;
130
+ }
131
+ return (_b = (_a = this.appVersionsCache.get(AppName.toLowerCase())) === null || _a === void 0 ? void 0 : _a.get(SemVer)) === null || _b === void 0 ? void 0 : _b.data;
132
+ }
133
+ else {
134
+ // We have some data in the cache, but not for this version
135
+ // So we need to get the data for this version
136
+ const versionInfo = await microapps_datalib_1.Version.LoadVersion({
137
+ dbManager: this.dbManager,
138
+ key: { AppName, SemVer: SemVer },
139
+ });
140
+ if (!versionInfo) {
141
+ return undefined;
142
+ }
143
+ const versionsMap = this.appVersionsCache.get(AppName.toLowerCase());
144
+ if (!versionsMap) {
145
+ return undefined;
146
+ }
147
+ // Save the version info in the cache
148
+ versionsMap.set(SemVer, { timestamp: now, data: versionInfo });
149
+ return versionInfo;
150
+ }
151
+ }
152
+ }
153
+ exports.AppVersionCache = AppVersionCache;
154
+ //# sourceMappingURL=app-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-cache.js","sourceRoot":"","sources":["../src/app-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { DBManager } from '@pwrdrvr/microapps-datalib';
2
+ /**
3
+ * Determine if we have an appname or a catch all app
4
+ */
5
+ export declare function GetAppInfo(opts: {
6
+ dbManager: DBManager;
7
+ appName: string;
8
+ }): Promise<string | undefined>;
9
+ //# sourceMappingURL=get-app-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-app-info.d.ts","sourceRoot":"","sources":["../src/get-app-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAS,MAAM,4BAA4B,CAAC;AAG9D;;GAEG;AAEH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB9B"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetAppInfo = void 0;
4
+ const app_cache_1 = require("./app-cache");
5
+ /**
6
+ * Determine if we have an appname or a catch all app
7
+ */
8
+ async function GetAppInfo(opts) {
9
+ const { dbManager, appName } = opts;
10
+ let rules;
11
+ const appVersionCache = app_cache_1.AppVersionCache.GetInstance({ dbManager });
12
+ // Check if we got a matching app name
13
+ rules = await appVersionCache.GetRules({ key: { AppName: appName } });
14
+ if (rules && rules.AppName === appName.toLowerCase()) {
15
+ return appName;
16
+ }
17
+ // Check if we have a `[root]` app that is a catch all
18
+ rules = await appVersionCache.GetRules({ key: { AppName: '[root]' } });
19
+ if (rules && rules.AppName === '[root]') {
20
+ return '[root]';
21
+ }
22
+ return undefined;
23
+ }
24
+ exports.GetAppInfo = GetAppInfo;
25
+ //# sourceMappingURL=get-app-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-app-info.js","sourceRoot":"","sources":["../src/get-app-info.ts"],"names":[],"mappings":";;;AACA,2CAA8C;AAE9C;;GAEG;AAEI,KAAK,UAAU,UAAU,CAAC,IAGhC;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEpC,IAAI,KAAwB,CAAC;IAE7B,MAAM,eAAe,GAAG,2BAAe,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnE,sCAAsC;IACtC,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACtE,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE;QACpD,OAAO,OAAO,CAAC;KAChB;IAED,sDAAsD;IACtD,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE;QACvC,OAAO,QAAQ,CAAC;KACjB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAvBD,gCAuBC"}
@@ -0,0 +1,83 @@
1
+ import { DBManager } from '@pwrdrvr/microapps-datalib';
2
+ export interface IGetRouteResult {
3
+ /**
4
+ * HTTP status code for immediate response, immediate redirect, and errors
5
+ */
6
+ readonly statusCode?: number;
7
+ /**
8
+ * Error message for errors
9
+ */
10
+ readonly errorMessage?: string;
11
+ /**
12
+ * Location to redirect to
13
+ */
14
+ readonly redirectLocation?: string;
15
+ /**
16
+ * Optional headers for immediate response, immediate redirect, and errors
17
+ */
18
+ readonly headers?: Record<string, string>;
19
+ /**
20
+ *
21
+ *
22
+ * @example /myapp/1.0.0/index.html
23
+ * @example /myapp/1.0.1
24
+ * @example /myapp/1.0.2/some/path?query=string
25
+ */
26
+ readonly iFrameAppVersionPath?: string;
27
+ /**
28
+ * Name of the app if resolved
29
+ */
30
+ readonly appName?: string;
31
+ /**
32
+ * Version of the app if resolved
33
+ */
34
+ readonly semVer?: string;
35
+ /**
36
+ * Type of the app
37
+ */
38
+ readonly type?: 'apigwy' | 'lambda-url' | 'url' | 'static';
39
+ /**
40
+ * Startup type of the app (indirect with iframe or direct)
41
+ */
42
+ readonly startupType?: 'iframe' | 'direct';
43
+ /**
44
+ * URL to the app if resolved
45
+ */
46
+ readonly url?: string;
47
+ /**
48
+ * Does the extra app path start with /api/
49
+ */
50
+ readonly isAPIPath?: boolean;
51
+ }
52
+ export interface IGetRouteEvent {
53
+ readonly dbManager: DBManager;
54
+ /**
55
+ * rawPath from the Lambda event
56
+ */
57
+ readonly rawPath: string;
58
+ /**
59
+ * List of locale prefixes after the normalizedPathPrefix
60
+ *
61
+ * @default []
62
+ */
63
+ readonly locales?: string[];
64
+ /**
65
+ * Configured prefix of the deployment, must start with a / and not end with a /
66
+ */
67
+ readonly normalizedPathPrefix?: string;
68
+ /**
69
+ * Query string params, if any
70
+ * Checked for `appver=1.2.3` to override the app version
71
+ */
72
+ readonly queryStringParameters?: URLSearchParams;
73
+ }
74
+ /**
75
+ * Get information about immediate redirect, immediate response,
76
+ * or which host to route the request to.
77
+ *
78
+ * @param event
79
+ *
80
+ * @returns IGetRouteResult
81
+ */
82
+ export declare function GetRoute(event: IGetRouteEvent): Promise<IGetRouteResult>;
83
+ //# sourceMappingURL=get-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-route.d.ts","sourceRoot":"","sources":["../src/get-route.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAKvD,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE1C;;;;;;OAMG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;IAE3D;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAE3C;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAEvC;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,eAAe,CAAC;CAClD;AAED;;;;;;;GAOG;AAEH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAgK9E"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetRoute = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const log_1 = tslib_1.__importDefault(require("./lib/log"));
6
+ const get_app_info_1 = require("./get-app-info");
7
+ const route_app_1 = require("./route-app");
8
+ const redirect_default_file_1 = require("./redirect-default-file");
9
+ const app_cache_1 = require("./app-cache");
10
+ const log = log_1.default.Instance;
11
+ /**
12
+ * Get information about immediate redirect, immediate response,
13
+ * or which host to route the request to.
14
+ *
15
+ * @param event
16
+ *
17
+ * @returns IGetRouteResult
18
+ */
19
+ async function GetRoute(event) {
20
+ const { dbManager, normalizedPathPrefix = '', queryStringParameters, locales = [] } = event;
21
+ try {
22
+ const appVersionCache = app_cache_1.AppVersionCache.GetInstance({ dbManager });
23
+ if (!!normalizedPathPrefix && !event.rawPath.startsWith(normalizedPathPrefix)) {
24
+ // The prefix is required if configured, if missing we cannot serve this app
25
+ return { statusCode: 404, errorMessage: 'Request not routable' };
26
+ }
27
+ const pathAfterPrefix = normalizedPathPrefix && event.rawPath.startsWith(normalizedPathPrefix)
28
+ ? event.rawPath.slice(normalizedPathPrefix.length - 1)
29
+ : event.rawPath;
30
+ const pathAfterPrefixAndLocale = locales.reduce((path, locale) => {
31
+ if (path.startsWith(`/${locale}/`)) {
32
+ return path.slice(locale.length + 1);
33
+ }
34
+ return path;
35
+ }, pathAfterPrefix);
36
+ // /someapp will split into length 2 with ["", "someapp"] as results
37
+ // /someapp/somepath will split into length 3 with ["", "someapp", "somepath"] as results
38
+ // /someapp/somepath/ will split into length 3 with ["", "someapp", "somepath", ""] as results
39
+ // /someapp/somepath/somefile.foo will split into length 4 with ["", "someapp", "somepath", "somefile.foo", ""] as results
40
+ const partsAfterPrefixAndLocale = pathAfterPrefixAndLocale.split('/');
41
+ // Handle ${prefix}/_next/data/${semver}[/${locale}]/${appname}/route
42
+ let appName;
43
+ if (partsAfterPrefixAndLocale.length >= 4 &&
44
+ partsAfterPrefixAndLocale[1] === '_next' &&
45
+ partsAfterPrefixAndLocale[2] === 'data') {
46
+ // Remove locale if present after SemVer
47
+ const localeIsPresent = partsAfterPrefixAndLocale.length >= 5 &&
48
+ locales.some((locale) => partsAfterPrefixAndLocale[4] === locale);
49
+ const possibleAppNamePart = localeIsPresent
50
+ ? partsAfterPrefixAndLocale[5]
51
+ : partsAfterPrefixAndLocale[4];
52
+ // if partsAfterPrefix[4] has .json suffix, strip it
53
+ const possibleAppName = possibleAppNamePart.endsWith('.json')
54
+ ? possibleAppNamePart.slice(0, possibleAppNamePart.length - 5)
55
+ : possibleAppNamePart;
56
+ appName = await (0, get_app_info_1.GetAppInfo)({
57
+ dbManager,
58
+ appName: possibleAppName,
59
+ });
60
+ }
61
+ if (!appName) {
62
+ appName = await (0, get_app_info_1.GetAppInfo)({
63
+ dbManager,
64
+ appName: partsAfterPrefixAndLocale.length >= 2 ? partsAfterPrefixAndLocale[1] : '[root]',
65
+ });
66
+ }
67
+ if (!appName) {
68
+ return { statusCode: 404, errorMessage: 'App not found' };
69
+ }
70
+ const isRootApp = appName === '[root]';
71
+ const appNameOrRootTrailingSlash = isRootApp ? '' : `${appName}/`;
72
+ // Strip the appName from the start of the path, if there was one
73
+ const pathAfterAppName = isRootApp
74
+ ? pathAfterPrefixAndLocale
75
+ : pathAfterPrefixAndLocale.slice(appName.length + 1);
76
+ const partsAfterAppName = pathAfterAppName.split('/');
77
+ // Pass any parts after the appName/Version to the route handler
78
+ let additionalParts = '';
79
+ if (partsAfterAppName.length >= 2 && partsAfterAppName[1] !== '') {
80
+ additionalParts = partsAfterAppName.slice(1).join('/');
81
+ }
82
+ // Route an app and version (only) to include the defaultFile
83
+ // If the second part is not a version that exists, fall through to
84
+ // routing the app and glomming the rest of the path on to the end
85
+ if (partsAfterAppName.length === 2 ||
86
+ (partsAfterAppName.length === 3 && !partsAfterAppName[2])) {
87
+ // / semVer /
88
+ // ^ ^^^^^^ ^
89
+ // 0 1 2
90
+ // This may be an app and a version only
91
+ // If the request got here it's likely a static app that has no
92
+ // Lambda function
93
+ // Let's check if the part is a version, if it is, route to the default file
94
+ const versionInfo = await appVersionCache.GetVersionInfo({
95
+ key: { AppName: appName, SemVer: partsAfterAppName[1] },
96
+ });
97
+ if (versionInfo) {
98
+ const response = await (0, redirect_default_file_1.RedirectToDefaultFile)({
99
+ dbManager,
100
+ appName,
101
+ normalizedPathPrefix,
102
+ semVer: partsAfterAppName[1],
103
+ appNameOrRootTrailingSlash,
104
+ });
105
+ if (response) {
106
+ return response;
107
+ }
108
+ }
109
+ }
110
+ // Check for a version in the path
111
+ // Examples
112
+ // / semVer / somepath
113
+ // / _next / data / semVer / somepath
114
+ // Get the version afer `/_next/data/` from partsAfterPrefix
115
+ const possibleSemVerPathNextDataBasePath = partsAfterAppName.length >= 4 ? partsAfterAppName[3] : '';
116
+ const possibleSemVerPathNextData = partsAfterPrefixAndLocale.length >= 4 &&
117
+ partsAfterPrefixAndLocale[1] === '_next' &&
118
+ partsAfterPrefixAndLocale[2] == 'data'
119
+ ? partsAfterPrefixAndLocale[3]
120
+ : possibleSemVerPathNextDataBasePath;
121
+ const possibleSemVerPathAfterApp = partsAfterAppName.length >= 2 ? partsAfterAppName[1] : '';
122
+ // (/ something)?
123
+ // ^ ^^^^^^^^^^^^
124
+ // 0 1
125
+ // Got at least an application name, try to route it
126
+ const response = await (0, route_app_1.RouteApp)({
127
+ dbManager,
128
+ normalizedPathPrefix,
129
+ event,
130
+ appName,
131
+ possibleSemVerPathNextData,
132
+ possibleSemVerPathAfterApp,
133
+ possibleSemVerQuery: (queryStringParameters === null || queryStringParameters === void 0 ? void 0 : queryStringParameters.get('appver')) || '',
134
+ additionalParts,
135
+ appNameOrRootTrailingSlash,
136
+ });
137
+ if (response) {
138
+ return response;
139
+ }
140
+ return {
141
+ statusCode: 599,
142
+ errorMessage: `Router - Could not route: ${event.rawPath}, no matching route`,
143
+ };
144
+ }
145
+ catch (error) {
146
+ log.error('unexpected exception - returning 599', { statusCode: 599, error });
147
+ return {
148
+ statusCode: 599,
149
+ errorMessage: `Router - Could not route: ${event.rawPath}, ${error.message}`,
150
+ };
151
+ }
152
+ }
153
+ exports.GetRoute = GetRoute;
154
+ //# sourceMappingURL=get-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-route.js","sourceRoot":"","sources":["../src/get-route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { loadAppFrame } from './load-app-frame';
2
+ export { GetAppInfo } from './get-app-info';
3
+ export { normalizePathPrefix } from './normalize-path-prefix';
4
+ export { GetRoute, IGetRouteEvent, IGetRouteResult } from './get-route';
5
+ export { RedirectToDefaultFile } from './redirect-default-file';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedirectToDefaultFile = exports.GetRoute = exports.normalizePathPrefix = exports.GetAppInfo = exports.loadAppFrame = void 0;
4
+ var load_app_frame_1 = require("./load-app-frame");
5
+ Object.defineProperty(exports, "loadAppFrame", { enumerable: true, get: function () { return load_app_frame_1.loadAppFrame; } });
6
+ var get_app_info_1 = require("./get-app-info");
7
+ Object.defineProperty(exports, "GetAppInfo", { enumerable: true, get: function () { return get_app_info_1.GetAppInfo; } });
8
+ var normalize_path_prefix_1 = require("./normalize-path-prefix");
9
+ Object.defineProperty(exports, "normalizePathPrefix", { enumerable: true, get: function () { return normalize_path_prefix_1.normalizePathPrefix; } });
10
+ var get_route_1 = require("./get-route");
11
+ Object.defineProperty(exports, "GetRoute", { enumerable: true, get: function () { return get_route_1.GetRoute; } });
12
+ var redirect_default_file_1 = require("./redirect-default-file");
13
+ Object.defineProperty(exports, "RedirectToDefaultFile", { enumerable: true, get: function () { return redirect_default_file_1.RedirectToDefaultFile; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAAvC,8GAAA,YAAY,OAAA;AACrB,+CAA4C;AAAnC,0GAAA,UAAU,OAAA;AACnB,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,yCAAwE;AAA/D,qGAAA,QAAQ,OAAA;AACjB,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA"}
@@ -0,0 +1,5 @@
1
+ import { LambdaLog } from 'lambda-log';
2
+ export default class Log {
3
+ static Instance: LambdaLog;
4
+ }
5
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAc,QAAQ,YAGnB;CACJ"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lambda_log_1 = require("lambda-log");
4
+ class Log {
5
+ }
6
+ exports.default = Log;
7
+ Log.Instance = new lambda_log_1.LambdaLog({
8
+ silent: process.env.JEST_WORKER_ID !== undefined,
9
+ // debug: process.env.DEBUG ? true : false,
10
+ });
11
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":";;AAAA,2CAAuC;AAEvC,MAAqB,GAAG;;AAAxB,sBAKC;AAJe,YAAQ,GAAG,IAAI,sBAAS,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,SAAS;IAChD,2CAA2C;CAC5C,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Find and load the appFrame file
3
+ * @returns
4
+ */
5
+ export declare function loadAppFrame({ basePath }: {
6
+ basePath?: string;
7
+ }): string;
8
+ //# sourceMappingURL=load-app-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-app-frame.d.ts","sourceRoot":"","sources":["../src/load-app-frame.ts"],"names":[],"mappings":"AAMA;;;GAGG;AAEH,wBAAgB,YAAY,CAAC,EAAE,QAAc,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAwB9E"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadAppFrame = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path_1 = tslib_1.__importDefault(require("path"));
6
+ const fs_extra_1 = require("fs-extra");
7
+ const log_1 = tslib_1.__importDefault(require("./lib/log"));
8
+ const log = log_1.default.Instance;
9
+ /**
10
+ * Find and load the appFrame file
11
+ * @returns
12
+ */
13
+ function loadAppFrame({ basePath = '.' }) {
14
+ const paths = [
15
+ basePath,
16
+ path_1.default.join(basePath, '..'),
17
+ path_1.default.join(basePath, 'templates'),
18
+ basePath,
19
+ '/opt',
20
+ '/opt/templates',
21
+ ];
22
+ for (const pathRoot of paths) {
23
+ const fullPath = path_1.default.join(pathRoot, 'appFrame.html');
24
+ try {
25
+ if ((0, fs_extra_1.pathExistsSync)(fullPath)) {
26
+ log.info('found html file', { fullPath });
27
+ return (0, fs_extra_1.readFileSync)(fullPath, 'utf-8');
28
+ }
29
+ }
30
+ catch (_a) {
31
+ // Don't care - we get here if stat throws because the file does not exist
32
+ }
33
+ }
34
+ log.error('appFrame.html not found');
35
+ throw new Error('appFrame.html not found');
36
+ }
37
+ exports.loadAppFrame = loadAppFrame;
38
+ //# sourceMappingURL=load-app-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-app-frame.js","sourceRoot":"","sources":["../src/load-app-frame.ts"],"names":[],"mappings":";;;;AAAA,wDAAwB;AACxB,uCAAwD;AACxD,4DAA4B;AAE5B,MAAM,GAAG,GAAG,aAAG,CAAC,QAAQ,CAAC;AAEzB;;;GAGG;AAEH,SAAgB,YAAY,CAAC,EAAE,QAAQ,GAAG,GAAG,EAAyB;IACpE,MAAM,KAAK,GAAG;QACZ,QAAQ;QACR,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;QACzB,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;QAChC,QAAQ;QACR,MAAM;QACN,gBAAgB;KACjB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE;QAC5B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACtD,IAAI;YACF,IAAI,IAAA,yBAAc,EAAC,QAAQ,CAAC,EAAE;gBAC5B,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1C,OAAO,IAAA,uBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;aACxC;SACF;QAAC,WAAM;YACN,0EAA0E;SAC3E;KACF;IAED,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC7C,CAAC;AAxBD,oCAwBC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Ensure that the path starts with a / and does not end with a /
3
+ *
4
+ * @param pathPrefix
5
+ * @returns
6
+ */
7
+ export declare function normalizePathPrefix(pathPrefix: string): string;
8
+ //# sourceMappingURL=normalize-path-prefix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-path-prefix.d.ts","sourceRoot":"","sources":["../src/normalize-path-prefix.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAU9D"}