@forge/cli-shared 9.3.0-next.11-experimental-4b981ef → 9.3.0-next.13
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 +6 -18
- package/out/apps/template-module.d.ts.map +1 -1
- package/out/apps/template-module.js +5 -4
- package/out/apps/template.d.ts.map +1 -1
- package/out/apps/template.js +10 -4
- package/out/graphql/graphql-types.d.ts +661 -47
- package/out/graphql/graphql-types.d.ts.map +1 -1
- package/out/graphql/graphql-types.js +157 -31
- package/out/graphql/minimal-graphql-runner.d.ts +2 -1
- package/out/graphql/minimal-graphql-runner.d.ts.map +1 -1
- package/out/http-client/feedback-post-client.d.ts +1 -0
- package/out/http-client/feedback-post-client.d.ts.map +1 -1
- package/out/http-client/feedback-post-client.js +3 -1
- package/out/http-client/file-uploader.d.ts.map +1 -1
- package/out/http-client/file-uploader.js +9 -36
- package/out/http-client/global-edge-http-client.d.ts +1 -0
- package/out/http-client/global-edge-http-client.d.ts.map +1 -1
- package/out/http-client/trace.d.ts +2 -3
- package/out/http-client/trace.d.ts.map +1 -1
- package/out/service/statsig-service.d.ts.map +1 -1
- package/out/service/statsig-service.js +4 -2
- package/out/shared/error-handling.d.ts.map +1 -1
- package/out/shared/error-handling.js +4 -30
- package/out/tunnel/docker-compose-lifecycle.d.ts.map +1 -1
- package/out/tunnel/docker-compose-lifecycle.js +49 -13
- package/package.json +4 -2
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HttpFileUploader = exports.UploadFileEmptyError = exports.UploadFileNotFoundError = exports.CannotUploadFileError = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const
|
|
6
|
-
const https_1 = tslib_1.__importDefault(require("https"));
|
|
7
|
-
const url_1 = require("url");
|
|
5
|
+
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
|
8
6
|
const ui_1 = require("../ui");
|
|
9
7
|
class CannotUploadFileError extends Error {
|
|
10
8
|
}
|
|
@@ -15,7 +13,6 @@ exports.UploadFileNotFoundError = UploadFileNotFoundError;
|
|
|
15
13
|
class UploadFileEmptyError extends Error {
|
|
16
14
|
}
|
|
17
15
|
exports.UploadFileEmptyError = UploadFileEmptyError;
|
|
18
|
-
const NODE_REQUEST_TIMEOUT_MS = 30_000;
|
|
19
16
|
const validateFileContents = (filePath, fileContents) => {
|
|
20
17
|
if (!fileContents) {
|
|
21
18
|
throw new UploadFileNotFoundError(ui_1.Text.upload.error.notFound(filePath));
|
|
@@ -30,33 +27,6 @@ const checkResponse = async (response) => {
|
|
|
30
27
|
throw new CannotUploadFileError(ui_1.Text.upload.error.status(response.status, await response.text()));
|
|
31
28
|
}
|
|
32
29
|
};
|
|
33
|
-
const uploadWithNodeRequest = (url, headers, fileContents) => {
|
|
34
|
-
return new Promise((resolve, reject) => {
|
|
35
|
-
const parsedUrl = new url_1.URL(url);
|
|
36
|
-
const transport = parsedUrl.protocol === 'https:' ? https_1.default : http_1.default;
|
|
37
|
-
const request = transport.request(parsedUrl, {
|
|
38
|
-
method: 'PUT',
|
|
39
|
-
headers
|
|
40
|
-
}, (response) => {
|
|
41
|
-
const chunks = [];
|
|
42
|
-
response.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
|
|
43
|
-
response.on('end', () => {
|
|
44
|
-
const body = Buffer.concat(chunks).toString('utf-8');
|
|
45
|
-
resolve(new Response(body, {
|
|
46
|
-
status: response.statusCode ?? 500,
|
|
47
|
-
statusText: response.statusMessage,
|
|
48
|
-
headers: response.headers
|
|
49
|
-
}));
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
request.setTimeout(NODE_REQUEST_TIMEOUT_MS, () => {
|
|
53
|
-
request.destroy(new Error(`Request timed out after ${NODE_REQUEST_TIMEOUT_MS}ms`));
|
|
54
|
-
});
|
|
55
|
-
request.on('error', reject);
|
|
56
|
-
request.write(fileContents);
|
|
57
|
-
request.end();
|
|
58
|
-
});
|
|
59
|
-
};
|
|
60
30
|
class HttpFileUploader {
|
|
61
31
|
fileSystem;
|
|
62
32
|
constructor(fileSystem) {
|
|
@@ -65,11 +35,14 @@ class HttpFileUploader {
|
|
|
65
35
|
async uploadFromPath(url, filePath) {
|
|
66
36
|
const fileContents = this.fileSystem.readBinaryFile(filePath);
|
|
67
37
|
const validFileContents = validateFileContents(filePath, fileContents);
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
38
|
+
const response = await (0, node_fetch_1.default)(url, {
|
|
39
|
+
method: 'PUT',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/zip',
|
|
42
|
+
'Content-Length': validFileContents.length.toString()
|
|
43
|
+
},
|
|
44
|
+
body: validFileContents
|
|
45
|
+
});
|
|
73
46
|
await checkResponse(response);
|
|
74
47
|
}
|
|
75
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-edge-http-client.d.ts","sourceRoot":"","sources":["../../src/http-client/global-edge-http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI1B,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,GAAG,EAAE,GAAG;CAGrB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,GAAG,EAAE,GAAG;CAGrB;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,qBAAa,oBAAqB,YAAW,gBAAgB;IAC/C,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,KAAK;IAEzB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBnD,OAAO,CAAC,QAAQ;CAIjB"}
|
|
1
|
+
{"version":3,"file":"global-edge-http-client.d.ts","sourceRoot":"","sources":["../../src/http-client/global-edge-http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI1B,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,GAAG,EAAE,GAAG;CAGrB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,GAAG,EAAE,GAAG;CAGrB;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,qBAAa,oBAAqB,YAAW,gBAAgB;IAC/C,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,KAAK;IAEzB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBnD,OAAO,CAAC,QAAQ;CAIjB"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function getAtlassianTraceId(headers:
|
|
3
|
-
export {};
|
|
1
|
+
import { Headers } from 'node-fetch';
|
|
2
|
+
export declare function getAtlassianTraceId(headers: Headers): string | undefined;
|
|
4
3
|
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/http-client/trace.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/http-client/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAExE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statsig-service.d.ts","sourceRoot":"","sources":["../../src/service/statsig-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"statsig-service.d.ts","sourceRoot":"","sources":["../../src/service/statsig-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.StatsigService = exports.StatsigReader = void 0;
|
|
4
4
|
exports.cacheStatsigResult = cacheStatsigResult;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
|
5
7
|
const index_1 = require("../index");
|
|
6
8
|
class StatsigReader {
|
|
7
9
|
async testForgeCliTestGate() {
|
|
@@ -129,7 +131,7 @@ class StatsigService extends StatsigReader {
|
|
|
129
131
|
const baseURL = this.getEnvironmentFn(BASE_FEATURE_FLAG_SERVICE_URL);
|
|
130
132
|
const apiKey = this.getEnvironmentFn(STATSIG_API_KEYS);
|
|
131
133
|
const context = await this.context();
|
|
132
|
-
const response = await
|
|
134
|
+
const response = await (0, node_fetch_1.default)(`${baseURL}/frontend/gates`, {
|
|
133
135
|
headers: {
|
|
134
136
|
'x-api-key': apiKey,
|
|
135
137
|
'Content-Type': 'application/json'
|
|
@@ -161,7 +163,7 @@ class StatsigService extends StatsigReader {
|
|
|
161
163
|
const baseURL = this.getEnvironmentFn(BASE_FEATURE_FLAG_SERVICE_URL);
|
|
162
164
|
const apiKey = this.getEnvironmentFn(STATSIG_API_KEYS);
|
|
163
165
|
const context = await this.context();
|
|
164
|
-
const response = await
|
|
166
|
+
const response = await (0, node_fetch_1.default)(`${baseURL}/configurations`, {
|
|
165
167
|
headers: {
|
|
166
168
|
'x-api-key': apiKey,
|
|
167
169
|
'Content-Type': 'application/json'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handling.d.ts","sourceRoot":"","sources":["../../src/shared/error-handling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAK/B,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG;IACrF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAKF,MAAM,WAAW,kBAAkB;IACjC,aAAa,IAAI,cAAc,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"error-handling.d.ts","sourceRoot":"","sources":["../../src/shared/error-handling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAK/B,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG;IACrF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAKF,MAAM,WAAW,kBAAkB;IACjC,aAAa,IAAI,cAAc,CAAC;CACjC;AAMD,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAe3C;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,GAAG,GAAG,cAAc,CAOzD;AAED,qBAAa,SAAU,SAAQ,KAAM,YAAW,kBAAkB;IAE9D,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;gBAA9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,MAAM;IAKX,aAAa,IAAI,cAAc;IAM/B,WAAW,IAAI,OAAO;CAG9B;AAED,qBAAa,SAAU,SAAQ,SAAS;gBAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;IAIrD,WAAW,IAAI,OAAO;CAG9B;AAED,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;CAG7D;AAUD,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,OAAO,KAAK,EACZ,OAAO,MAAM,GAAG,IAAI,EACpB,wBAAwB,qBAAqB,KAC5C,OAAO,CAAC,KAAK,CAmCf,CAAC;AAOF,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAK1C,CAAC;AASF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,CAIrG;AAMD,eAAO,MAAM,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,KAAK,IAAI,KAIhE,CAAC;AAEF,qBAAa,eAAgB,SAAQ,SAAS;CAAG;AAEjD,qBAAa,cAAe,SAAQ,SAAS;CAAG;AAEhD,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,qBAAa,uBAAwB,SAAQ,SAAS;CAAG;AAEzD,qBAAa,aAAc,SAAQ,SAAS;IAGxC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAD3B,OAAO,CAAC,EAAE,MAAM,EACC,UAAU,GAAE,OAAe;IAKvC,WAAW;CAGnB;AAUD,qBAAa,wBAAyB,SAAQ,SAAS;gBAMzC,OAAO,CAAC,EAAE,MAAM;CAG7B;AAUD,qBAAa,mBAAoB,SAAQ,SAAS;gBAMpC,OAAO,CAAC,EAAE,MAAM;CAG7B"}
|
|
@@ -11,40 +11,14 @@ const assistant_cli_1 = require("./assistant-cli");
|
|
|
11
11
|
function isErrorWithAnalytics(e) {
|
|
12
12
|
return e.getAttributes !== undefined;
|
|
13
13
|
}
|
|
14
|
-
const NETWORK_CONNECTIVITY_ERROR_CODES = new Set([
|
|
15
|
-
'ENOTFOUND',
|
|
16
|
-
'ECONNRESET',
|
|
17
|
-
'ECONNREFUSED',
|
|
18
|
-
'ECONNABORTED',
|
|
19
|
-
'ENETUNREACH',
|
|
20
|
-
'EHOSTUNREACH',
|
|
21
|
-
'EAI_AGAIN',
|
|
22
|
-
'ETIMEDOUT',
|
|
23
|
-
'UND_ERR_CONNECT_TIMEOUT',
|
|
24
|
-
'UND_ERR_HEADERS_TIMEOUT',
|
|
25
|
-
'UND_ERR_SOCKET'
|
|
26
|
-
]);
|
|
27
|
-
function isLikelyNetworkError(e) {
|
|
28
|
-
if (!(e instanceof Error)) {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
if (e instanceof TypeError && e.message === 'fetch failed') {
|
|
32
|
-
const causeCode = e.cause && typeof e.cause === 'object' && typeof e.cause.code === 'string'
|
|
33
|
-
? e.cause.code
|
|
34
|
-
: undefined;
|
|
35
|
-
return causeCode ? NETWORK_CONNECTIVITY_ERROR_CODES.has(causeCode) : false;
|
|
36
|
-
}
|
|
37
|
-
if (e.constructor?.name === 'FetchError' && e.type === 'system') {
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
14
|
function isUserError(e) {
|
|
43
15
|
if (isErrorWithAnalytics(e)) {
|
|
44
16
|
return e.getAttributes().isUserError ?? false;
|
|
45
17
|
}
|
|
46
|
-
if (
|
|
47
|
-
|
|
18
|
+
if (e.constructor?.name === 'FetchError') {
|
|
19
|
+
if (e.type === 'system') {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
48
22
|
}
|
|
49
23
|
return false;
|
|
50
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-compose-lifecycle.d.ts","sourceRoot":"","sources":["../../src/tunnel/docker-compose-lifecycle.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAO3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AACpE,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"docker-compose-lifecycle.d.ts","sourceRoot":"","sources":["../../src/tunnel/docker-compose-lifecycle.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAO3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AACpE,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AAgCvD,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAC1C,eAAO,MAAM,uBAAuB,QAAW,CAAC;AAEhD,qBAAa,2BAA4B,SAAQ,SAAS;gBAC5C,UAAU,EAAE,MAAM;CAG/B;AAED,qBAAa,mCAAoC,SAAQ,SAAS;gBACpD,GAAG,CAAC,EAAE,KAAK;CAGxB;AAED,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,GAAG,CAAC,EAAE,KAAK;CAGxB;AAED,qBAAa,mCAAoC,SAAQ,SAAS;gBACpD,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK;CAG5C;AAED,qBAAa,+BAAgC,SAAQ,SAAS;gBAChD,YAAY,EAAE,MAAM;CAGjC;AAED,qBAAa,sCAAuC,SAAQ,SAAS;gBACvD,YAAY,EAAE,MAAM;CAGjC;AAED,qBAAa,yBAA0B,SAAQ,SAAS;gBAC1C,OAAO,EAAE,MAAM;CAG5B;AAMD,eAAO,MAAM,mCAAmC,GAAU,UAAU,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,oCAgFzG,CAAC;AAsFF,eAAO,MAAM,uBAAuB,GAAU,aAAa,MAAM,kBAYhE,CAAC;AAOF,eAAO,MAAM,uBAAuB,GAAU,uBAAuB,MAAM,EAAE,YAAY,MAAM,EAAE,QAAQ,MAAM,kBA8B9G,CAAC;AA6BF,eAAO,MAAM,qBAAqB,GAChC,uBAAuB,MAAM,EAC7B,YAAY,MAAM,EAClB,QAAQ,MAAM,KACb,OAAO,CAAC,MAAM,EAAE,CAgBlB,CAAC;AA2LF,eAAO,MAAM,sBAAsB,GACjC,YAAY,UAAU,EACtB,QAAQ,MAAM,EACd,eAAe,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,kBAmCtC,CAAC;AAgCF,eAAO,MAAM,2BAA2B,GAAU,cAAc,YAAY,kBAW3E,CAAC"}
|
|
@@ -15,6 +15,19 @@ exports.PROXY_SIDECAR_VOLUME_DIR = '/forge/container';
|
|
|
15
15
|
exports.CONTAINER_SERVICE_ASSETS = '.container-service-assets';
|
|
16
16
|
exports.K8S_AUTH_TOKEN_FILENAME = 'local-account';
|
|
17
17
|
const PROXY_SIDECAR_SERVICE_NAME = 'proxy-sidecar';
|
|
18
|
+
const PROXY_SIDECAR_IMAGE_PATH = 'forge-platform/proxy-sidecar:latest';
|
|
19
|
+
const PROXY_SIDECAR_REGISTRIES = {
|
|
20
|
+
portable: {
|
|
21
|
+
production: 'forge-registry.services.atlassian.com',
|
|
22
|
+
staging: 'forge-registry.stg.services.atlassian.com'
|
|
23
|
+
},
|
|
24
|
+
ecr: {
|
|
25
|
+
production: 'forge-ecr.services.atlassian.com',
|
|
26
|
+
staging: 'forge-ecr.stg.services.atlassian.com'
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const isStagingEnvironment = () => process.env.FORGE_GRAPHQL_GATEWAY?.startsWith('https://api-private.stg.atlassian.com/graphql') ?? false;
|
|
30
|
+
const getProxySidecarRegistry = (registryType) => PROXY_SIDECAR_REGISTRIES[registryType][isStagingEnvironment() ? 'staging' : 'production'];
|
|
18
31
|
const LIFECYCLE_PATTERNS = [
|
|
19
32
|
/Container .* (Starting|Started|Stopping|Stopped|Creating|Created|Recreated)/,
|
|
20
33
|
/Network .* (Creating|Created|Removing|Removed)/,
|
|
@@ -134,11 +147,10 @@ const adjustFilePath = (filePath) => {
|
|
|
134
147
|
const getProxySidecarConfig = async (serviceKey, containerKeys, port, appId, envId, serviceIndex, healthEndpointPath) => {
|
|
135
148
|
let fopBaseUrl = 'https://forge-outbound-proxy.services.atlassian.com';
|
|
136
149
|
let jwksUrl = 'https://forge.cdn.prod.atlassian-dev.net/.well-known/jwks.json';
|
|
137
|
-
|
|
138
|
-
if (
|
|
150
|
+
const proxySidecarRegistry = getProxySidecarRegistry('portable');
|
|
151
|
+
if (isStagingEnvironment()) {
|
|
139
152
|
fopBaseUrl = 'https://forge-outbound-proxy.stg.services.atlassian.com';
|
|
140
153
|
jwksUrl = 'https://forge.cdn.stg.atlassian-dev.net/.well-known/jwks.json';
|
|
141
|
-
proxySidecarImage = 'forge-ecr.stg.services.atlassian.com/forge-platform/proxy-sidecar:latest';
|
|
142
154
|
}
|
|
143
155
|
let appIdShort = appId;
|
|
144
156
|
if (appId.startsWith('ari:cloud:ecosystem::app/')) {
|
|
@@ -146,7 +158,7 @@ const getProxySidecarConfig = async (serviceKey, containerKeys, port, appId, env
|
|
|
146
158
|
}
|
|
147
159
|
return {
|
|
148
160
|
[PROXY_SIDECAR_SERVICE_NAME]: {
|
|
149
|
-
image:
|
|
161
|
+
image: `${proxySidecarRegistry}/${PROXY_SIDECAR_IMAGE_PATH}`,
|
|
150
162
|
container_name: getProxySidecarContainerName(serviceKey),
|
|
151
163
|
environment: [
|
|
152
164
|
`SERVICE_URL=http://${containerKeys[0]}:8080`,
|
|
@@ -190,19 +202,44 @@ const deleteDockerComposeFile = async (composeFile) => {
|
|
|
190
202
|
};
|
|
191
203
|
exports.deleteDockerComposeFile = deleteDockerComposeFile;
|
|
192
204
|
const startDockerComposeStack = async (dockerComposeFilePath, serviceKey, logger) => {
|
|
205
|
+
const pullOptions = {
|
|
206
|
+
cwd: path.dirname(dockerComposeFilePath),
|
|
207
|
+
log: true,
|
|
208
|
+
config: dockerComposeFilePath
|
|
209
|
+
};
|
|
193
210
|
try {
|
|
194
|
-
await (0, docker_compose_1.pullOne)(
|
|
195
|
-
cwd: path.dirname(dockerComposeFilePath),
|
|
196
|
-
log: true,
|
|
197
|
-
config: dockerComposeFilePath
|
|
198
|
-
});
|
|
211
|
+
await (0, docker_compose_1.pullOne)(PROXY_SIDECAR_SERVICE_NAME, pullOptions);
|
|
199
212
|
}
|
|
200
|
-
catch (
|
|
201
|
-
|
|
213
|
+
catch (portableRegistryError) {
|
|
214
|
+
logger.warn('Unable to pull the proxy sidecar image. Retrying from an alternate source...');
|
|
215
|
+
useEcrProxySidecarImage(dockerComposeFilePath);
|
|
216
|
+
try {
|
|
217
|
+
await (0, docker_compose_1.pullOne)(PROXY_SIDECAR_SERVICE_NAME, pullOptions);
|
|
218
|
+
}
|
|
219
|
+
catch (ecrRegistryError) {
|
|
220
|
+
throw new DockerUnableToPullProxySidecarImage(new Error(`Initial pull error: ${getDockerComposeErrorMessage(portableRegistryError)}. Retry error: ${getDockerComposeErrorMessage(ecrRegistryError)}`));
|
|
221
|
+
}
|
|
202
222
|
}
|
|
203
223
|
await waitForContainersToStart(dockerComposeFilePath, serviceKey, logger);
|
|
204
224
|
};
|
|
205
225
|
exports.startDockerComposeStack = startDockerComposeStack;
|
|
226
|
+
const getDockerComposeErrorMessage = (error) => {
|
|
227
|
+
if (error && typeof error === 'object') {
|
|
228
|
+
const dockerComposeError = error;
|
|
229
|
+
return dockerComposeError.err || dockerComposeError.out || dockerComposeError.message || 'Unknown Error Occurred.';
|
|
230
|
+
}
|
|
231
|
+
return error != null ? String(error) : 'Unknown Error Occurred.';
|
|
232
|
+
};
|
|
233
|
+
const useEcrProxySidecarImage = (dockerComposeFilePath) => {
|
|
234
|
+
const composeConfig = yaml.parse(fs.readFileSync(dockerComposeFilePath, 'utf8'));
|
|
235
|
+
const proxySidecar = composeConfig?.services?.[PROXY_SIDECAR_SERVICE_NAME];
|
|
236
|
+
if (!proxySidecar) {
|
|
237
|
+
throw new Error(`The Docker Compose file does not contain the ${PROXY_SIDECAR_SERVICE_NAME} service.`);
|
|
238
|
+
}
|
|
239
|
+
const ecrRegistry = getProxySidecarRegistry('ecr');
|
|
240
|
+
proxySidecar.image = `${ecrRegistry}/${PROXY_SIDECAR_IMAGE_PATH}`;
|
|
241
|
+
fs.writeFileSync(dockerComposeFilePath, yaml.stringify(composeConfig));
|
|
242
|
+
};
|
|
206
243
|
const determineComposeFlags = async (dockerComposeFilePath, serviceKey, logger) => {
|
|
207
244
|
const flags = ['--build', '--quiet-pull'];
|
|
208
245
|
try {
|
|
@@ -318,8 +355,7 @@ const waitForContainersToStart = async (dockerComposeFilePath, serviceKey, logge
|
|
|
318
355
|
callback: logFilter
|
|
319
356
|
}).catch((error) => {
|
|
320
357
|
clearTimeout(startupTimer);
|
|
321
|
-
|
|
322
|
-
reject(new DockerUnableToStartError(new Error(errorMessage)));
|
|
358
|
+
reject(new DockerUnableToStartError(new Error(getDockerComposeErrorMessage(error))));
|
|
323
359
|
});
|
|
324
360
|
setTimeout(async () => {
|
|
325
361
|
if (containersStarted)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/cli-shared",
|
|
3
|
-
"version": "9.3.0-next.
|
|
3
|
+
"version": "9.3.0-next.13",
|
|
4
4
|
"description": "Common functionality for Forge CLI",
|
|
5
5
|
"author": "Atlassian",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"generate-graphql-types": "graphql-codegen --config src/graphql/codegen.yml"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forge/manifest": "13.3.0-next.
|
|
15
|
+
"@forge/manifest": "13.3.0-next.8",
|
|
16
16
|
"@forge/util": "3.0.0",
|
|
17
17
|
"@forge/i18n": "1.0.0",
|
|
18
18
|
"@sentry/node": "7.106.0",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"inquirer-autocomplete-prompt": "^2.0.1",
|
|
40
40
|
"io-ts": "^2.2.22",
|
|
41
41
|
"keytar": "^7.9.0",
|
|
42
|
+
"node-fetch": "2.7.0",
|
|
42
43
|
"ora": "^5.4.1",
|
|
43
44
|
"recursive-readdir": "^2.2.3",
|
|
44
45
|
"semver": "^7.6.0",
|
|
@@ -65,6 +66,7 @@
|
|
|
65
66
|
"@types/inquirer-autocomplete-prompt": "^1.3.5",
|
|
66
67
|
"@types/jest": "^29.5.14",
|
|
67
68
|
"@types/node": "20.19.1",
|
|
69
|
+
"@types/node-fetch": "^2.6.12",
|
|
68
70
|
"@types/recursive-readdir": "^2.2.4",
|
|
69
71
|
"@types/tmp": "^0.2.6",
|
|
70
72
|
"jest-matcher-specific-error": "^1.0.0",
|