@coralogix/rum-cli 1.1.1 → 1.1.3

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 (53) hide show
  1. package/README.md +50 -17
  2. package/api/rum-api.ts +50 -51
  3. package/cli/rum-cli.ts +41 -72
  4. package/cli/theme/index.ts +5 -0
  5. package/cli/validators/index.ts +14 -0
  6. package/dist/api/rum-api.d.ts +5 -2
  7. package/dist/api/rum-api.js +41 -36
  8. package/dist/cli/rum-cli.d.ts +1 -2
  9. package/dist/cli/rum-cli.js +24 -45
  10. package/dist/cli/theme/index.d.ts +3 -0
  11. package/dist/cli/theme/index.js +7 -0
  12. package/dist/cli/validators/index.d.ts +1 -0
  13. package/dist/cli/validators/index.js +16 -0
  14. package/dist/model/cli.model.js +1 -3
  15. package/dist/proto-models/com/coralogix/rum/v2/audit_log.js +62 -0
  16. package/dist/proto-models/com/coralogix/rum/v2/chunk.js +330 -0
  17. package/dist/proto-models/com/coralogix/rum/v2/file.js +140 -0
  18. package/dist/proto-models/com/coralogix/rum/v2/rum_service.js +233 -0
  19. package/dist/proto-models/com/coralogix/rum/v2/rum_source_map_service.js +181 -0
  20. package/dist/proto-models/com/coralogix/rum/v2/source_code_file_mapping.js +277 -0
  21. package/dist/proto-models/google/protobuf/descriptor.js +3612 -0
  22. package/dist/services/source-maps/source-maps.service.d.ts +3 -0
  23. package/dist/services/source-maps/source-maps.service.js +42 -0
  24. package/dist/services/source-maps/utils/traverse-folder.util.d.ts +2 -0
  25. package/dist/services/source-maps/utils/traverse-folder.util.js +42 -0
  26. package/generate-protos.sh +3 -3
  27. package/model/cli.model.ts +0 -2
  28. package/package.json +4 -4
  29. package/services/source-maps/source-maps.service.ts +31 -0
  30. package/{cli → services/source-maps}/utils/traverse-folder.util.ts +2 -2
  31. package/dist/cli/utils/traverse-folder.util.d.ts +0 -2
  32. package/dist/cli/utils/traverse-folder.util.js +0 -42
  33. package/dist/src/app/proto-models/com/coralogix/rum/v2/audit_log.js +0 -62
  34. package/dist/src/app/proto-models/com/coralogix/rum/v2/chunk.js +0 -330
  35. package/dist/src/app/proto-models/com/coralogix/rum/v2/file.js +0 -140
  36. package/dist/src/app/proto-models/com/coralogix/rum/v2/rum_service.js +0 -233
  37. package/dist/src/app/proto-models/com/coralogix/rum/v2/rum_source_map_service.js +0 -181
  38. package/dist/src/app/proto-models/com/coralogix/rum/v2/source_code_file_mapping.js +0 -277
  39. package/dist/src/app/proto-models/google/protobuf/descriptor.js +0 -3612
  40. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/audit_log.d.ts +0 -0
  41. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/chunk.d.ts +0 -0
  42. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/file.d.ts +0 -0
  43. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_service.d.ts +0 -0
  44. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_source_map_service.d.ts +0 -0
  45. /package/dist/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/source_code_file_mapping.d.ts +0 -0
  46. /package/dist/{src/app/proto-models → proto-models}/google/protobuf/descriptor.d.ts +0 -0
  47. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/audit_log.ts +0 -0
  48. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/chunk.ts +0 -0
  49. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/file.ts +0 -0
  50. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_service.ts +0 -0
  51. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/rum_source_map_service.ts +0 -0
  52. /package/{src/app/proto-models → proto-models}/com/coralogix/rum/v2/source_code_file_mapping.ts +0 -0
  53. /package/{src/app/proto-models → proto-models}/google/protobuf/descriptor.ts +0 -0
