@optimizely/ocp-cli 1.3.3 → 1.3.4-beta.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.
@@ -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":"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"}
1
+ {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../../src/commands/dev-server/DevServer.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,28 @@ 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
+ if (method === 'GET') {
46
+ // For GET: retry on any exception
47
+ return true;
48
+ }
49
+ else {
50
+ // For other methods: only retry on socket errors (idempotent concern)
51
+ return isSocketError(error);
52
+ }
53
+ }
54
+ function shouldRetryResponse(method, status) {
55
+ // Only retry 5xx responses for GET requests
56
+ return method === 'GET' && status >= 500;
57
+ }
36
58
  async function request(method, uri, body) {
37
59
  const url = `${(0, Config_1.runtimeConfig)().rivendell}/${uri}`;
38
60
  const requestPayload = { method };
@@ -45,16 +67,50 @@ var RivendellApi;
45
67
  requestPayload.headers['content-type'] = 'application/json';
46
68
  requestPayload.body = JSON.stringify(body);
47
69
  }
48
- const response = await fetch(url, requestPayload);
49
- const responseText = await response.text();
50
- if (response.status < 200 || response.status >= 300) {
51
- const errorMsg = `Received a ${response.status} from OCP: ${getErrorMessage(response.status)}`;
52
- throw new ApiError(errorMsg, responseText, response);
70
+ let lastError;
71
+ let lastResponseText;
72
+ let lastStatus;
73
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
74
+ try {
75
+ debug(`[RivendellApi] ${method} ${url}${attempt > 0 ? ` (retry ${attempt})` : ''}`);
76
+ const response = await fetch(url, requestPayload);
77
+ debug(`[RivendellApi] Response ${response.status}`);
78
+ const responseText = await response.text();
79
+ // Check for 5xx and retry if applicable
80
+ if (shouldRetryResponse(method, response.status) && attempt < MAX_RETRIES) {
81
+ debug(`[RivendellApi] Server error ${response.status}, retrying...`);
82
+ lastStatus = response.status;
83
+ lastResponseText = responseText;
84
+ continue;
85
+ }
86
+ if (response.status < 200 || response.status >= 300) {
87
+ const errorMsg = `Received a ${response.status} from OCP: ${getErrorMessage(response.status)}`;
88
+ throw new ApiError(errorMsg, responseText, response);
89
+ }
90
+ return {
91
+ response,
92
+ body: responseText ? JSON.parse(responseText) : ''
93
+ };
94
+ }
95
+ catch (error) {
96
+ lastError = error;
97
+ if (shouldRetryException(method, error) && attempt < MAX_RETRIES) {
98
+ console.log(`[RivendellApi] ${isSocketError(error) ? 'Socket error' : 'Request failed'}, retrying...`);
99
+ continue;
100
+ }
101
+ throw error;
102
+ }
53
103
  }
54
- return {
55
- response,
56
- body: responseText ? JSON.parse(responseText) : ''
57
- };
104
+ // Exhausted retries - throw appropriate error
105
+ if (lastError) {
106
+ debug(lastError);
107
+ throw lastError;
108
+ }
109
+ if (lastStatus !== undefined) {
110
+ const errorMsg = `Received a ${lastStatus} from OCP after ${MAX_RETRIES} retries: ${getErrorMessage(lastStatus)}`;
111
+ throw new ApiError(errorMsg, lastResponseText || '', undefined);
112
+ }
113
+ throw new Error('Unexpected: no error or response after retries');
58
114
  }
59
115
  RivendellApi.request = request;
60
116
  function loadApiKey() {
@@ -85,5 +141,10 @@ var RivendellApi;
85
141
  return 'Unhandled error.';
86
142
  }
87
143
  }
144
+ function debug(...args) {
145
+ if (process.env.OCP_DEBUG === '1') {
146
+ console.debug(...args);
147
+ }
148
+ }
88
149
  })(RivendellApi = exports.RivendellApi || (exports.RivendellApi = {}));
89
150
  //# sourceMappingURL=RivendellApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RivendellApi.js","sourceRoot":"","sources":["../../src/lib/RivendellApi.ts"],"names":[],"mappings":"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"}
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"}
@@ -19,7 +19,11 @@ function formatError(error) {
19
19
  return sanitize(errorMessageFromJsonResponse(error));
20
20
  }
21
21
  else {
22
- return sanitize(error.message);
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,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KAChC;AACH,CAAC;AAZD,kCAYC;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"}
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"}
@@ -1468,7 +1468,7 @@
1468
1468
  }
