@optimizely/ocp-cli 1.3.3 → 1.3.4-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/dev-server/DevServer.js +15 -0
- package/dist/commands/dev-server/DevServer.js.map +1 -1
- package/dist/commands/directory/List.js +15 -1
- package/dist/commands/directory/List.js.map +1 -1
- package/dist/lib/RivendellApi.js +78 -9
- package/dist/lib/RivendellApi.js.map +1 -1
- package/dist/lib/Tracking.d.ts +15 -0
- package/dist/lib/Tracking.js +19 -0
- package/dist/lib/Tracking.js.map +1 -0
- package/dist/lib/formatError.js +5 -1
- package/dist/lib/formatError.js.map +1 -1
- package/dist/oo-cli.manifest.json +1 -1
- package/package.json +7 -5
- package/src/commands/dev-server/DevServer.ts +15 -0
- package/src/commands/directory/List.ts +16 -1
- package/src/lib/RivendellApi.ts +86 -9
- package/src/lib/Tracking.ts +22 -0
- package/src/lib/formatError.ts +5 -1
|
@@ -13,11 +13,13 @@ const os = require("os");
|
|
|
13
13
|
const path = require("path");
|
|
14
14
|
const semver = require("semver");
|
|
15
15
|
const oo_cli_1 = require("oo-cli");
|
|
16
|
+
const AppContext_1 = require("../../lib/AppContext");
|
|
16
17
|
const die_1 = require("../../lib/die");
|
|
17
18
|
const formatError_1 = require("../../lib/formatError");
|
|
18
19
|
const handleInterrupt_1 = require("../../lib/handleInterrupt");
|
|
19
20
|
const TerminalOutput_1 = require("../../lib/TerminalOutput");
|
|
20
21
|
const TeminalPassthru_1 = require("../../lib/TeminalPassthru");
|
|
22
|
+
const Tracking_1 = require("../../lib/Tracking");
|
|
21
23
|
/**
|
|
22
24
|
* Dev Server command - starts the local development server for OCP apps
|
|
23
25
|
* This is a top-level command (no namespace decorator), so it runs as `ocp dev-server`
|
|
@@ -47,6 +49,19 @@ let DevServerCommand = class DevServerCommand {
|
|
|
47
49
|
if (this.path) {
|
|
48
50
|
process.env.APP_ROOT_DIR = this.path;
|
|
49
51
|
}
|
|
52
|
+
// Track dev server start (fire-and-forget)
|
|
53
|
+
try {
|
|
54
|
+
const ctx = (0, AppContext_1.appContext)();
|
|
55
|
+
Tracking_1.Tracking.track({
|
|
56
|
+
action: 'dev_server_started',
|
|
57
|
+
appId: ctx.appId || 'unknown',
|
|
58
|
+
command: 'dev-server start',
|
|
59
|
+
version: ctx.version,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (_b) {
|
|
63
|
+
// Ignore - don't let tracking errors affect the command
|
|
64
|
+
}
|
|
50
65
|
// Import and call startServer from ocp-local-env (installed globally)
|
|
51
66
|
// Get the global npm modules path and construct the full package path
|
|
52
67
|
const globalRoot = TerminalOutput_1.TerminalOutput.exec('npm root -g').stdout.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../../src/commands/dev-server/DevServer.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+BAA+B;AAC/B,yBAAyB;AACzB,yBAAyB;AACzB,6BAA6B;AAC7B,iCAAiC;AACjC,mCAA4E;AAC5E,uCAAkC;AAClC,uDAAkD;AAClD,+DAA0D;AAC1D,6DAAwD;AACxD,+DAA2D;
|
|
1
|
+
{"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../../src/commands/dev-server/DevServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,22 @@ let ListCommand = class ListCommand {
|
|
|
27
27
|
async list() {
|
|
28
28
|
try {
|
|
29
29
|
const criteria = {
|
|
30
|
-
stages: [DeploymentStage.TEST, DeploymentStage.PRODUCTION]
|
|
30
|
+
stages: [DeploymentStage.TEST, DeploymentStage.PRODUCTION],
|
|
31
|
+
states: this.allStatuses ? [] : [AppVersionState.STOPPED, AppVersionState.ABANDONED],
|
|
31
32
|
};
|
|
33
|
+
if (!this.allStatuses) {
|
|
34
|
+
criteria.states = [
|
|
35
|
+
AppVersionState.NEW,
|
|
36
|
+
AppVersionState.PUBLISHED,
|
|
37
|
+
AppVersionState.BUILD_FAILED,
|
|
38
|
+
AppVersionState.STARTING,
|
|
39
|
+
AppVersionState.START_FAILED,
|
|
40
|
+
AppVersionState.RUNNING,
|
|
41
|
+
AppVersionState.UPGRADING_RUNTIME,
|
|
42
|
+
AppVersionState.STOPPING,
|
|
43
|
+
AppVersionState.STOP_FAILED
|
|
44
|
+
];
|
|
45
|
+
}
|
|
32
46
|
if (this.appId) {
|
|
33
47
|
criteria.appId = this.appId;
|
|
34
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"List.js","sourceRoot":"","sources":["../../../src/commands/directory/List.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+BAA+B;AAC/B,mCAA+E;AAC/E,iCAAiC;AACjC,oCAAoC;AACpC,uCAAkC;AAClC,qEAAgE;AAChE,uDAAyD;AACzD,mDAA8C;AAC9C,uDAAkD;AAElD,IAAO,eAAe,GAAG,qBAAS,CAAC,eAAe,CAAC;AACnD,IAAO,eAAe,GAAG,qBAAS,CAAC,eAAe,CAAC;AAEnD,IAAO,YAAY,GAAG,qBAAS,CAAC,YAAY,CAAC;AAGtC,IAAM,WAAW,GAAjB,MAAM,WAAW;IAAjB;QAQG,gBAAW,GAAY,KAAK,CAAC;QAI7B,iBAAY,GAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"List.js","sourceRoot":"","sources":["../../../src/commands/directory/List.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/RivendellApi.js
CHANGED
|
@@ -33,6 +33,36 @@ var RivendellApi;
|
|
|
33
33
|
return request('DELETE', uri);
|
|
34
34
|
}
|
|
35
35
|
RivendellApi.delete_ = delete_;
|
|
36
|
+
const MAX_RETRIES = 2;
|
|
37
|
+
function isSocketError(error) {
|
|
38
|
+
if (error instanceof Error && 'cause' in error) {
|
|
39
|
+
const cause = error.cause;
|
|
40
|
+
return (cause === null || cause === void 0 ? void 0 : cause.code) === 'UND_ERR_SOCKET' || (cause === null || cause === void 0 ? void 0 : cause.code) === 'ECONNRESET' || (cause === null || cause === void 0 ? void 0 : cause.code) === 'EPIPE';
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
function shouldRetryException(method, error) {
|
|
45
|
+
var _a;
|
|
46
|
+
// Check if error is an ApiError with a status code
|
|
47
|
+
if (error instanceof ApiError && ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status)) {
|
|
48
|
+
const status = error.response.status;
|
|
49
|
+
// Only retry 5xx errors for GET requests, never retry 3xx/4xx
|
|
50
|
+
return method === 'GET' && status >= 500;
|
|
51
|
+
}
|
|
52
|
+
// For non-ApiError exceptions (network failures, etc.)
|
|
53
|
+
if (method === 'GET') {
|
|
54
|
+
// For GET: retry on network exceptions
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// For other methods: only retry on socket errors (idempotent concern)
|
|
59
|
+
return isSocketError(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function shouldRetryResponse(method, status) {
|
|
63
|
+
// Only retry 5xx responses for GET requests
|
|
64
|
+
return method === 'GET' && status >= 500;
|
|
65
|
+
}
|
|
36
66
|
async function request(method, uri, body) {
|
|
37
67
|
const url = `${(0, Config_1.runtimeConfig)().rivendell}/${uri}`;
|
|
38
68
|
const requestPayload = { method };
|
|
@@ -45,16 +75,50 @@ var RivendellApi;
|
|
|
45
75
|
requestPayload.headers['content-type'] = 'application/json';
|
|
46
76
|
requestPayload.body = JSON.stringify(body);
|
|
47
77
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
78
|
+
let lastError;
|
|
79
|
+
let lastResponseText;
|
|
80
|
+
let lastStatus;
|
|
81
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
82
|
+
try {
|
|
83
|
+
debug(`[RivendellApi] ${method} ${url}${attempt > 0 ? ` (retry ${attempt})` : ''}`);
|
|
84
|
+
const response = await fetch(url, requestPayload);
|
|
85
|
+
debug(`[RivendellApi] Response ${response.status}`);
|
|
86
|
+
const responseText = await response.text();
|
|
87
|
+
// Check for 5xx and retry if applicable
|
|
88
|
+
if (shouldRetryResponse(method, response.status) && attempt < MAX_RETRIES) {
|
|
89
|
+
debug(`[RivendellApi] Server error ${response.status}, retrying...`);
|
|
90
|
+
lastStatus = response.status;
|
|
91
|
+
lastResponseText = responseText;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (response.status < 200 || response.status >= 300) {
|
|
95
|
+
const errorMsg = `Received a ${response.status} from OCP: ${getErrorMessage(response.status)}`;
|
|
96
|
+
throw new ApiError(errorMsg, responseText, response);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
response,
|
|
100
|
+
body: responseText ? JSON.parse(responseText) : ''
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
lastError = error;
|
|
105
|
+
if (shouldRetryException(method, error) && attempt < MAX_RETRIES) {
|
|
106
|
+
debug(`[RivendellApi] ${isSocketError(error) ? 'Socket error' : 'Request failed'}, retrying...`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
53
111
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
112
|
+
// Exhausted retries - throw appropriate error
|
|
113
|
+
if (lastError) {
|
|
114
|
+
debug(lastError);
|
|
115
|
+
throw lastError;
|
|
116
|
+
}
|
|
117
|
+
if (lastStatus !== undefined) {
|
|
118
|
+
const errorMsg = `Received a ${lastStatus} from OCP after ${MAX_RETRIES} retries: ${getErrorMessage(lastStatus)}`;
|
|
119
|
+
throw new ApiError(errorMsg, lastResponseText || '', undefined);
|
|
120
|
+
}
|
|
121
|
+
throw new Error('Unexpected: no error or response after retries');
|
|
58
122
|
}
|
|
59
123
|
RivendellApi.request = request;
|
|
60
124
|
function loadApiKey() {
|
|
@@ -85,5 +149,10 @@ var RivendellApi;
|
|
|
85
149
|
return 'Unhandled error.';
|
|
86
150
|
}
|
|
87
151
|
}
|
|
152
|
+
function debug(...args) {
|
|
153
|
+
if (process.env.OCP_DEBUG === '1') {
|
|
154
|
+
console.debug(...args);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
88
157
|
})(RivendellApi = exports.RivendellApi || (exports.RivendellApi = {}));
|
|
89
158
|
//# sourceMappingURL=RivendellApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RivendellApi.js","sourceRoot":"","sources":["../../src/lib/RivendellApi.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAC7B,qCAA4D;AAC5D,+BAA0B;AAI1B;;GAEG;AACH,IAAiB,YAAY,
|
|
1
|
+
{"version":3,"file":"RivendellApi.js","sourceRoot":"","sources":["../../src/lib/RivendellApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare namespace Tracking {
|
|
2
|
+
interface TrackingEvent {
|
|
3
|
+
action: string;
|
|
4
|
+
appId: string;
|
|
5
|
+
command: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
properties?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Send a tracking event to Segment via Rivendell.
|
|
11
|
+
* Fire-and-forget: does not await, never throws.
|
|
12
|
+
*/
|
|
13
|
+
export function track(event: TrackingEvent): void;
|
|
14
|
+
export {};
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Tracking = void 0;
|
|
4
|
+
const RivendellApi_1 = require("./RivendellApi");
|
|
5
|
+
var Tracking;
|
|
6
|
+
(function (Tracking) {
|
|
7
|
+
/**
|
|
8
|
+
* Send a tracking event to Segment via Rivendell.
|
|
9
|
+
* Fire-and-forget: does not await, never throws.
|
|
10
|
+
*/
|
|
11
|
+
function track(event) {
|
|
12
|
+
// Fire and forget - don't await
|
|
13
|
+
RivendellApi_1.RivendellApi.post('tracking/events', event).catch(() => {
|
|
14
|
+
// Silently ignore tracking failures
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
Tracking.track = track;
|
|
18
|
+
})(Tracking = exports.Tracking || (exports.Tracking = {}));
|
|
19
|
+
//# sourceMappingURL=Tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tracking.js","sourceRoot":"","sources":["../../src/lib/Tracking.ts"],"names":[],"mappings":";;;AAAA,iDAA4C;AAE5C,IAAiB,QAAQ,CAmBxB;AAnBD,WAAiB,QAAQ;IASvB;;;OAGG;IACH,SAAgB,KAAK,CAAC,KAAoB;QACxC,gCAAgC;QAChC,2BAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACrD,oCAAoC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IALe,cAAK,QAKpB,CAAA;AACH,CAAC,EAnBgB,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAmBxB"}
|
package/dist/lib/formatError.js
CHANGED
|
@@ -19,7 +19,11 @@ function formatError(error) {
|
|
|
19
19
|
return sanitize(errorMessageFromJsonResponse(error));
|
|
20
20
|
}
|
|
21
21
|
else {
|
|
22
|
-
|
|
22
|
+
let message = `${error.name}: ${error.message}`;
|
|
23
|
+
if ('cause' in error && error.cause instanceof Error) {
|
|
24
|
+
message += ` [Cause: ${error.cause.name}: ${error.cause.message}]`;
|
|
25
|
+
}
|
|
26
|
+
return sanitize(message);
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
29
|
exports.formatError = formatError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatError.js","sourceRoot":"","sources":["../../src/lib/formatError.ts"],"names":[],"mappings":";;;AAAA,iDAA4C;AAC5C,yCAAoC;AACpC,IAAO,iBAAiB,GAAG,2BAAY,CAAC,QAAQ,CAAC;AACjD,IAAO,aAAa,GAAG,mBAAQ,CAAC,QAAQ,CAAC;AAEzC,SAAgB,WAAW,CAAC,KAAY;;IACtC,IAAI,KAAK,YAAY,iBAAiB,EAAE;QACtC,IAAI,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,EAAE;YAClC,OAAO,mFAAmF,CAAC;SAC5F;aAAM;YACL,OAAO,QAAQ,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;SACtD;KACF;SAAM,IAAI,KAAK,YAAY,aAAa,EAAE;QACzC,OAAO,QAAQ,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;KACtD;SAAM;QACL,OAAO,
|
|
1
|
+
{"version":3,"file":"formatError.js","sourceRoot":"","sources":["../../src/lib/formatError.ts"],"names":[],"mappings":";;;AAAA,iDAA4C;AAC5C,yCAAoC;AACpC,IAAO,iBAAiB,GAAG,2BAAY,CAAC,QAAQ,CAAC;AACjD,IAAO,aAAa,GAAG,mBAAQ,CAAC,QAAQ,CAAC;AAEzC,SAAgB,WAAW,CAAC,KAAY;;IACtC,IAAI,KAAK,YAAY,iBAAiB,EAAE;QACtC,IAAI,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,EAAE;YAClC,OAAO,mFAAmF,CAAC;SAC5F;aAAM;YACL,OAAO,QAAQ,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;SACtD;KACF;SAAM,IAAI,KAAK,YAAY,aAAa,EAAE;QACzC,OAAO,QAAQ,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;KACtD;SAAM;QACL,IAAI,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,YAAY,KAAK,EAAE;YACpD,OAAO,IAAI,YAAY,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC;SACpE;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;KAC1B;AACH,CAAC;AAhBD,kCAgBC;AAED,SAAS,4BAA4B,CAAC,KAAwC;;IAC5E,MAAM,WAAW,GAAG,MAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,OAAO,0CAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACjE,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC,kBAAkB,CAAC,KAAI,KAAK,CAAC,YAAY,EAAE;QACnE,IAAI,QAAQ,CAAC;QACb,IAAI;YACF,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;SAC3C;QAAC,OAAO,CAAM,EAAE;YACf,OAAO,KAAK,CAAC,OAAO,CAAC;SACtB;QACD,8EAA8E;QAC9E,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnB,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO;gBAC5B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;gBACzB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;qBACvB,GAAG,CAAC,CAAC,SAAoC,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;qBACzF,IAAI,CAAC,IAAI,CAAC,CAAC;SACjB;KACF;IAED,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAS;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@optimizely/ocp-cli",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.4-beta.1",
|
|
4
4
|
"description": "Optimizely Connect Platform command line interface",
|
|
5
5
|
"repository": "https://github.com/ZaiusInc/ocp-cli",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -32,11 +32,10 @@
|
|
|
32
32
|
"test:e2e": "npx vitest run --config vitest.e2e.config.ts",
|
|
33
33
|
"test:e2e:watch": "npx vitest --config vitest.e2e.config.ts",
|
|
34
34
|
"test:all": "npm run test && npm run test:e2e",
|
|
35
|
-
"test:watch": "npx vitest"
|
|
36
|
-
"release": "release-it"
|
|
35
|
+
"test:watch": "npx vitest"
|
|
37
36
|
},
|
|
38
37
|
"dependencies": {
|
|
39
|
-
"@aws-sdk/client-s3": "
|
|
38
|
+
"@aws-sdk/client-s3": "3.896",
|
|
40
39
|
"@inquirer/prompts": "^7.2.4",
|
|
41
40
|
"adm-zip": "^0.4.13",
|
|
42
41
|
"chalk": "^4.1.2",
|
|
@@ -74,12 +73,15 @@
|
|
|
74
73
|
"copy": "^0.3.2",
|
|
75
74
|
"execa": "^9.6.0",
|
|
76
75
|
"nodemon": "^2.0.22",
|
|
77
|
-
"release-it": "^17.11.0",
|
|
78
76
|
"rimraf": "^3.0.2",
|
|
79
77
|
"tslint": "^5.16.0",
|
|
80
78
|
"typescript": "^4.7.4",
|
|
81
79
|
"vitest": "^1.6.0"
|
|
82
80
|
},
|
|
81
|
+
"resolutions": {
|
|
82
|
+
"@aws-sdk/types": "3.893.0",
|
|
83
|
+
"@aws-sdk/util-locate-window": "3.893.0"
|
|
84
|
+
},
|
|
83
85
|
"engines": {
|
|
84
86
|
"node": ">=18.0.0"
|
|
85
87
|
}
|
|
@@ -4,11 +4,13 @@ import * as os from 'os';
|
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import * as semver from 'semver';
|
|
6
6
|
import {command, defaultValue, flag, help, option, namespace} from 'oo-cli';
|
|
7
|
+
import {appContext} from '../../lib/AppContext';
|
|
7
8
|
import {die} from '../../lib/die';
|
|
8
9
|
import {formatError} from '../../lib/formatError';
|
|
9
10
|
import {handleInterrupt} from '../../lib/handleInterrupt';
|
|
10
11
|
import {TerminalOutput} from '../../lib/TerminalOutput';
|
|
11
12
|
import {TerminalPassthru} from '../../lib/TeminalPassthru';
|
|
13
|
+
import {Tracking} from '../../lib/Tracking';
|
|
12
14
|
|
|
13
15
|
/**
|
|
14
16
|
* Dev Server command - starts the local development server for OCP apps
|
|
@@ -67,6 +69,19 @@ export class DevServerCommand {
|
|
|
67
69
|
process.env.APP_ROOT_DIR = this.path;
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
// Track dev server start (fire-and-forget)
|
|
73
|
+
try {
|
|
74
|
+
const ctx = appContext();
|
|
75
|
+
Tracking.track({
|
|
76
|
+
action: 'dev_server_started',
|
|
77
|
+
appId: ctx.appId || 'unknown',
|
|
78
|
+
command: 'dev-server start',
|
|
79
|
+
version: ctx.version,
|
|
80
|
+
});
|
|
81
|
+
} catch {
|
|
82
|
+
// Ignore - don't let tracking errors affect the command
|
|
83
|
+
}
|
|
84
|
+
|
|
70
85
|
// Import and call startServer from ocp-local-env (installed globally)
|
|
71
86
|
// Get the global npm modules path and construct the full package path
|
|
72
87
|
const globalRoot = TerminalOutput.exec('npm root -g').stdout.trim();
|
|
@@ -33,9 +33,24 @@ export class ListCommand {
|
|
|
33
33
|
public async list(): Promise<void> {
|
|
34
34
|
try {
|
|
35
35
|
const criteria: AppVersionSearchCriteria = {
|
|
36
|
-
stages: [DeploymentStage.TEST, DeploymentStage.PRODUCTION]
|
|
36
|
+
stages: [DeploymentStage.TEST, DeploymentStage.PRODUCTION],
|
|
37
|
+
states: this.allStatuses ? [] : [AppVersionState.STOPPED, AppVersionState.ABANDONED],
|
|
37
38
|
};
|
|
38
39
|
|
|
40
|
+
if (!this.allStatuses) {
|
|
41
|
+
criteria.states = [
|
|
42
|
+
AppVersionState.NEW,
|
|
43
|
+
AppVersionState.PUBLISHED,
|
|
44
|
+
AppVersionState.BUILD_FAILED,
|
|
45
|
+
AppVersionState.STARTING,
|
|
46
|
+
AppVersionState.START_FAILED,
|
|
47
|
+
AppVersionState.RUNNING,
|
|
48
|
+
AppVersionState.UPGRADING_RUNTIME,
|
|
49
|
+
AppVersionState.STOPPING,
|
|
50
|
+
AppVersionState.STOP_FAILED
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
|
|
39
54
|
if (this.appId) {
|
|
40
55
|
criteria.appId = this.appId;
|
|
41
56
|
}
|
package/src/lib/RivendellApi.ts
CHANGED
|
@@ -35,6 +35,39 @@ export namespace RivendellApi {
|
|
|
35
35
|
return request('DELETE', uri);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
const MAX_RETRIES = 2;
|
|
39
|
+
|
|
40
|
+
function isSocketError(error: unknown): boolean {
|
|
41
|
+
if (error instanceof Error && 'cause' in error) {
|
|
42
|
+
const cause = error.cause as any;
|
|
43
|
+
return cause?.code === 'UND_ERR_SOCKET' || cause?.code === 'ECONNRESET' || cause?.code === 'EPIPE';
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function shouldRetryException(method: Method, error: unknown): boolean {
|
|
49
|
+
// Check if error is an ApiError with a status code
|
|
50
|
+
if (error instanceof ApiError && error.response?.status) {
|
|
51
|
+
const status = error.response.status;
|
|
52
|
+
// Only retry 5xx errors for GET requests, never retry 3xx/4xx
|
|
53
|
+
return method === 'GET' && status >= 500;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// For non-ApiError exceptions (network failures, etc.)
|
|
57
|
+
if (method === 'GET') {
|
|
58
|
+
// For GET: retry on network exceptions
|
|
59
|
+
return true;
|
|
60
|
+
} else {
|
|
61
|
+
// For other methods: only retry on socket errors (idempotent concern)
|
|
62
|
+
return isSocketError(error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function shouldRetryResponse(method: Method, status: number): boolean {
|
|
67
|
+
// Only retry 5xx responses for GET requests
|
|
68
|
+
return method === 'GET' && status >= 500;
|
|
69
|
+
}
|
|
70
|
+
|
|
38
71
|
export async function request<T>(method: Method, uri: string, body?: any): Promise<ApiResponse<T>> {
|
|
39
72
|
const url = `${runtimeConfig().rivendell}/${uri}`;
|
|
40
73
|
const requestPayload: RequestInit = { method };
|
|
@@ -49,18 +82,56 @@ export namespace RivendellApi {
|
|
|
49
82
|
requestPayload.body = JSON.stringify(body);
|
|
50
83
|
}
|
|
51
84
|
|
|
52
|
-
|
|
53
|
-
|
|
85
|
+
let lastError: unknown;
|
|
86
|
+
let lastResponseText: string | undefined;
|
|
87
|
+
let lastStatus: number | undefined;
|
|
54
88
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
89
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
90
|
+
try {
|
|
91
|
+
debug(`[RivendellApi] ${method} ${url}${attempt > 0 ? ` (retry ${attempt})` : ''}`);
|
|
92
|
+
|
|
93
|
+
const response = await fetch(url, requestPayload);
|
|
94
|
+
debug(`[RivendellApi] Response ${response.status}`);
|
|
95
|
+
|
|
96
|
+
const responseText = await response.text();
|
|
97
|
+
|
|
98
|
+
// Check for 5xx and retry if applicable
|
|
99
|
+
if (shouldRetryResponse(method, response.status) && attempt < MAX_RETRIES) {
|
|
100
|
+
debug(`[RivendellApi] Server error ${response.status}, retrying...`);
|
|
101
|
+
lastStatus = response.status;
|
|
102
|
+
lastResponseText = responseText;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (response.status < 200 || response.status >= 300) {
|
|
107
|
+
const errorMsg = `Received a ${response.status} from OCP: ${getErrorMessage(response.status)}`;
|
|
108
|
+
throw new ApiError(errorMsg, responseText, response);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
response,
|
|
113
|
+
body: responseText ? JSON.parse(responseText) : ''
|
|
114
|
+
};
|
|
115
|
+
} catch (error) {
|
|
116
|
+
lastError = error;
|
|
117
|
+
if (shouldRetryException(method, error) && attempt < MAX_RETRIES) {
|
|
118
|
+
debug(`[RivendellApi] ${isSocketError(error) ? 'Socket error' : 'Request failed'}, retrying...`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
58
123
|
}
|
|
59
124
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
125
|
+
// Exhausted retries - throw appropriate error
|
|
126
|
+
if (lastError) {
|
|
127
|
+
debug(lastError);
|
|
128
|
+
throw lastError;
|
|
129
|
+
}
|
|
130
|
+
if (lastStatus !== undefined) {
|
|
131
|
+
const errorMsg = `Received a ${lastStatus} from OCP after ${MAX_RETRIES} retries: ${getErrorMessage(lastStatus)}`;
|
|
132
|
+
throw new ApiError(errorMsg, lastResponseText || '', undefined);
|
|
133
|
+
}
|
|
134
|
+
throw new Error('Unexpected: no error or response after retries');
|
|
64
135
|
}
|
|
65
136
|
|
|
66
137
|
function loadApiKey(): string {
|
|
@@ -95,4 +166,10 @@ export namespace RivendellApi {
|
|
|
95
166
|
return 'Unhandled error.';
|
|
96
167
|
}
|
|
97
168
|
}
|
|
169
|
+
|
|
170
|
+
function debug(...args: any[]) {
|
|
171
|
+
if (process.env.OCP_DEBUG === '1') {
|
|
172
|
+
console.debug(...args);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
98
175
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {RivendellApi} from './RivendellApi';
|
|
2
|
+
|
|
3
|
+
export namespace Tracking {
|
|
4
|
+
interface TrackingEvent {
|
|
5
|
+
action: string;
|
|
6
|
+
appId: string;
|
|
7
|
+
command: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
properties?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Send a tracking event to Segment via Rivendell.
|
|
14
|
+
* Fire-and-forget: does not await, never throws.
|
|
15
|
+
*/
|
|
16
|
+
export function track(event: TrackingEvent): void {
|
|
17
|
+
// Fire and forget - don't await
|
|
18
|
+
RivendellApi.post('tracking/events', event).catch(() => {
|
|
19
|
+
// Silently ignore tracking failures
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
package/src/lib/formatError.ts
CHANGED
|
@@ -13,7 +13,11 @@ export function formatError(error: Error) {
|
|
|
13
13
|
} else if (error instanceof MoriaApiError) {
|
|
14
14
|
return sanitize(errorMessageFromJsonResponse(error));
|
|
15
15
|
} else {
|
|
16
|
-
|
|
16
|
+
let message = `${error.name}: ${error.message}`;
|
|
17
|
+
if ('cause' in error && error.cause instanceof Error) {
|
|
18
|
+
message += ` [Cause: ${error.cause.name}: ${error.cause.message}]`;
|
|
19
|
+
}
|
|
20
|
+
return sanitize(message);
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
|