@@ -0,0 +1,3 @@
1
+ export declare class SourceMapsService {
2
+ static upload(application: string, releaseId: string, repoName: string, commitHash: string, orgName: string, folderPath: string, env: string, privateKey: string): Promise<void>;
3
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SourceMapsService = void 0;
13
+ const rum_source_map_service_1 = require("../../proto-models/com/coralogix/rum/v2/rum_source_map_service");
14
+ const traverse_folder_util_1 = require("./utils/traverse-folder.util");
15
+ const rum_api_1 = require("../../api/rum-api");
16
+ const theme_1 = require("../../cli/theme");
17
+ class SourceMapsService {
18
+ static upload(application, releaseId, repoName, commitHash, orgName, folderPath, env, privateKey) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ const request = rum_source_map_service_1.UploadSourceMapsRequest.create();
21
+ request.application = application;
22
+ request.releaseId = releaseId;
23
+ request.repoName = repoName;
24
+ request.commitHash = commitHash;
25
+ request.user = orgName;
26
+ console.log(theme_1.GRAY_COLOR, '🚀 Uploading source maps...');
27
+ try {
28
+ yield (0, traverse_folder_util_1.traverseFolder)(folderPath, request);
29
+ yield rum_api_1.RumApi.uploadSourceMaps(request, env, privateKey);
30
+ console.log(theme_1.GREEN_COLOR, '✅ Source maps uploaded successfully!');
31
+ console.log(theme_1.GREEN_COLOR, `✅ Total chunk files processed: ${request.files.length}`);
32
+ console.log(theme_1.GREEN_COLOR, '✅ Processing complete.');
33
+ }
34
+ catch (error) {
35
+ console.log(theme_1.RED_COLOR, '❌ An error occurred');
36
+ console.error(theme_1.RED_COLOR, error);
37
+ }
38
+ });
39
+ }
40
+ }
41
+ exports.SourceMapsService = SourceMapsService;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NlcnZpY2VzL3NvdXJjZS1tYXBzL3NvdXJjZS1tYXBzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsMkdBQXVHO0FBQ3ZHLHVFQUE0RDtBQUM1RCwrQ0FBeUM7QUFDekMsMkNBQW1FO0FBRW5FLE1BQWEsaUJBQWlCO0lBQzFCLE1BQU0sQ0FBTyxNQUFNLENBQUMsV0FBbUIsRUFBRSxTQUFpQixFQUFFLFFBQWdCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLEVBQUUsVUFBa0IsRUFBRSxHQUFXLEVBQUUsVUFBa0I7O1lBQ2xLLE1BQU0sT0FBTyxHQUFHLGdEQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRWpELE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBRXZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQVUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1lBRXZELElBQUk7Z0JBQ0EsTUFBTSxJQUFBLHFDQUFjLEVBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUUxQyxNQUFNLGdCQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFFeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBVyxFQUFFLHNDQUFzQyxDQUFDLENBQUM7Z0JBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQVcsRUFBRSxrQ0FBa0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFXLEVBQUUsd0JBQXdCLENBQUMsQ0FBQzthQUN0RDtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDbkM7UUFDTCxDQUFDO0tBQUE7Q0FDSjtBQXpCRCw4Q0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VwbG9hZFNvdXJjZU1hcHNSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vcHJvdG8tbW9kZWxzL2NvbS9jb3JhbG9naXgvcnVtL3YyL3J1bV9zb3VyY2VfbWFwX3NlcnZpY2VcIjtcbmltcG9ydCB7dHJhdmVyc2VGb2xkZXJ9IGZyb20gXCIuL3V0aWxzL3RyYXZlcnNlLWZvbGRlci51dGlsXCI7XG5pbXBvcnQge1J1bUFwaX0gZnJvbSBcIi4uLy4uL2FwaS9ydW0tYXBpXCI7XG5pbXBvcnQge0dSQVlfQ09MT1IsIEdSRUVOX0NPTE9SLCBSRURfQ09MT1J9IGZyb20gXCIuLi8uLi9jbGkvdGhlbWVcIjtcblxuZXhwb3J0IGNsYXNzIFNvdXJjZU1hcHNTZXJ2aWNlIHtcbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkKGFwcGxpY2F0aW9uOiBzdHJpbmcsIHJlbGVhc2VJZDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nLCBjb21taXRIYXNoOiBzdHJpbmcsIG9yZ05hbWU6IHN0cmluZywgZm9sZGVyUGF0aDogc3RyaW5nLCBlbnY6IHN0cmluZywgcHJpdmF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBVcGxvYWRTb3VyY2VNYXBzUmVxdWVzdC5jcmVhdGUoKTtcblxuICAgICAgICByZXF1ZXN0LmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247XG4gICAgICAgIHJlcXVlc3QucmVsZWFzZUlkID0gcmVsZWFzZUlkO1xuICAgICAgICByZXF1ZXN0LnJlcG9OYW1lID0gcmVwb05hbWU7XG4gICAgICAgIHJlcXVlc3QuY29tbWl0SGFzaCA9IGNvbW1pdEhhc2g7XG4gICAgICAgIHJlcXVlc3QudXNlciA9IG9yZ05hbWU7XG5cbiAgICAgICAgY29uc29sZS5sb2coR1JBWV9DT0xPUiwgJ/CfmoAgVXBsb2FkaW5nIHNvdXJjZSBtYXBzLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRyYXZlcnNlRm9sZGVyKGZvbGRlclBhdGgsIHJlcXVlc3QpO1xuXG4gICAgICAgICAgICBhd2FpdCBSdW1BcGkudXBsb2FkU291cmNlTWFwcyhyZXF1ZXN0LCBlbnYsIHByaXZhdGVLZXkpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhHUkVFTl9DT0xPUiwgJ+KchSBTb3VyY2UgbWFwcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhHUkVFTl9DT0xPUiwgYOKchSBUb3RhbCBjaHVuayBmaWxlcyBwcm9jZXNzZWQ6ICR7cmVxdWVzdC5maWxlcy5sZW5ndGh9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhHUkVFTl9DT0xPUiwgJ+KchSBQcm9jZXNzaW5nIGNvbXBsZXRlLicpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coUkVEX0NPTE9SLCAn4p2MIEFuIGVycm9yIG9jY3VycmVkJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFJFRF9DT0xPUiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==
@@ -0,0 +1,2 @@
1
+ import { UploadSourceMapsRequest } from "../../../proto-models/com/coralogix/rum/v2/rum_source_map_service";
2
+ export declare const traverseFolder: (folderPath: string, request: UploadSourceMapsRequest) => Promise<void>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.traverseFolder = void 0;
16
+ const fs_1 = require("fs");
17
+ const path_1 = __importDefault(require("path"));
18
+ const { readdir, stat, readFile } = fs_1.promises;
19
+ const traverseFolder = (folderPath, request) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const stack = [folderPath];
21
+ while (stack.length) {
22
+ const currentPath = stack.pop();
23
+ const entries = yield readdir(currentPath, { withFileTypes: true });
24
+ yield Promise.all(entries.map((file) => __awaiter(void 0, void 0, void 0, function* () {
25
+ const { name } = file;
26
+ const entryPath = path_1.default.join(currentPath, name);
27
+ const isDotMapFile = file.isFile() && name.endsWith('.js.map');
28
+ if (file.isDirectory())
29
+ stack.push(entryPath);
30
+ else if (isDotMapFile)
31
+ request.files.push(yield getFileMetadata(entryPath));
32
+ })));
33
+ }
34
+ });
35
+ exports.traverseFolder = traverseFolder;
36
+ const getFileMetadata = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
37
+ const { size } = yield stat(filePath);
38
+ const { name } = path_1.default.parse(filePath);
39
+ const content = yield readFile(filePath);
40
+ return { chunkName: name, size, content };
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVyc2UtZm9sZGVyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zb3VyY2UtbWFwcy91dGlscy90cmF2ZXJzZS1mb2xkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQkFBa0Q7QUFDbEQsZ0RBQXdCO0FBSXhCLE1BQU0sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLGFBQVUsQ0FBQztBQUV0QyxNQUFNLGNBQWMsR0FBRyxDQUFPLFVBQWtCLEVBQUUsT0FBZ0MsRUFBaUIsRUFBRTtJQUN4RyxNQUFNLEtBQUssR0FBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUNqQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQWEsTUFBTSxPQUFPLENBQUMsV0FBWSxFQUFFLEVBQUMsYUFBYSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFFN0UsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBTyxJQUFZLEVBQUUsRUFBRTtZQUNqRCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sU0FBUyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUvRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFFekMsSUFBSSxZQUFZO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDO0tBQ1A7QUFDTCxDQUFDLENBQUEsQ0FBQTtBQWpCWSxRQUFBLGNBQWMsa0JBaUIxQjtBQUVELE1BQU0sZUFBZSxHQUFHLENBQU8sUUFBZ0IsRUFBeUIsRUFBRTtJQUN0RSxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLGNBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFekMsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlbnQsIHByb21pc2VzIGFzIGZzUHJvbWlzZXN9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7VXBsb2FkU291cmNlTWFwc1JlcXVlc3R9IGZyb20gXCIuLi8uLi8uLi9wcm90by1tb2RlbHMvY29tL2NvcmFsb2dpeC9ydW0vdjIvcnVtX3NvdXJjZV9tYXBfc2VydmljZVwiO1xuaW1wb3J0IHtGaWxlTWV0YWRhdGF9IGZyb20gXCIuLi8uLi8uLi9wcm90by1tb2RlbHMvY29tL2NvcmFsb2dpeC9ydW0vdjIvZmlsZVwiO1xuXG5jb25zdCB7cmVhZGRpciwgc3RhdCwgcmVhZEZpbGV9ID0gZnNQcm9taXNlcztcblxuZXhwb3J0IGNvbnN0IHRyYXZlcnNlRm9sZGVyID0gYXN5bmMgKGZvbGRlclBhdGg6IHN0cmluZywgcmVxdWVzdDogVXBsb2FkU291cmNlTWFwc1JlcXVlc3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzdGFjazogc3RyaW5nW10gPSBbZm9sZGVyUGF0aF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGVudHJpZXM6IERpcmVudFtdID0gYXdhaXQgcmVhZGRpcihjdXJyZW50UGF0aCEsIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50cmllcy5tYXAoYXN5bmMgKGZpbGU6IERpcmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge25hbWV9ID0gZmlsZTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCBhcyBzdHJpbmcsIG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgaXNEb3RNYXBGaWxlID0gZmlsZS5pc0ZpbGUoKSAmJiBuYW1lLmVuZHNXaXRoKCcuanMubWFwJyk7XG5cbiAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHN0YWNrLnB1c2goZW50cnlQYXRoKTtcblxuICAgICAgICAgICAgZWxzZSBpZiAoaXNEb3RNYXBGaWxlKSByZXF1ZXN0LmZpbGVzLnB1c2goYXdhaXQgZ2V0RmlsZU1ldGFkYXRhKGVudHJ5UGF0aCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG5jb25zdCBnZXRGaWxlTWV0YWRhdGEgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8RmlsZU1ldGFkYXRhPiA9PiB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgc3RhdChmaWxlUGF0aCk7XG4gICAgY29uc3Qge25hbWV9ID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoKTtcblxuICAgIHJldHVybiB7Y2h1bmtOYW1lOiBuYW1lLCBzaXplLCBjb250ZW50fTtcbn1cbiJdfQ==
@@ -1,11 +1,11 @@
1
- if [ -d "./src/app/proto-models" ]; then rm -Rf ./src/app/proto-models; fi
2
- mkdir -p ./src/app/proto-models
1
+ if [ -d "./proto-models" ]; then rm -Rf ./proto-models; fi
2
+ mkdir -p ./proto-models
3
3
 