1469
1469
  ],
1470
1470
  "package": {
1471
- "version": "1.3.3",
1471
+ "version": "1.3.4-beta.0",
1472
1472
  "name": "@optimizely/ocp-cli",
1473
1473
  "license": "Apache-2.0",
1474
1474
  "executable": "ocp"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optimizely/ocp-cli",
3
- "version": "1.3.3",
3
+ "version": "1.3.4-beta.0",
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": "^3.316.0",
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();
@@ -35,6 +35,31 @@ 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
+ if (method === 'GET') {
50
+ // For GET: retry on any exception
51
+ return true;
52
+ } else {
53
+ // For other methods: only retry on socket errors (idempotent concern)
54
+ return isSocketError(error);
55
+ }
56
+ }
57
+
58
+ function shouldRetryResponse(method: Method, status: number): boolean {
59
+ // Only retry 5xx responses for GET requests
60
+ return method === 'GET' && status >= 500;
61
+ }
62
+
38
63
  export async function request<T>(method: Method, uri: string, body?: any): Promise<ApiResponse<T>> {
39
64
  const url = `${runtimeConfig().rivendell}/${uri}`;
40
65
  const requestPayload: RequestInit = { method };
@@ -49,18 +74,56 @@ export namespace RivendellApi {
49
74
  requestPayload.body = JSON.stringify(body);
50
75
  }
51
76
 
52
- const response = await fetch(url, requestPayload);
53
- const responseText = await response.text();
77
+ let lastError: unknown;
78
+ let lastResponseText: string | undefined;
79
+ let lastStatus: number | undefined;
80
+
81
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
82
+ try {
83
+ debug(`[RivendellApi] ${method} ${url}${attempt > 0 ? ` (retry ${attempt})` : ''}`);
54
84
 
55
- if (response.status < 200 || response.status >= 300) {
56
- const errorMsg = `Received a ${response.status} from OCP: ${getErrorMessage(response.status)}`;
57
- throw new ApiError(errorMsg, responseText, response);
85
+ const response = await fetch(url, requestPayload);
86
+ debug(`[RivendellApi] Response ${response.status}`);
87
+
88
+ const responseText = await response.text();
89
+
90
+ // Check for 5xx and retry if applicable
91
+ if (shouldRetryResponse(method, response.status) && attempt < MAX_RETRIES) {
92
+ debug(`[RivendellApi] Server error ${response.status}, retrying...`);
93
+ lastStatus = response.status;
94
+ lastResponseText = responseText;
95
+ continue;
96
+ }
97
+
98
+ if (response.status < 200 || response.status >= 300) {
99
+ const errorMsg = `Received a ${response.status} from OCP: ${getErrorMessage(response.status)}`;
100
+ throw new ApiError(errorMsg, responseText, response);
101
+ }
102
+
103
+ return {
104
+ response,
105
+ body: responseText ? JSON.parse(responseText) : ''
106
+ };
107
+ } catch (error) {
108
+ lastError = error;
109
+ if (shouldRetryException(method, error) && attempt < MAX_RETRIES) {
110
+ console.log(`[RivendellApi] ${isSocketError(error) ? 'Socket error' : 'Request failed'}, retrying...`);
111
+ continue;
112
+ }
113
+ throw error;
114
+ }
58
115
  }
59
116
 
60
- return {
61
- response,
62
- body: responseText ? JSON.parse(responseText) : ''
63
- };
117
+ // Exhausted retries - throw appropriate error
118
+ if (lastError) {
119
+ debug(lastError);
120
+ throw lastError;
121
+ }
122
+ if (lastStatus !== undefined) {
123
+ const errorMsg = `Received a ${lastStatus} from OCP after ${MAX_RETRIES} retries: ${getErrorMessage(lastStatus)}`;
124
+ throw new ApiError(errorMsg, lastResponseText || '', undefined);
125
+ }
126
+ throw new Error('Unexpected: no error or response after retries');
64
127
  }
65
128
 
66
129
  function loadApiKey(): string {
@@ -95,4 +158,10 @@ export namespace RivendellApi {
95
158
  return 'Unhandled error.';
96
159
  }
97
160
  }
161
+
162
+ function debug(...args: any[]) {
163
+ if (process.env.OCP_DEBUG === '1') {
164
+ console.debug(...args);
165
+ }
166
+ }
98
167
  }
@@ -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
+ }
@@ -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
- return sanitize(error.message);
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