@learnpack/learnpack 4.0.10 → 4.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. package/README.md +25 -10
  2. package/lib/commands/audit.d.ts +6 -6
  3. package/lib/commands/audit.js +327 -327
  4. package/lib/commands/build.d.ts +11 -0
  5. package/lib/commands/build.js +160 -0
  6. package/lib/commands/clean.d.ts +8 -8
  7. package/lib/commands/clean.js +22 -22
  8. package/lib/commands/download.d.ts +13 -13
  9. package/lib/commands/download.js +52 -52
  10. package/lib/commands/init.d.ts +9 -9
  11. package/lib/commands/init.js +127 -127
  12. package/lib/commands/login.d.ts +14 -14
  13. package/lib/commands/login.js +34 -34
  14. package/lib/commands/logout.d.ts +14 -14
  15. package/lib/commands/logout.js +34 -34
  16. package/lib/commands/publish.d.ts +14 -14
  17. package/lib/commands/publish.js +79 -79
  18. package/lib/commands/start.d.ts +7 -7
  19. package/lib/commands/start.js +252 -250
  20. package/lib/commands/test.d.ts +6 -6
  21. package/lib/commands/test.js +62 -62
  22. package/lib/index.d.ts +1 -1
  23. package/lib/index.js +4 -4
  24. package/lib/managers/config/allowed_files.d.ts +5 -5
  25. package/lib/managers/config/allowed_files.js +30 -30
  26. package/lib/managers/config/defaults.d.ts +47 -48
  27. package/lib/managers/config/defaults.js +51 -51
  28. package/lib/managers/config/exercise.d.ts +36 -36
  29. package/lib/managers/config/exercise.js +243 -236
  30. package/lib/managers/config/index.d.ts +3 -3
  31. package/lib/managers/config/index.js +464 -459
  32. package/lib/managers/file.d.ts +14 -14
  33. package/lib/managers/file.js +190 -184
  34. package/lib/managers/gitpod.d.ts +3 -3
  35. package/lib/managers/gitpod.js +67 -67
  36. package/lib/managers/server/index.d.ts +5 -6
  37. package/lib/managers/server/index.js +58 -58
  38. package/lib/managers/server/routes.d.ts +4 -4
  39. package/lib/managers/server/routes.js +228 -220
  40. package/lib/managers/session.d.ts +3 -3
  41. package/lib/managers/session.js +125 -125
  42. package/lib/managers/socket.d.ts +3 -3
  43. package/lib/managers/socket.js +188 -186
  44. package/lib/managers/telemetry.d.ts +74 -74
  45. package/lib/managers/telemetry.js +215 -214
  46. package/lib/managers/test.js +84 -84
  47. package/lib/models/action.d.ts +2 -2
  48. package/lib/models/action.js +2 -2
  49. package/lib/models/audit.d.ts +15 -15
  50. package/lib/models/audit.js +2 -2
  51. package/lib/models/config-manager.d.ts +21 -21
  52. package/lib/models/config-manager.js +2 -2
  53. package/lib/models/config.d.ts +86 -86
  54. package/lib/models/config.js +2 -2
  55. package/lib/models/counter.d.ts +11 -11
  56. package/lib/models/counter.js +2 -2
  57. package/lib/models/errors.d.ts +15 -15
  58. package/lib/models/errors.js +2 -2
  59. package/lib/models/exercise-obj.d.ts +29 -30
  60. package/lib/models/exercise-obj.js +2 -2
  61. package/lib/models/file.d.ts +5 -5
  62. package/lib/models/file.js +2 -2
  63. package/lib/models/findings.d.ts +17 -17
  64. package/lib/models/findings.js +2 -2
  65. package/lib/models/flags.d.ts +10 -10
  66. package/lib/models/flags.js +2 -2
  67. package/lib/models/front-matter.d.ts +11 -11
  68. package/lib/models/front-matter.js +2 -2
  69. package/lib/models/gitpod-data.d.ts +16 -16
  70. package/lib/models/gitpod-data.js +2 -2
  71. package/lib/models/language.d.ts +4 -4
  72. package/lib/models/language.js +2 -2
  73. package/lib/models/package.d.ts +7 -7
  74. package/lib/models/package.js +2 -2
  75. package/lib/models/plugin-config.d.ts +16 -16
  76. package/lib/models/plugin-config.js +2 -2
  77. package/lib/models/session.d.ts +31 -31
  78. package/lib/models/session.js +2 -2
  79. package/lib/models/socket.d.ts +37 -37
  80. package/lib/models/socket.js +2 -2
  81. package/lib/models/status.d.ts +1 -1
  82. package/lib/models/status.js +2 -2
  83. package/lib/models/success-types.d.ts +1 -1
  84. package/lib/models/success-types.js +2 -2
  85. package/lib/plugin/command/compile.d.ts +6 -6
  86. package/lib/plugin/command/compile.js +18 -18
  87. package/lib/plugin/command/test.d.ts +6 -6
  88. package/lib/plugin/command/test.js +25 -25
  89. package/lib/plugin/index.d.ts +27 -27
  90. package/lib/plugin/index.js +7 -7
  91. package/lib/plugin/plugin.d.ts +8 -8
  92. package/lib/plugin/plugin.js +68 -68
  93. package/lib/plugin/utils.d.ts +16 -16
  94. package/lib/plugin/utils.js +58 -58
  95. package/lib/ui/download.d.ts +5 -5
  96. package/lib/ui/download.js +62 -61
  97. package/lib/utils/BaseCommand.d.ts +8 -8
  98. package/lib/utils/BaseCommand.js +41 -41
  99. package/lib/utils/SessionCommand.d.ts +10 -10
  100. package/lib/utils/SessionCommand.js +43 -43
  101. package/lib/utils/api.d.ts +14 -14
  102. package/lib/utils/api.js +255 -255
  103. package/lib/utils/audit.d.ts +16 -16
  104. package/lib/utils/audit.js +303 -303
  105. package/lib/utils/checkNotInstalled.d.ts +8 -8
  106. package/lib/utils/checkNotInstalled.js +185 -181
  107. package/lib/utils/console.d.ts +12 -12
  108. package/lib/utils/console.js +19 -19
  109. package/lib/utils/errors.d.ts +17 -17
  110. package/lib/utils/errors.js +107 -100
  111. package/lib/utils/exercisesQueue.d.ts +9 -9
  112. package/lib/utils/exercisesQueue.js +38 -38
  113. package/lib/utils/fileQueue.d.ts +43 -43
  114. package/lib/utils/fileQueue.js +169 -169
  115. package/lib/utils/misc.d.ts +1 -1
  116. package/lib/utils/misc.js +24 -23
  117. package/lib/utils/osOperations.d.ts +5 -5
  118. package/lib/utils/osOperations.js +72 -72
  119. package/lib/utils/validators.d.ts +5 -5
  120. package/lib/utils/validators.js +16 -17
  121. package/lib/utils/watcher.d.ts +2 -2
  122. package/lib/utils/watcher.js +25 -25
  123. package/oclif.manifest.json +1 -1
  124. package/package.json +6 -4
  125. package/src/commands/build.ts +181 -0
  126. package/src/managers/config/index.ts +5 -0
  127. package/src/managers/server/routes.ts +10 -0
  128. package/src/managers/session.ts +1 -1