4
4
  protofetch fetch -f
5
5
 
6
6
  ./node_modules/.bin/grpc_tools_node_protoc \
7
7
  --plugin=protoc-gen-ts_proto=./node_modules/.bin/protoc-gen-ts_proto \
8
- --ts_proto_out=./src/app/proto-models \
8
+ --ts_proto_out=./proto-models \
9
9
  --descriptor_set_out=./protoset.bin --include_imports \
10
10
  --ts_proto_opt=oneof=unions \
11
11
  --ts_proto_opt=unrecognizedEnum=false \
@@ -4,6 +4,4 @@ export const envToDomain: Record<string, string> = {
4
4
  EU2: 'https://ng-api-grpc.eu2.coralogix.com:443',
5
5
  AP1: 'https://ng-api-grpc.app.coralogix.in:443',
6
6
  AP2: 'https://ng-api-grpc.coralogix.com:443',
7
- STAGING: 'https://ng-api-grpc.app.staging.coralogix.net:443',
8
- PRODUCTION: 'https://ng-api-grpc.coralogix.com:443',
9
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralogix/rum-cli",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "corlogix rum cli",
5
5
  "bin": {
6
6
  "coralogix-rum-cli": "dist/cli/rum-cli.js"
@@ -17,14 +17,14 @@
17
17
  "dependencies": {
18
18
  "bunyan": "^1.8.15",
19
19
  "commander": "^11.0.0",
20
+ "cx-protofetch": "0.0.20",
20
21
  "google-proto-files": "^3.0.1",
21
22
  "google-protobuf": "^3.19.3",
22
23
  "lodash": "^4.17.21",
23
24
  "nice-grpc": "^2.1.4",
24
25
  "pako": "^2.1.0",
25
26
  "prom-client": "^14.0.1",
26
- "protobufjs": "^7.2.4",
27
- "cx-protofetch": "0.0.20"
27
+ "protobufjs": "^7.2.4"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/bunyan": "^1.8.8",
@@ -42,5 +42,5 @@
42
42
  },
43
43
  "keywords": [],
44
44
  "author": "",
45
- "license": "ISC"
45
+ "license": "MIT"
46
46
  }
@@ -0,0 +1,31 @@
1
+ import {UploadSourceMapsRequest} from "../../proto-models/com/coralogix/rum/v2/rum_source_map_service";
2
+ import {traverseFolder} from "./utils/traverse-folder.util";
3
+ import {RumApi} from "../../api/rum-api";
4
+ import {GRAY_COLOR, GREEN_COLOR, RED_COLOR} from "../../cli/theme";
5
+
6
+ export class SourceMapsService {
7
+ static async upload(application: string, releaseId: string, repoName: string, commitHash: string, orgName: string, folderPath: string, env: string, privateKey: string): Promise<void> {
8
+ const request = UploadSourceMapsRequest.create();
9
+
10
+ request.application = application;
11
+ request.releaseId = releaseId;
12
+ request.repoName = repoName;
13
+ request.commitHash = commitHash;
14
+ request.user = orgName;
15
+
16
+ console.log(GRAY_COLOR, '🚀 Uploading source maps...');
17
+
18
+ try {
19
+ await traverseFolder(folderPath, request);
20
+
21
+ await RumApi.uploadSourceMaps(request, env, privateKey);
22
+
23
+ console.log(GREEN_COLOR, '✅ Source maps uploaded successfully!');
24
+ console.log(GREEN_COLOR, `✅ Total chunk files processed: ${request.files.length}`);
25
+ console.log(GREEN_COLOR, '✅ Processing complete.');
26
+ } catch (error) {
27
+ console.log(RED_COLOR, '❌ An error occurred');
28
+ console.error(RED_COLOR, error);
29
+ }
30
+ }
31
+ }
@@ -1,7 +1,7 @@
1
1
  import {Dirent, promises as fsPromises} from "fs";
2
2
  import path from "path";
3
- import {FileMetadata} from "../../src/app/proto-models/com/coralogix/rum/v2/file";
4
- import {UploadSourceMapsRequest} from "../../src/app/proto-models/com/coralogix/rum/v2/rum_source_map_service";
3
+ import {UploadSourceMapsRequest} from "../../../proto-models/com/coralogix/rum/v2/rum_source_map_service";
4
+ import {FileMetadata} from "../../../proto-models/com/coralogix/rum/v2/file";
5
5
 
6
6
  const {readdir, stat, readFile} = fsPromises;
7
7
 
@@ -1,2 +0,0 @@
1
- import { UploadSourceMapsRequest } from "../../src/app/proto-models/com/coralogix/rum/v2/rum_source_map_service";
2
- export declare const traverseFolder: (folderPath: string, request: UploadSourceMapsRequest) => Promise<void>;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.traverseFolder = void 0;
16
- const fs_1 = require("fs");
17
- const path_1 = __importDefault(require("path"));
18
- const { readdir, stat, readFile } = fs_1.promises;
19
- const traverseFolder = (folderPath, request) => __awaiter(void 0, void 0, void 0, function* () {
20
- const stack = [folderPath];
21
- while (stack.length) {
22
- const currentPath = stack.pop();
23
- const entries = yield readdir(currentPath, { withFileTypes: true });
24
- yield Promise.all(entries.map((file) => __awaiter(void 0, void 0, void 0, function* () {
25
- const { name } = file;
26
- const entryPath = path_1.default.join(currentPath, name);
27
- const isDotMapFile = file.isFile() && name.endsWith('.js.map');
28
- if (file.isDirectory())
29
- stack.push(entryPath);
30
- else if (isDotMapFile)
31
- request.files.push(yield getFileMetadata(entryPath));
32
- })));
33
- }
34
- });
35
- exports.traverseFolder = traverseFolder;
36
- const getFileMetadata = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
37
- const { size } = yield stat(filePath);
38
- const { name } = path_1.default.parse(filePath);
39
- const content = yield readFile(filePath);
40
- return { chunkName: name, size, content };
41
- });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVyc2UtZm9sZGVyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jbGkvdXRpbHMvdHJhdmVyc2UtZm9sZGVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQWtEO0FBQ2xELGdEQUF3QjtBQUl4QixNQUFNLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxhQUFVLENBQUM7QUFFdEMsTUFBTSxjQUFjLEdBQUcsQ0FBTyxVQUFrQixFQUFFLE9BQWdDLEVBQWlCLEVBQUU7SUFDeEcsTUFBTSxLQUFLLEdBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVyQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDakIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFhLE1BQU0sT0FBTyxDQUFDLFdBQVksRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBRTdFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQU8sSUFBWSxFQUFFLEVBQUU7WUFDakQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLFNBQVMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBRXpDLElBQUksWUFBWTtnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQztLQUNQO0FBQ0wsQ0FBQyxDQUFBLENBQUE7QUFqQlksUUFBQSxjQUFjLGtCQWlCMUI7QUFFRCxNQUFNLGVBQWUsR0FBRyxDQUFPLFFBQWdCLEVBQXlCLEVBQUU7SUFDdEUsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxjQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXpDLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZW50LCBwcm9taXNlcyBhcyBmc1Byb21pc2VzfSBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge0ZpbGVNZXRhZGF0YX0gZnJvbSBcIi4uLy4uL3NyYy9hcHAvcHJvdG8tbW9kZWxzL2NvbS9jb3JhbG9naXgvcnVtL3YyL2ZpbGVcIjtcbmltcG9ydCB7VXBsb2FkU291cmNlTWFwc1JlcXVlc3R9IGZyb20gXCIuLi8uLi9zcmMvYXBwL3Byb3RvLW1vZGVscy9jb20vY29yYWxvZ2l4L3J1bS92Mi9ydW1fc291cmNlX21hcF9zZXJ2aWNlXCI7XG5cbmNvbnN0IHtyZWFkZGlyLCBzdGF0LCByZWFkRmlsZX0gPSBmc1Byb21pc2VzO1xuXG5leHBvcnQgY29uc3QgdHJhdmVyc2VGb2xkZXIgPSBhc3luYyAoZm9sZGVyUGF0aDogc3RyaW5nLCByZXF1ZXN0OiBVcGxvYWRTb3VyY2VNYXBzUmVxdWVzdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHN0YWNrOiBzdHJpbmdbXSA9IFtmb2xkZXJQYXRoXTtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgZW50cmllczogRGlyZW50W10gPSBhd2FpdCByZWFkZGlyKGN1cnJlbnRQYXRoISwge3dpdGhGaWxlVHlwZXM6IHRydWV9KTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRyaWVzLm1hcChhc3luYyAoZmlsZTogRGlyZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7bmFtZX0gPSBmaWxlO1xuICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoIGFzIHN0cmluZywgbmFtZSk7XG4gICAgICAgICAgICBjb25zdCBpc0RvdE1hcEZpbGUgPSBmaWxlLmlzRmlsZSgpICYmIG5hbWUuZW5kc1dpdGgoJy5qcy5tYXAnKTtcblxuICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgc3RhY2sucHVzaChlbnRyeVBhdGgpO1xuXG4gICAgICAgICAgICBlbHNlIGlmIChpc0RvdE1hcEZpbGUpIHJlcXVlc3QuZmlsZXMucHVzaChhd2FpdCBnZXRGaWxlTWV0YWRhdGEoZW50cnlQYXRoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbmNvbnN0IGdldEZpbGVNZXRhZGF0YSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlTWV0YWRhdGE+ID0+IHtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICBjb25zdCB7bmFtZX0gPSBwYXRoLnBhcnNlKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpO1xuXG4gICAgcmV0dXJuIHtjaHVua05hbWU6IG5hbWUsIHNpemUsIGNvbnRlbnR9O1xufVxuIl19
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AuditLogDescription = exports.protobufPackage = void 0;
7
- /* eslint-disable */
8
- const minimal_1 = __importDefault(require("protobufjs/minimal"));
9
- exports.protobufPackage = "com.coralogix.rum.v2";
10
- function createBaseAuditLogDescription() {
11
- return { description: undefined };
12
- }
13
- exports.AuditLogDescription = {
14
- encode(message, writer = minimal_1.default.Writer.create()) {
15
- if (message.description !== undefined) {
16
- writer.uint32(10).string(message.description);
17
- }
18
- return writer;
19
- },
20
- decode(input, length) {
21
- const reader = input instanceof minimal_1.default.Reader ? input : minimal_1.default.Reader.create(input);
22
- let end = length === undefined ? reader.len : reader.pos + length;
23
- const message = createBaseAuditLogDescription();
24
- while (reader.pos < end) {
25
- const tag = reader.uint32();
26
- switch (tag >>> 3) {
27
- case 1:
28
- if (tag !== 10) {
29
- break;
30
- }
31
- message.description = reader.string();
32
- continue;
33
- }
34
- if ((tag & 7) === 4 || tag === 0) {
35
- break;
36
- }
37
- reader.skipType(tag & 7);
38
- }
39
- return message;
40
- },
41
- fromJSON(object) {
42
- return { description: isSet(object.description) ? String(object.description) : undefined };
43
- },
44
- toJSON(message) {
45
- const obj = {};
46
- message.description !== undefined && (obj.description = message.description);
47
- return obj;
48
- },
49
- create(base) {
50
- return exports.AuditLogDescription.fromPartial(base !== null && base !== void 0 ? base : {});
51
- },
52
- fromPartial(object) {
53
- var _a;
54
- const message = createBaseAuditLogDescription();
55
- message.description = (_a = object.description) !== null && _a !== void 0 ? _a : undefined;
56
- return message;
57
- },
58
- };
59
- function isSet(value) {
60
- return value !== null && value !== undefined;
61
- }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRfbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9wcm90by1tb2RlbHMvY29tL2NvcmFsb2dpeC9ydW0vdjIvYXVkaXRfbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9CQUFvQjtBQUNwQixpRUFBcUM7QUFFeEIsUUFBQSxlQUFlLEdBQUcsc0JBQXNCLENBQUM7QUFNdEQsU0FBUyw2QkFBNkI7SUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUNwQyxDQUFDO0FBRVksUUFBQSxtQkFBbUIsR0FBRztJQUNqQyxNQUFNLENBQUMsT0FBNEIsRUFBRSxTQUFxQixpQkFBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDM0UsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQThCLEVBQUUsTUFBZTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxLQUFLLFlBQVksaUJBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsaUJBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlFLElBQUksR0FBRyxHQUFHLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLDZCQUE2QixFQUFFLENBQUM7UUFDaEQsT0FBTyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRTtZQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsUUFBUSxHQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUNqQixLQUFLLENBQUM7b0JBQ0osSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO3dCQUNkLE1BQU07cUJBQ1A7b0JBRUQsT0FBTyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3RDLFNBQVM7YUFDWjtZQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU07YUFDUDtZQUNELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFXO1FBQ2xCLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDN0YsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUE0QjtRQUNqQyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBdUM7UUFDNUMsT0FBTywyQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUF3Qzs7UUFDbEQsTUFBTSxPQUFPLEdBQUcsNkJBQTZCLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsV0FBVyxHQUFHLE1BQUEsTUFBTSxDQUFDLFdBQVcsbUNBQUksU0FBUyxDQUFDO1FBQ3RELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRixDQUFDO0FBVUYsU0FBUyxLQUFLLENBQUMsS0FBVTtJQUN2QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBfbTAgZnJvbSBcInByb3RvYnVmanMvbWluaW1hbFwiO1xuXG5leHBvcnQgY29uc3QgcHJvdG9idWZQYWNrYWdlID0gXCJjb20uY29yYWxvZ2l4LnJ1bS52MlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0TG9nRGVzY3JpcHRpb24ge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQmFzZUF1ZGl0TG9nRGVzY3JpcHRpb24oKTogQXVkaXRMb2dEZXNjcmlwdGlvbiB7XG4gIHJldHVybiB7IGRlc2NyaXB0aW9uOiB1bmRlZmluZWQgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEF1ZGl0TG9nRGVzY3JpcHRpb24gPSB7XG4gIGVuY29kZShtZXNzYWdlOiBBdWRpdExvZ0Rlc2NyaXB0aW9uLCB3cml0ZXI6IF9tMC5Xcml0ZXIgPSBfbTAuV3JpdGVyLmNyZWF0ZSgpKTogX20wLldyaXRlciB7XG4gICAgaWYgKG1lc3NhZ2UuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgd3JpdGVyLnVpbnQzMigxMCkuc3RyaW5nKG1lc3NhZ2UuZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdGVyO1xuICB9LFxuXG4gIGRlY29kZShpbnB1dDogX20wLlJlYWRlciB8IFVpbnQ4QXJyYXksIGxlbmd0aD86IG51bWJlcik6IEF1ZGl0TG9nRGVzY3JpcHRpb24ge1xuICAgIGNvbnN0IHJlYWRlciA9IGlucHV0IGluc3RhbmNlb2YgX20wLlJlYWRlciA/IGlucHV0IDogX20wLlJlYWRlci5jcmVhdGUoaW5wdXQpO1xuICAgIGxldCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQXVkaXRMb2dEZXNjcmlwdGlvbigpO1xuICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICBjb25zdCB0YWcgPSByZWFkZXIudWludDMyKCk7XG4gICAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhZyAhPT0gMTApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lc3NhZ2UuZGVzY3JpcHRpb24gPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKHRhZyAmIDcpID09PSA0IHx8IHRhZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlYWRlci5za2lwVHlwZSh0YWcgJiA3KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH0sXG5cbiAgZnJvbUpTT04ob2JqZWN0OiBhbnkpOiBBdWRpdExvZ0Rlc2NyaXB0aW9uIHtcbiAgICByZXR1cm4geyBkZXNjcmlwdGlvbjogaXNTZXQob2JqZWN0LmRlc2NyaXB0aW9uKSA/IFN0cmluZyhvYmplY3QuZGVzY3JpcHRpb24pIDogdW5kZWZpbmVkIH07XG4gIH0sXG5cbiAgdG9KU09OKG1lc3NhZ2U6IEF1ZGl0TG9nRGVzY3JpcHRpb24pOiB1bmtub3duIHtcbiAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xuICAgIG1lc3NhZ2UuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCAmJiAob2JqLmRlc2NyaXB0aW9uID0gbWVzc2FnZS5kZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcblxuICBjcmVhdGUoYmFzZT86IERlZXBQYXJ0aWFsPEF1ZGl0TG9nRGVzY3JpcHRpb24+KTogQXVkaXRMb2dEZXNjcmlwdGlvbiB7XG4gICAgcmV0dXJuIEF1ZGl0TG9nRGVzY3JpcHRpb24uZnJvbVBhcnRpYWwoYmFzZSA/PyB7fSk7XG4gIH0sXG5cbiAgZnJvbVBhcnRpYWwob2JqZWN0OiBEZWVwUGFydGlhbDxBdWRpdExvZ0Rlc2NyaXB0aW9uPik6IEF1ZGl0TG9nRGVzY3JpcHRpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVCYXNlQXVkaXRMb2dEZXNjcmlwdGlvbigpO1xuICAgIG1lc3NhZ2UuZGVzY3JpcHRpb24gPSBvYmplY3QuZGVzY3JpcHRpb24gPz8gdW5kZWZpbmVkO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9LFxufTtcblxudHlwZSBCdWlsdGluID0gRGF0ZSB8IEZ1bmN0aW9uIHwgVWludDhBcnJheSB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIERlZXBQYXJ0aWFsPFQ+ID0gVCBleHRlbmRzIEJ1aWx0aW4gPyBUXG4gIDogVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gQXJyYXk8RGVlcFBhcnRpYWw8VT4+IDogVCBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVT4gPyBSZWFkb25seUFycmF5PERlZXBQYXJ0aWFsPFU+PlxuICA6IFQgZXh0ZW5kcyB7ICRjYXNlOiBzdHJpbmcgfSA/IHsgW0sgaW4ga2V5b2YgT21pdDxULCBcIiRjYXNlXCI+XT86IERlZXBQYXJ0aWFsPFRbS10+IH0gJiB7ICRjYXNlOiBUW1wiJGNhc2VcIl0gfVxuICA6IFQgZXh0ZW5kcyB7fSA/IHsgW0sgaW4ga2V5b2YgVF0/OiBEZWVwUGFydGlhbDxUW0tdPiB9XG4gIDogUGFydGlhbDxUPjtcblxuZnVuY3Rpb24gaXNTZXQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cbiJdfQ==