@@ -1,74 +1,74 @@
1
- import { IFile } from "../models/file";
2
- declare type TCompilationAttempt = {
3
- source_code: string;
4
- stdout: string;
5
- exit_code: number;
6
- starting_at: number;
7
- ending_at: number;
8
- };
9
- declare type TTestAttempt = {
10
- source_code: string;
11
- stdout: string;
12
- exit_code: number;
13
- starting_at: number;
14
- ending_at: number;
15
- };
16
- declare type TAIInteraction = {
17
- student_message: string;
18
- source_code: string;
19
- ai_response: string;
20
- starting_at: number;
21
- ending_at: number;
22
- };
23
- export declare type TStep = {
24
- slug: string;
25
- position: number;
26
- files: IFile[];
27
- is_testeable: boolean;
28
- opened_at?: number;
29
- completed_at?: number;
30
- compilations: TCompilationAttempt[];
31
- tests: TTestAttempt[];
32
- ai_interactions: TAIInteraction[];
33
- };
34
- declare type TWorkoutSession = {
35
- started_at: number;
36
- ended_at?: number;
37
- };
38
- declare type TStudent = {
39
- token: string;
40
- user_id: string;
41
- email: string;
42
- };
43
- export interface ITelemetryJSONSchema {
44
- telemetry_id?: string;
45
- user_id?: number | string;
46
- slug: string;
47
- agent?: string;
48
- tutorial_started_at?: number;
49
- last_interaction_at?: number;
50
- steps: Array<TStep>;
51
- workout_session: TWorkoutSession[];
52
- }
53
- declare type TStepEvent = "compile" | "test" | "ai_interaction" | "open_step";
54
- export declare type TTelemetryUrls = {
55
- streaming?: string;
56
- batch?: string;
57
- };
58
- interface ITelemetryManager {
59
- current: ITelemetryJSONSchema | null;
60
- configPath: string | null;
61
- urls: TTelemetryUrls;
62
- salute: (message: string) => void;
63
- start: (agent: string, steps: TStep[], path: string, tutorialSlug: string) => void;
64
- prevStep?: number;
65
- registerStepEvent: (stepPosition: number, event: TStepEvent, data: any) => void;
66
- streamEvent: (stepPosition: number, event: string, data: any) => void;
67
- submit: () => Promise<void>;
68
- finishWorkoutSession: () => void;
69
- setStudent: (student: TStudent) => void;
70
- save: () => void;
71
- retrieve: () => Promise<ITelemetryJSONSchema | null>;
72
- }
73
- declare const TelemetryManager: ITelemetryManager;
74
- export default TelemetryManager;
1
+ import { IFile } from "../models/file";
2
+ type TCompilationAttempt = {
3
+ source_code: string;
4
+ stdout: string;
5
+ exit_code: number;
6
+ starting_at: number;
7
+ ending_at: number;
8
+ };
9
+ type TTestAttempt = {
10
+ source_code: string;
11
+ stdout: string;
12
+ exit_code: number;
13
+ starting_at: number;
14
+ ending_at: number;
15
+ };
16
+ type TAIInteraction = {
17
+ student_message: string;
18
+ source_code: string;
19
+ ai_response: string;
20
+ starting_at: number;
21
+ ending_at: number;
22
+ };
23
+ export type TStep = {
24
+ slug: string;
25
+ position: number;
26
+ files: IFile[];
27
+ is_testeable: boolean;
28
+ opened_at?: number;
29
+ completed_at?: number;
30
+ compilations: TCompilationAttempt[];
31
+ tests: TTestAttempt[];
32
+ ai_interactions: TAIInteraction[];
33
+ };
34
+ type TWorkoutSession = {
35
+ started_at: number;
36
+ ended_at?: number;
37
+ };
38
+ type TStudent = {
39
+ token: string;
40
+ user_id: string;
41
+ email: string;
42
+ };
43
+ export interface ITelemetryJSONSchema {
44
+ telemetry_id?: string;
45
+ user_id?: number | string;
46
+ slug: string;
47
+ agent?: string;
48
+ tutorial_started_at?: number;
49
+ last_interaction_at?: number;
50
+ steps: Array<TStep>;
51
+ workout_session: TWorkoutSession[];
52
+ }
53
+ type TStepEvent = "compile" | "test" | "ai_interaction" | "open_step";
54
+ export type TTelemetryUrls = {
55
+ streaming?: string;
56
+ batch?: string;
57
+ };
58
+ interface ITelemetryManager {
59
+ current: ITelemetryJSONSchema | null;
60
+ configPath: string | null;
61
+ urls: TTelemetryUrls;
62
+ salute: (message: string) => void;
63
+ start: (agent: string, steps: TStep[], path: string, tutorialSlug: string) => void;
64
+ prevStep?: number;
65
+ registerStepEvent: (stepPosition: number, event: TStepEvent, data: any) => void;
66
+ streamEvent: (stepPosition: number, event: string, data: any) => void;
67
+ submit: () => Promise<void>;
68
+ finishWorkoutSession: () => void;
69
+ setStudent: (student: TStudent) => void;
70
+ save: () => void;
71
+ retrieve: () => Promise<ITelemetryJSONSchema | null>;
72
+ }
73
+ declare const TelemetryManager: ITelemetryManager;
74
+ export default TelemetryManager;
@@ -1,214 +1,215 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const api_1 = require("../utils/api");
4
- const console_1 = require("../utils/console");
5
- const fs = require("fs");
6
- function createUUID() {
7
- return (Math.random().toString(36).slice(2, 10) +
8
- Math.random().toString(36).slice(2, 10));
9
- }
10
- function stringToBase64(input) {
11
- return Buffer.from(input).toString("base64");
12
- }
13
- const TelemetryManager = {
14
- current: null,
15
- urls: {},
16
- configPath: "",
17
- salute: message => {
18
- console_1.default.info(message);
19
- },
20
- start: function (agent, steps, path, tutorialSlug) {
21
- this.configPath = path;
22
- if (!this.current) {
23
- this.retrieve()
24
- .then(data => {
25
- const prevTelemetry = data;
26
- if (prevTelemetry) {
27
- this.current = prevTelemetry;
28
- this.finishWorkoutSession();
29
- }
30
- else {
31
- this.current = {
32
- telemetry_id: createUUID(),
33
- slug: tutorialSlug,
34
- agent,
35
- tutorial_started_at: Date.now(),
36
- steps,
37
- workout_session: [
38
- {
39
- started_at: Date.now(),
40
- },
41
- ],
42
- };
43
- }
44
- this.save();
45
- this.submit();
46
- })
47
- .catch(error => {
48
- console_1.default.debug(error);
49
- // Delete the telemetry.json if it exists
50
- fs.unlinkSync(`${this.configPath}/telemetry.json`);
51
- throw new Error("There was a problem starting, reload LearnPack\nRun\n$ learnpack start");
52
- });
53
- }
54
- },
55
- // verifyStudent: function () {
56
- // if (!this.current) {
57
- // return;
58
- // }
59
- // if (!this.current.user_id) {
60
- // }
61
- // },
62
- setStudent: function (student) {
63
- if (!this.current) {
64
- return;
65
- }
66
- this.current.user_id = student.user_id;
67
- this.save();
68
- this.submit();
69
- },
70
- finishWorkoutSession: function () {
71
- var _a, _b;
72
- if (!this.current) {
73
- return;
74
- }
75
- const lastSession = (_a = this.current) === null || _a === void 0 ? void 0 : _a.workout_session[this.current.workout_session.length - 1];
76
- if (lastSession &&
77
- !lastSession.ended_at && ((_b = this.current) === null || _b === void 0 ? void 0 : _b.last_interaction_at)) {
78
- lastSession.ended_at = this.current.last_interaction_at;
79
- this.current.workout_session.push({
80
- started_at: Date.now(),
81
- });
82
- }
83
- },
84
- registerStepEvent: function (stepPosition, event, data) {
85
- if (!this.current) {
86
- // throw new Error("Telemetry has not been started");
87
- return;
88
- }
89
- const step = this.current.steps[stepPosition];
90
- if (!step) {
91
- return;
92
- }
93
- if (data.source_code) {
94
- data.source_code = stringToBase64(data.source_code);
95
- }
96
- if (data.stdout) {
97
- data.stdout = stringToBase64(data.stdout);
98
- }
99
- if (data.stderr) {
100
- data.stderr = stringToBase64(data.stderr);
101
- }
102
- if (Object.prototype.hasOwnProperty.call(data, "exitCode")) {
103
- data.exit_code = data.exitCode;
104
- data.exitCode = undefined;
105
- }
106
- switch (event) {
107
- case "compile":
108
- if (!step.compilations) {
109
- step.compilations = [];
110
- }
111
- step.compilations.push(data);
112
- this.current.steps[stepPosition] = step;
113
- break;
114
- case "test":
115
- if (!step.tests) {
116
- step.tests = [];
117
- }
118
- // data.stdout =
119
- step.tests.push(data);
120
- if (data.exit_code === 0) {
121
- step.completed_at = Date.now();
122
- }
123
- this.current.steps[stepPosition] = step;
124
- break;
125
- case "ai_interaction":
126
- if (!step.ai_interactions) {
127
- step.ai_interactions = [];
128
- }
129
- step.ai_interactions.push(data);
130
- break;
131
- case "open_step": {
132
- const now = Date.now();
133
- if (!step.opened_at) {
134
- step.opened_at = now;
135
- this.current.steps[stepPosition] = step;
136
- }
137
- if (this.prevStep || this.prevStep === 0) {
138
- const prevStep = this.current.steps[this.prevStep];
139
- if (!prevStep.is_testeable && !prevStep.completed_at) {
140
- prevStep.completed_at = now;
141
- this.current.steps[this.prevStep] = prevStep;
142
- }
143
- }
144
- this.prevStep = stepPosition;
145
- this.submit();
146
- break;
147
- }
148
- default:
149
- throw new Error(`Event type ${event} is not supported`);
150
- }
151
- this.current.last_interaction_at = Date.now();
152
- this.streamEvent(stepPosition, event, data);
153
- this.save();
154
- },
155
- retrieve: function () {
156
- return new Promise((resolve, reject) => {
157
- fs.readFile(`${this.configPath}/telemetry.json`, "utf8", (err, data) => {
158
- if (err) {
159
- if (err.code === "ENOENT") {
160
- // File does not exist, resolve with undefined
161
- resolve(null);
162
- }
163
- else {
164
- reject(err);
165
- }
166
- }
167
- else {
168
- try {
169
- resolve(JSON.parse(data));
170
- }
171
- catch (error) {
172
- reject(error);
173
- }
174
- }
175
- });
176
- });
177
- },
178
- submit: async function () {
179
- console_1.default.debug("Submitting telemetry...");
180
- if (!this.current)
181
- return Promise.resolve();
182
- const url = this.urls.batch;
183
- if (!url) {
184
- return;
185
- }
186
- const body = this.current;
187
- api_1.default.sendBatchTelemetry(url, body);
188
- },
189
- save: function () {
190
- fs.writeFile(`${this.configPath}/telemetry.json`, JSON.stringify(this.current), (err) => {
191
- if (err)
192
- throw err;
193
- });
194
- },
195
- streamEvent: async function (stepPosition, event, data) {
196
- if (!this.current)
197
- return;
198
- const url = this.urls.streaming;
199
- if (!url) {
200
- return;
201
- }
202
- const stepSlug = this.current.steps[stepPosition].slug;
203
- const body = {
204
- slug: stepSlug,
205
- telemetry_id: this.current.telemetry_id,
206
- user_id: this.current.user_id,
207
- step_position: stepPosition,
208
- event,
209
- data,
210
- };
211
- api_1.default.sendStreamTelemetry(url, body);
212
- },
213
- };
214
- exports.default = TelemetryManager;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const api_1 = require("../utils/api");
4
+ const console_1 = require("../utils/console");
5
+ const fs = require("fs");
6
+ function createUUID() {
7
+ return (Math.random().toString(36).slice(2, 10) +
8
+ Math.random().toString(36).slice(2, 10));
9
+ }
10
+ function stringToBase64(input) {
11
+ return Buffer.from(input).toString("base64");
12
+ }
13
+ const TelemetryManager = {
14
+ current: null,
15
+ urls: {},
16
+ configPath: "",
17
+ salute: message => {
18
+ console_1.default.info(message);
19
+ },
20
+ start: function (agent, steps, path, tutorialSlug) {
21
+ this.configPath = path;
22
+ if (!this.current) {
23
+ this.retrieve()
24
+ .then(data => {
25
+ const prevTelemetry = data;
26
+ if (prevTelemetry) {
27
+ this.current = prevTelemetry;
28
+ this.finishWorkoutSession();
29
+ }
30
+ else {
31
+ this.current = {
32
+ telemetry_id: createUUID(),
33
+ slug: tutorialSlug,
34
+ agent,
35
+ tutorial_started_at: Date.now(),
36
+ steps,
37
+ workout_session: [
38
+ {
39
+ started_at: Date.now(),
40
+ },
41
+ ],
42
+ };
43
+ }
44
+ this.save();
45
+ this.submit();
46
+ })
47
+ .catch(error => {
48
+ console_1.default.debug(error);
49
+ // Delete the telemetry.json if it exists
50
+ fs.unlinkSync(`${this.configPath}/telemetry.json`);
51
+ throw new Error("There was a problem starting, reload LearnPack\nRun\n$ learnpack start");
52
+ });
53
+ }
54
+ },
55
+ // verifyStudent: function () {
56
+ // if (!this.current) {
57
+ // return;
58
+ // }
59
+ // if (!this.current.user_id) {
60
+ // }
61
+ // },
62
+ setStudent: function (student) {
63
+ if (!this.current) {
64
+ return;
65
+ }
66
+ this.current.user_id = student.user_id;
67
+ this.save();
68
+ this.submit();
69
+ },
70
+ finishWorkoutSession: function () {
71
+ var _a, _b;
72
+ if (!this.current) {
73
+ return;
74
+ }
75
+ const lastSession = (_a = this.current) === null || _a === void 0 ? void 0 : _a.workout_session[this.current.workout_session.length - 1];
76
+ if (lastSession &&
77
+ !lastSession.ended_at &&
78
+ ((_b = this.current) === null || _b === void 0 ? void 0 : _b.last_interaction_at)) {
79
+ lastSession.ended_at = this.current.last_interaction_at;
80
+ this.current.workout_session.push({
81
+ started_at: Date.now(),
82
+ });
83
+ }
84
+ },
85
+ registerStepEvent: function (stepPosition, event, data) {
86
+ if (!this.current) {
87
+ // throw new Error("Telemetry has not been started");
88
+ return;
89
+ }
90
+ const step = this.current.steps[stepPosition];
91
+ if (!step) {
92
+ return;
93
+ }
94
+ if (data.source_code) {
95
+ data.source_code = stringToBase64(data.source_code);
96
+ }
97
+ if (data.stdout) {
98
+ data.stdout = stringToBase64(data.stdout);
99
+ }
100
+ if (data.stderr) {
101
+ data.stderr = stringToBase64(data.stderr);
102
+ }
103
+ if (Object.prototype.hasOwnProperty.call(data, "exitCode")) {
104
+ data.exit_code = data.exitCode;
105
+ data.exitCode = undefined;
106
+ }
107
+ switch (event) {
108
+ case "compile":
109
+ if (!step.compilations) {
110
+ step.compilations = [];
111
+ }
112
+ step.compilations.push(data);
113
+ this.current.steps[stepPosition] = step;
114
+ break;
115
+ case "test":
116
+ if (!step.tests) {
117
+ step.tests = [];
118
+ }
119
+ // data.stdout =
120
+ step.tests.push(data);
121
+ if (data.exit_code === 0) {
122
+ step.completed_at = Date.now();
123
+ }
124
+ this.current.steps[stepPosition] = step;
125
+ break;
126
+ case "ai_interaction":
127
+ if (!step.ai_interactions) {
128
+ step.ai_interactions = [];
129
+ }
130
+ step.ai_interactions.push(data);
131
+ break;
132
+ case "open_step": {
133
+ const now = Date.now();
134
+ if (!step.opened_at) {
135
+ step.opened_at = now;
136
+ this.current.steps[stepPosition] = step;
137
+ }
138
+ if (this.prevStep || this.prevStep === 0) {
139
+ const prevStep = this.current.steps[this.prevStep];
140
+ if (!prevStep.is_testeable && !prevStep.completed_at) {
141
+ prevStep.completed_at = now;
142
+ this.current.steps[this.prevStep] = prevStep;
143
+ }
144
+ }
145
+ this.prevStep = stepPosition;
146
+ this.submit();
147
+ break;
148
+ }
149
+ default:
150
+ throw new Error(`Event type ${event} is not supported`);
151
+ }
152
+ this.current.last_interaction_at = Date.now();
153
+ this.streamEvent(stepPosition, event, data);
154
+ this.save();
155
+ },
156
+ retrieve: function () {
157
+ return new Promise((resolve, reject) => {
158
+ fs.readFile(`${this.configPath}/telemetry.json`, "utf8", (err, data) => {
159
+ if (err) {
160
+ if (err.code === "ENOENT") {
161
+ // File does not exist, resolve with undefined
162
+ resolve(null);
163
+ }
164
+ else {
165
+ reject(err);
166
+ }
167
+ }
168
+ else {
169
+ try {
170
+ resolve(JSON.parse(data));
171
+ }
172
+ catch (error) {
173
+ reject(error);
174
+ }
175
+ }
176
+ });
177
+ });
178
+ },
179
+ submit: async function () {
180
+ console_1.default.debug("Submitting telemetry...");
181
+ if (!this.current)
182
+ return Promise.resolve();
183
+ const url = this.urls.batch;
184
+ if (!url) {
185
+ return;
186
+ }
187
+ const body = this.current;
188
+ api_1.default.sendBatchTelemetry(url, body);
189
+ },
190
+ save: function () {
191
+ fs.writeFile(`${this.configPath}/telemetry.json`, JSON.stringify(this.current), (err) => {
192
+ if (err)
193
+ throw err;
194
+ });
195
+ },
196
+ streamEvent: async function (stepPosition, event, data) {
197
+ if (!this.current)
198
+ return;
199
+ const url = this.urls.streaming;
200
+ if (!url) {
201
+ return;
202
+ }
203
+ const stepSlug = this.current.steps[stepPosition].slug;
204
+ const body = {
205
+ slug: stepSlug,
206
+ telemetry_id: this.current.telemetry_id,
207
+ user_id: this.current.user_id,
208
+ step_position: stepPosition,
209
+ event,
210
+ data,
211
+ };
212
+ api_1.default.sendStreamTelemetry(url, body);
213
+ },
214
+ };
215
+ exports.default = TelemetryManager;