@mecanizou/telemetry-hub 1.0.0 → 1.0.2
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/.github/workflows/pull_request.yml +32 -32
- package/.github/workflows/release.yml +129 -129
- package/.prettierignore +4 -4
- package/CHANGELOG.md +14 -0
- package/DOCS_GUIDE.md +151 -0
- package/README.md +248 -0
- package/dist/core/__tests__/logger-types.test.d.ts +1 -0
- package/dist/core/__tests__/logger-types.test.js +325 -0
- package/dist/core/__tests__/logger.test.d.ts +1 -0
- package/dist/core/__tests__/logger.test.js +337 -0
- package/dist/core/__tests__/tracer.test.d.ts +1 -0
- package/dist/core/__tests__/tracer.test.js +330 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +8 -0
- package/dist/core/logger-types.d.ts +43 -0
- package/dist/core/logger-types.js +3 -0
- package/dist/core/logger.d.ts +13 -0
- package/dist/core/logger.js +123 -0
- package/dist/core/tracer-types.d.ts +50 -0
- package/dist/core/tracer-types.js +3 -0
- package/dist/core/tracer.d.ts +10 -0
- package/dist/core/tracer.js +114 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -2
- package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
- package/dist/sst/__tests__/telemetry.test.js +138 -0
- package/dist/sst/index.d.ts +1 -0
- package/dist/sst/index.js +18 -0
- package/dist/sst/middy/index.d.ts +1 -0
- package/dist/sst/middy/index.js +18 -0
- package/dist/sst/middy/middleware.d.ts +5 -0
- package/dist/sst/middy/middleware.js +157 -0
- package/dist/sst/telemetry.d.ts +4 -0
- package/dist/sst/telemetry.js +121 -0
- package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
- package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
- package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
- package/dist/telemetry/core/__tests__/logger.test.js +337 -0
- package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
- package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
- package/dist/telemetry/core/index.d.ts +4 -0
- package/dist/telemetry/core/index.js +8 -0
- package/dist/telemetry/core/logger-types.d.ts +43 -0
- package/dist/telemetry/core/logger-types.js +3 -0
- package/dist/telemetry/core/logger.d.ts +13 -0
- package/dist/telemetry/core/logger.js +123 -0
- package/dist/telemetry/core/tracer-types.d.ts +50 -0
- package/dist/telemetry/core/tracer-types.js +3 -0
- package/dist/telemetry/core/tracer.d.ts +10 -0
- package/dist/telemetry/core/tracer.js +114 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.js +20 -0
- package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
- package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
- package/dist/telemetry/sst/index.d.ts +1 -0
- package/dist/telemetry/sst/index.js +18 -0
- package/dist/telemetry/sst/middy/index.d.ts +1 -0
- package/dist/telemetry/sst/middy/index.js +18 -0
- package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
- package/dist/telemetry/sst/middy/middleware.js +157 -0
- package/dist/telemetry/sst/telemetry.d.ts +4 -0
- package/dist/telemetry/sst/telemetry.js +121 -0
- package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
- package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
- package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
- package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
- package/dist/telemetry/tsed/config.d.ts +26 -0
- package/dist/telemetry/tsed/config.js +166 -0
- package/dist/telemetry/tsed/index.d.ts +4 -0
- package/dist/telemetry/tsed/index.js +21 -0
- package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
- package/dist/telemetry/tsed/log-telemetry.js +196 -0
- package/dist/telemetry/tsed/service.d.ts +26 -0
- package/dist/telemetry/tsed/service.js +150 -0
- package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
- package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
- package/dist/tsed/__tests__/config.test.d.ts +1 -0
- package/dist/tsed/__tests__/config.test.js +146 -0
- package/dist/tsed/__tests__/service.test.d.ts +1 -0
- package/dist/tsed/__tests__/service.test.js +63 -0
- package/dist/tsed/config.d.ts +26 -0
- package/dist/tsed/config.js +166 -0
- package/dist/tsed/index.d.ts +4 -0
- package/dist/tsed/index.js +21 -0
- package/dist/tsed/log-telemetry.d.ts +1 -0
- package/dist/tsed/log-telemetry.js +196 -0
- package/dist/tsed/service.d.ts +26 -0
- package/dist/tsed/service.js +150 -0
- package/dist/tsed/sync-log-record-processor.d.ts +11 -0
- package/dist/tsed/sync-log-record-processor.js +74 -0
- package/package.json +72 -56
- package/release.config.js +23 -23
- package/vitest.config.ts +22 -0
- package/dist/check-if-is-working.d.ts +0 -1
- package/dist/check-if-is-working.js +0 -8
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const tracer_1 = require("../tracer");
|
|
5
|
+
const api_1 = require("@opentelemetry/api");
|
|
6
|
+
(0, vitest_1.describe)('StandardTracer', () => {
|
|
7
|
+
let mockTracer;
|
|
8
|
+
let mockSpan;
|
|
9
|
+
let standardTracer;
|
|
10
|
+
(0, vitest_1.beforeEach)(() => {
|
|
11
|
+
mockSpan = {
|
|
12
|
+
end: vitest_1.vi.fn(),
|
|
13
|
+
setAttribute: vitest_1.vi.fn(),
|
|
14
|
+
setStatus: vitest_1.vi.fn(),
|
|
15
|
+
recordException: vitest_1.vi.fn(),
|
|
16
|
+
};
|
|
17
|
+
mockTracer = {
|
|
18
|
+
startSpan: vitest_1.vi.fn().mockReturnValue(mockSpan),
|
|
19
|
+
};
|
|
20
|
+
standardTracer = new tracer_1.StandardTracer(mockTracer, 'test-service');
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.describe)('startSpan', () => {
|
|
23
|
+
(0, vitest_1.it)('deve criar span com nome e atributos básicos', () => {
|
|
24
|
+
const spanResult = standardTracer.startSpan({
|
|
25
|
+
spanName: 'test-operation',
|
|
26
|
+
serviceName: 'my-service',
|
|
27
|
+
environment: 'production',
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.expect)(mockTracer.startSpan).toHaveBeenCalledWith('test-operation', {
|
|
30
|
+
kind: api_1.SpanKind.SERVER,
|
|
31
|
+
attributes: {
|
|
32
|
+
'service.name': 'my-service',
|
|
33
|
+
'deployment.environment.name': 'production',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.expect)(spanResult.span).toBe(mockSpan);
|
|
37
|
+
(0, vitest_1.expect)(spanResult.end).toBeDefined();
|
|
38
|
+
(0, vitest_1.expect)(spanResult.setSuccess).toBeDefined();
|
|
39
|
+
(0, vitest_1.expect)(spanResult.setError).toBeDefined();
|
|
40
|
+
(0, vitest_1.expect)(spanResult.setAttribute).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.it)('deve usar defaultServiceName quando serviceName não fornecido', () => {
|
|
43
|
+
standardTracer.startSpan({
|
|
44
|
+
spanName: 'test-operation',
|
|
45
|
+
serviceName: '',
|
|
46
|
+
environment: 'test',
|
|
47
|
+
});
|
|
48
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
49
|
+
(0, vitest_1.expect)(attributes['service.name']).toBe('test-service');
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('deve incluir atributos de execução', () => {
|
|
52
|
+
standardTracer.startSpan({
|
|
53
|
+
spanName: 'process-request',
|
|
54
|
+
serviceName: 'api-service',
|
|
55
|
+
environment: 'production',
|
|
56
|
+
execution: {
|
|
57
|
+
functionName: 'processPayment',
|
|
58
|
+
invocationId: 'inv-123',
|
|
59
|
+
awsRequestId: 'aws-456',
|
|
60
|
+
requestId: 'req-789',
|
|
61
|
+
controller: 'PaymentController',
|
|
62
|
+
controllerMethod: 'process',
|
|
63
|
+
origin: 'mobile',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
67
|
+
(0, vitest_1.expect)(attributes['faas.name']).toBe('processPayment');
|
|
68
|
+
(0, vitest_1.expect)(attributes['faas.invocation_id']).toBe('inv-123');
|
|
69
|
+
(0, vitest_1.expect)(attributes['aws.request.id']).toBe('aws-456');
|
|
70
|
+
(0, vitest_1.expect)(attributes['request.id']).toBe('req-789');
|
|
71
|
+
(0, vitest_1.expect)(attributes['controller.name']).toBe('PaymentController');
|
|
72
|
+
(0, vitest_1.expect)(attributes['controller.method']).toBe('process');
|
|
73
|
+
(0, vitest_1.expect)(attributes['origin']).toBe('mobile');
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('deve incluir atributos HTTP', () => {
|
|
76
|
+
standardTracer.startSpan({
|
|
77
|
+
spanName: 'http-request',
|
|
78
|
+
serviceName: 'web-service',
|
|
79
|
+
environment: 'production',
|
|
80
|
+
http: {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
url: 'https://api.example.com/orders',
|
|
83
|
+
endpoint: '/orders',
|
|
84
|
+
statusCode: 201,
|
|
85
|
+
scheme: 'https',
|
|
86
|
+
host: 'api.example.com',
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
90
|
+
(0, vitest_1.expect)(attributes['http.method']).toBe('POST');
|
|
91
|
+
(0, vitest_1.expect)(attributes['http.url']).toBe('https://api.example.com/orders');
|
|
92
|
+
(0, vitest_1.expect)(attributes['http.target']).toBe('/orders');
|
|
93
|
+
(0, vitest_1.expect)(attributes['http.status_code']).toBe(201);
|
|
94
|
+
(0, vitest_1.expect)(attributes['http.scheme']).toBe('https');
|
|
95
|
+
(0, vitest_1.expect)(attributes['http.host']).toBe('api.example.com');
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.it)('deve incluir atributos de usuário', () => {
|
|
98
|
+
standardTracer.startSpan({
|
|
99
|
+
spanName: 'user-operation',
|
|
100
|
+
serviceName: 'user-service',
|
|
101
|
+
environment: 'production',
|
|
102
|
+
user: {
|
|
103
|
+
accountUserUid: 'user-123',
|
|
104
|
+
accountUid: 'account-456',
|
|
105
|
+
applicationUid: 'app-789',
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
109
|
+
(0, vitest_1.expect)(attributes['accountUser.uid']).toBe('user-123');
|
|
110
|
+
(0, vitest_1.expect)(attributes['account.uid']).toBe('account-456');
|
|
111
|
+
(0, vitest_1.expect)(attributes['application.uid']).toBe('app-789');
|
|
112
|
+
});
|
|
113
|
+
(0, vitest_1.it)('deve incluir atributos de performance', () => {
|
|
114
|
+
standardTracer.startSpan({
|
|
115
|
+
spanName: 'performance-test',
|
|
116
|
+
serviceName: 'perf-service',
|
|
117
|
+
environment: 'test',
|
|
118
|
+
performance: {
|
|
119
|
+
durationMs: 250,
|
|
120
|
+
success: true,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
124
|
+
(0, vitest_1.expect)(attributes['duration.ms']).toBe(250);
|
|
125
|
+
(0, vitest_1.expect)(attributes['execution.success']).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
(0, vitest_1.it)('deve incluir atributos de erro', () => {
|
|
128
|
+
standardTracer.startSpan({
|
|
129
|
+
spanName: 'error-operation',
|
|
130
|
+
serviceName: 'error-service',
|
|
131
|
+
environment: 'production',
|
|
132
|
+
error: {
|
|
133
|
+
type: 'ValidationError',
|
|
134
|
+
message: 'Invalid input',
|
|
135
|
+
stack: 'Error stack trace',
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
139
|
+
(0, vitest_1.expect)(attributes['error.type']).toBe('ValidationError');
|
|
140
|
+
(0, vitest_1.expect)(attributes['error.message']).toBe('Invalid input');
|
|
141
|
+
(0, vitest_1.expect)(attributes['error.stack']).toBe('Error stack trace');
|
|
142
|
+
});
|
|
143
|
+
(0, vitest_1.it)('deve incluir atributos customizados', () => {
|
|
144
|
+
standardTracer.startSpan({
|
|
145
|
+
spanName: 'custom-operation',
|
|
146
|
+
serviceName: 'custom-service',
|
|
147
|
+
environment: 'production',
|
|
148
|
+
attributes: {
|
|
149
|
+
'custom.field': 'value',
|
|
150
|
+
'custom.count': 42,
|
|
151
|
+
'custom.enabled': true,
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
155
|
+
(0, vitest_1.expect)(attributes['custom.field']).toBe('value');
|
|
156
|
+
(0, vitest_1.expect)(attributes['custom.count']).toBe(42);
|
|
157
|
+
(0, vitest_1.expect)(attributes['custom.enabled']).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
(0, vitest_1.it)('deve filtrar valores undefined e null', () => {
|
|
160
|
+
standardTracer.startSpan({
|
|
161
|
+
spanName: 'filter-test',
|
|
162
|
+
serviceName: 'filter-service',
|
|
163
|
+
environment: 'production',
|
|
164
|
+
execution: {
|
|
165
|
+
functionName: 'test',
|
|
166
|
+
invocationId: undefined,
|
|
167
|
+
awsRequestId: null,
|
|
168
|
+
},
|
|
169
|
+
attributes: {
|
|
170
|
+
valid: 'value',
|
|
171
|
+
invalid: undefined,
|
|
172
|
+
nullValue: null,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
|
|
176
|
+
(0, vitest_1.expect)(attributes['faas.name']).toBe('test');
|
|
177
|
+
(0, vitest_1.expect)(attributes['faas.invocation_id']).toBeUndefined();
|
|
178
|
+
(0, vitest_1.expect)(attributes['aws.request.id']).toBeUndefined();
|
|
179
|
+
(0, vitest_1.expect)(attributes['valid']).toBe('value');
|
|
180
|
+
(0, vitest_1.expect)(attributes['invalid']).toBeUndefined();
|
|
181
|
+
(0, vitest_1.expect)(attributes['nullValue']).toBeUndefined();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
(0, vitest_1.describe)('StandardSpanResult', () => {
|
|
185
|
+
let spanResult;
|
|
186
|
+
(0, vitest_1.beforeEach)(() => {
|
|
187
|
+
spanResult = standardTracer.startSpan({
|
|
188
|
+
spanName: 'test-span',
|
|
189
|
+
serviceName: 'test-service',
|
|
190
|
+
environment: 'test',
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.describe)('end', () => {
|
|
194
|
+
(0, vitest_1.it)('deve finalizar o span', () => {
|
|
195
|
+
spanResult.end();
|
|
196
|
+
(0, vitest_1.expect)(mockSpan.end).toHaveBeenCalledTimes(1);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
(0, vitest_1.describe)('setSuccess', () => {
|
|
200
|
+
(0, vitest_1.it)('deve marcar span como sucesso', () => {
|
|
201
|
+
spanResult.setSuccess(true);
|
|
202
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', true);
|
|
203
|
+
(0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
|
|
204
|
+
code: api_1.SpanStatusCode.OK,
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
(0, vitest_1.it)('deve marcar span como falha', () => {
|
|
208
|
+
spanResult.setSuccess(false);
|
|
209
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', false);
|
|
210
|
+
(0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
|
|
211
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
(0, vitest_1.describe)('setError', () => {
|
|
216
|
+
(0, vitest_1.it)('deve registrar erro no span', () => {
|
|
217
|
+
const error = new Error('Test error');
|
|
218
|
+
spanResult.setError(error);
|
|
219
|
+
(0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
|
|
220
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'Error');
|
|
221
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'Test error');
|
|
222
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', false);
|
|
223
|
+
(0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
|
|
224
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
225
|
+
message: 'Test error',
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
(0, vitest_1.it)('deve incluir stack trace quando disponível', () => {
|
|
229
|
+
const error = new Error('Error with stack');
|
|
230
|
+
error.stack = 'Error: Error with stack\n at test.ts:1:1';
|
|
231
|
+
spanResult.setError(error);
|
|
232
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.stack', error.stack);
|
|
233
|
+
});
|
|
234
|
+
(0, vitest_1.it)('deve funcionar com erro customizado', () => {
|
|
235
|
+
class CustomError extends Error {
|
|
236
|
+
constructor(message) {
|
|
237
|
+
super(message);
|
|
238
|
+
this.name = 'CustomError';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const error = new CustomError('Custom error message');
|
|
242
|
+
spanResult.setError(error);
|
|
243
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'CustomError');
|
|
244
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'Custom error message');
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
(0, vitest_1.describe)('setAttribute', () => {
|
|
248
|
+
(0, vitest_1.it)('deve adicionar atributo string', () => {
|
|
249
|
+
spanResult.setAttribute('custom.key', 'custom value');
|
|
250
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.key', 'custom value');
|
|
251
|
+
});
|
|
252
|
+
(0, vitest_1.it)('deve adicionar atributo numérico', () => {
|
|
253
|
+
spanResult.setAttribute('custom.count', 123);
|
|
254
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.count', 123);
|
|
255
|
+
});
|
|
256
|
+
(0, vitest_1.it)('deve adicionar atributo booleano', () => {
|
|
257
|
+
spanResult.setAttribute('custom.enabled', true);
|
|
258
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.enabled', true);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
(0, vitest_1.describe)('recordException', () => {
|
|
263
|
+
(0, vitest_1.it)('deve registrar exceção com todos os atributos', () => {
|
|
264
|
+
const error = new Error('Exception test');
|
|
265
|
+
error.stack = 'Error stack trace here';
|
|
266
|
+
standardTracer.recordException(mockSpan, error);
|
|
267
|
+
(0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
|
|
268
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'Error');
|
|
269
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'Exception test');
|
|
270
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.stack', 'Error stack trace here');
|
|
271
|
+
});
|
|
272
|
+
(0, vitest_1.it)('deve funcionar sem stack trace', () => {
|
|
273
|
+
const error = new Error('No stack');
|
|
274
|
+
delete error.stack;
|
|
275
|
+
standardTracer.recordException(mockSpan, error);
|
|
276
|
+
(0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
|
|
277
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'Error');
|
|
278
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'No stack');
|
|
279
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledTimes(2);
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
(0, vitest_1.describe)('cenários de uso completos', () => {
|
|
283
|
+
(0, vitest_1.it)('deve gerenciar fluxo de sucesso completo', () => {
|
|
284
|
+
const spanResult = standardTracer.startSpan({
|
|
285
|
+
spanName: 'complete-operation',
|
|
286
|
+
serviceName: 'complete-service',
|
|
287
|
+
environment: 'production',
|
|
288
|
+
execution: {
|
|
289
|
+
functionName: 'processData',
|
|
290
|
+
requestId: 'req-123',
|
|
291
|
+
},
|
|
292
|
+
http: {
|
|
293
|
+
method: 'POST',
|
|
294
|
+
endpoint: '/api/data',
|
|
295
|
+
},
|
|
296
|
+
});
|
|
297
|
+
spanResult.setAttribute('custom.step', 'processing');
|
|
298
|
+
spanResult.setSuccess(true);
|
|
299
|
+
spanResult.end();
|
|
300
|
+
(0, vitest_1.expect)(mockTracer.startSpan).toHaveBeenCalled();
|
|
301
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.step', 'processing');
|
|
302
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', true);
|
|
303
|
+
(0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
|
|
304
|
+
code: api_1.SpanStatusCode.OK,
|
|
305
|
+
});
|
|
306
|
+
(0, vitest_1.expect)(mockSpan.end).toHaveBeenCalled();
|
|
307
|
+
});
|
|
308
|
+
(0, vitest_1.it)('deve gerenciar fluxo de erro completo', () => {
|
|
309
|
+
const spanResult = standardTracer.startSpan({
|
|
310
|
+
spanName: 'error-operation',
|
|
311
|
+
serviceName: 'error-service',
|
|
312
|
+
environment: 'production',
|
|
313
|
+
user: {
|
|
314
|
+
accountUserUid: 'user-123',
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
const error = new Error('Operation failed');
|
|
318
|
+
spanResult.setError(error);
|
|
319
|
+
spanResult.end();
|
|
320
|
+
(0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
|
|
321
|
+
(0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', false);
|
|
322
|
+
(0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
|
|
323
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
324
|
+
message: 'Operation failed',
|
|
325
|
+
});
|
|
326
|
+
(0, vitest_1.expect)(mockSpan.end).toHaveBeenCalled();
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9fX3Rlc3RzX18vdHJhY2VyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBOEQ7QUFDOUQsc0NBQTJDO0FBQzNDLDRDQUE4RDtBQUU5RCxJQUFBLGlCQUFRLEVBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUksVUFBZSxDQUFDO0lBQ3BCLElBQUksUUFBYSxDQUFDO0lBQ2xCLElBQUksY0FBOEIsQ0FBQztJQUVuQyxJQUFBLG1CQUFVLEVBQUMsR0FBRyxFQUFFO1FBQ2QsUUFBUSxHQUFHO1lBQ1QsR0FBRyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDWixZQUFZLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQixTQUFTLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQixlQUFlLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtTQUN6QixDQUFDO1FBRUYsVUFBVSxHQUFHO1lBQ1gsU0FBUyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1NBQzdDLENBQUM7UUFFRixjQUFjLEdBQUcsSUFBSSx1QkFBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLElBQUEsV0FBRSxFQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUMxQyxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQyxDQUFDO1lBRUgsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLG9C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TyxFQUFFLGtCQUFrQjthQUM1QixDQUFDLENBQUM7WUFDSCxJQUFBLGVBQU0sRUFBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgaXQsIGV4cGVjdCwgdmksIGJlZm9yZUVhY2ggfSBmcm9tICd2aXRlc3QnO1xyXG5pbXBvcnQgeyBTdGFuZGFyZFRyYWNlciB9IGZyb20gJy4uL3RyYWNlcic7XHJcbmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlLCBTcGFuS2luZCB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XHJcblxyXG5kZXNjcmliZSgnU3RhbmRhcmRUcmFjZXInLCAoKSA9PiB7XHJcbiAgbGV0IG1vY2tUcmFjZXI6IGFueTtcclxuICBsZXQgbW9ja1NwYW46IGFueTtcclxuICBsZXQgc3RhbmRhcmRUcmFjZXI6IFN0YW5kYXJkVHJhY2VyO1xyXG5cclxuICBiZWZvcmVFYWNoKCgpID0+IHtcclxuICAgIG1vY2tTcGFuID0ge1xyXG4gICAgICBlbmQ6IHZpLmZuKCksXHJcbiAgICAgIHNldEF0dHJpYnV0ZTogdmkuZm4oKSxcclxuICAgICAgc2V0U3RhdHVzOiB2aS5mbigpLFxyXG4gICAgICByZWNvcmRFeGNlcHRpb246IHZpLmZuKCksXHJcbiAgICB9O1xyXG5cclxuICAgIG1vY2tUcmFjZXIgPSB7XHJcbiAgICAgIHN0YXJ0U3BhbjogdmkuZm4oKS5tb2NrUmV0dXJuVmFsdWUobW9ja1NwYW4pLFxyXG4gICAgfTtcclxuXHJcbiAgICBzdGFuZGFyZFRyYWNlciA9IG5ldyBTdGFuZGFyZFRyYWNlcihtb2NrVHJhY2VyLCAndGVzdC1zZXJ2aWNlJyk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdzdGFydFNwYW4nLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBjcmlhciBzcGFuIGNvbSBub21lIGUgYXRyaWJ1dG9zIGLDoXNpY29zJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBzcGFuUmVzdWx0ID0gc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ3Rlc3Qtb3BlcmF0aW9uJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ215LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tUcmFjZXIuc3RhcnRTcGFuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdC1vcGVyYXRpb24nLCB7XHJcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiAnbXktc2VydmljZScsXHJcbiAgICAgICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZXhwZWN0KHNwYW5SZXN1bHQuc3BhbikudG9CZShtb2NrU3Bhbik7XHJcbiAgICAgIGV4cGVjdChzcGFuUmVzdWx0LmVuZCkudG9CZURlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KHNwYW5SZXN1bHQuc2V0U3VjY2VzcykudG9CZURlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KHNwYW5SZXN1bHQuc2V0RXJyb3IpLnRvQmVEZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChzcGFuUmVzdWx0LnNldEF0dHJpYnV0ZSkudG9CZURlZmluZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgZGVmYXVsdFNlcnZpY2VOYW1lIHF1YW5kbyBzZXJ2aWNlTmFtZSBuw6NvIGZvcm5lY2lkbycsICgpID0+IHtcclxuICAgICAgc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ3Rlc3Qtb3BlcmF0aW9uJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Rlc3Qtc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBhdHJpYnV0b3MgZGUgZXhlY3XDp8OjbycsICgpID0+IHtcclxuICAgICAgc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ3Byb2Nlc3MtcmVxdWVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdhcGktc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Byb2Nlc3NQYXltZW50JyxcclxuICAgICAgICAgIGludm9jYXRpb25JZDogJ2ludi0xMjMnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTQ1NicsXHJcbiAgICAgICAgICByZXF1ZXN0SWQ6ICdyZXEtNzg5JyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdQYXltZW50Q29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAncHJvY2VzcycsXHJcbiAgICAgICAgICBvcmlnaW46ICdtb2JpbGUnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG1vY2tUcmFjZXIuc3RhcnRTcGFuLm1vY2suY2FsbHNbMF1bMV0uYXR0cmlidXRlcztcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2ZhYXMubmFtZSddKS50b0JlKCdwcm9jZXNzUGF5bWVudCcpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZmFhcy5pbnZvY2F0aW9uX2lkJ10pLnRvQmUoJ2ludi0xMjMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmUoJ2F3cy00NTYnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ3JlcXVlc3QuaWQnXSkudG9CZSgncmVxLTc4OScpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snY29udHJvbGxlci5uYW1lJ10pLnRvQmUoJ1BheW1lbnRDb250cm9sbGVyJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydjb250cm9sbGVyLm1ldGhvZCddKS50b0JlKCdwcm9jZXNzJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydvcmlnaW4nXSkudG9CZSgnbW9iaWxlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGF0cmlidXRvcyBIVFRQJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAnaHR0cC1yZXF1ZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3dlYi1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIGh0dHA6IHtcclxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vb3JkZXJzJyxcclxuICAgICAgICAgIGVuZHBvaW50OiAnL29yZGVycycsXHJcbiAgICAgICAgICBzdGF0dXNDb2RlOiAyMDEsXHJcbiAgICAgICAgICBzY2hlbWU6ICdodHRwcycsXHJcbiAgICAgICAgICBob3N0OiAnYXBpLmV4YW1wbGUuY29tJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2NrVHJhY2VyLnN0YXJ0U3Bhbi5tb2NrLmNhbGxzWzBdWzFdLmF0dHJpYnV0ZXM7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydodHRwLnVybCddKS50b0JlKCdodHRwczovL2FwaS5leGFtcGxlLmNvbS9vcmRlcnMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2h0dHAudGFyZ2V0J10pLnRvQmUoJy9vcmRlcnMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2h0dHAuc3RhdHVzX2NvZGUnXSkudG9CZSgyMDEpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snaHR0cC5zY2hlbWUnXSkudG9CZSgnaHR0cHMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2h0dHAuaG9zdCddKS50b0JlKCdhcGkuZXhhbXBsZS5jb20nKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgYXRyaWJ1dG9zIGRlIHVzdcOhcmlvJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAndXNlci1vcGVyYXRpb24nLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndXNlci1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQtNDU2JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTc4OScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snYWNjb3VudFVzZXIudWlkJ10pLnRvQmUoJ3VzZXItMTIzJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydhY2NvdW50LnVpZCddKS50b0JlKCdhY2NvdW50LTQ1NicpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snYXBwbGljYXRpb24udWlkJ10pLnRvQmUoJ2FwcC03ODknKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgYXRyaWJ1dG9zIGRlIHBlcmZvcm1hbmNlJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAncGVyZm9ybWFuY2UtdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdwZXJmLXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAndGVzdCcsXHJcbiAgICAgICAgcGVyZm9ybWFuY2U6IHtcclxuICAgICAgICAgIGR1cmF0aW9uTXM6IDI1MCxcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZHVyYXRpb24ubXMnXSkudG9CZSgyNTApO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZXhlY3V0aW9uLnN1Y2Nlc3MnXSkudG9CZSh0cnVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgYXRyaWJ1dG9zIGRlIGVycm8nLCAoKSA9PiB7XHJcbiAgICAgIHN0YW5kYXJkVHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgc3Bhbk5hbWU6ICdlcnJvci1vcGVyYXRpb24nLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnZXJyb3Itc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBlcnJvcjoge1xyXG4gICAgICAgICAgdHlwZTogJ1ZhbGlkYXRpb25FcnJvcicsXHJcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dCcsXHJcbiAgICAgICAgICBzdGFjazogJ0Vycm9yIHN0YWNrIHRyYWNlJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2NrVHJhY2VyLnN0YXJ0U3Bhbi5tb2NrLmNhbGxzWzBdWzFdLmF0dHJpYnV0ZXM7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydlcnJvci50eXBlJ10pLnRvQmUoJ1ZhbGlkYXRpb25FcnJvcicpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZXJyb3IubWVzc2FnZSddKS50b0JlKCdJbnZhbGlkIGlucHV0Jyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydlcnJvci5zdGFjayddKS50b0JlKCdFcnJvciBzdGFjayB0cmFjZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBhdHJpYnV0b3MgY3VzdG9taXphZG9zJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAnY3VzdG9tLW9wZXJhdGlvbicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdjdXN0b20tc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBhdHRyaWJ1dGVzOiB7XHJcbiAgICAgICAgICAnY3VzdG9tLmZpZWxkJzogJ3ZhbHVlJyxcclxuICAgICAgICAgICdjdXN0b20uY291bnQnOiA0MixcclxuICAgICAgICAgICdjdXN0b20uZW5hYmxlZCc6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snY3VzdG9tLmZpZWxkJ10pLnRvQmUoJ3ZhbHVlJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydjdXN0b20uY291bnQnXSkudG9CZSg0Mik7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydjdXN0b20uZW5hYmxlZCddKS50b0JlKHRydWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgZmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZCBlIG51bGwnLCAoKSA9PiB7XHJcbiAgICAgIHN0YW5kYXJkVHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgc3Bhbk5hbWU6ICdmaWx0ZXItdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdmaWx0ZXItc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Rlc3QnLFxyXG4gICAgICAgICAgaW52b2NhdGlvbklkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6IG51bGwgYXMgYW55LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYXR0cmlidXRlczoge1xyXG4gICAgICAgICAgdmFsaWQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBpbnZhbGlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgICAgbnVsbFZhbHVlOiBudWxsIGFzIGFueSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2NrVHJhY2VyLnN0YXJ0U3Bhbi5tb2NrLmNhbGxzWzBdWzFdLmF0dHJpYnV0ZXM7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydmYWFzLm5hbWUnXSkudG9CZSgndGVzdCcpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZmFhcy5pbnZvY2F0aW9uX2lkJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ3ZhbGlkJ10pLnRvQmUoJ3ZhbHVlJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydpbnZhbGlkJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ251bGxWYWx1ZSddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ1N0YW5kYXJkU3BhblJlc3VsdCcsICgpID0+IHtcclxuICAgIGxldCBzcGFuUmVzdWx0OiBhbnk7XHJcblxyXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XHJcbiAgICAgIHNwYW5SZXN1bHQgPSBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAndGVzdC1zcGFuJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnZW5kJywgKCkgPT4ge1xyXG4gICAgICBpdCgnZGV2ZSBmaW5hbGl6YXIgbyBzcGFuJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuZW5kKCk7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5lbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnc2V0U3VjY2VzcycsICgpID0+IHtcclxuICAgICAgaXQoJ2RldmUgbWFyY2FyIHNwYW4gY29tbyBzdWNlc3NvJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0U3VjY2Vzcyh0cnVlKTtcclxuXHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXhlY3V0aW9uLnN1Y2Nlc3MnLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldFN0YXR1cykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xyXG4gICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuT0ssXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaXQoJ2RldmUgbWFyY2FyIHNwYW4gY29tbyBmYWxoYScsICgpID0+IHtcclxuICAgICAgICBzcGFuUmVzdWx0LnNldFN1Y2Nlc3MoZmFsc2UpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAgICdleGVjdXRpb24uc3VjY2VzcycsXHJcbiAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldFN0YXR1cykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xyXG4gICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGVzY3JpYmUoJ3NldEVycm9yJywgKCkgPT4ge1xyXG4gICAgICBpdCgnZGV2ZSByZWdpc3RyYXIgZXJybyBubyBzcGFuJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdUZXN0IGVycm9yJyk7XHJcblxyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0RXJyb3IoZXJyb3IpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4ucmVjb3JkRXhjZXB0aW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChlcnJvcik7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXJyb3IudHlwZScsXHJcbiAgICAgICAgICAnRXJyb3InXHJcbiAgICAgICAgKTtcclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAgICdlcnJvci5tZXNzYWdlJyxcclxuICAgICAgICAgICdUZXN0IGVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXhlY3V0aW9uLnN1Y2Nlc3MnLFxyXG4gICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRTdGF0dXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcclxuICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxyXG4gICAgICAgICAgbWVzc2FnZTogJ1Rlc3QgZXJyb3InLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGl0KCdkZXZlIGluY2x1aXIgc3RhY2sgdHJhY2UgcXVhbmRvIGRpc3BvbsOtdmVsJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdFcnJvciB3aXRoIHN0YWNrJyk7XHJcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSAnRXJyb3I6IEVycm9yIHdpdGggc3RhY2tcXG4gIGF0IHRlc3QudHM6MToxJztcclxuXHJcbiAgICAgICAgc3BhblJlc3VsdC5zZXRFcnJvcihlcnJvcik7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRBdHRyaWJ1dGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgICAgJ2Vycm9yLnN0YWNrJyxcclxuICAgICAgICAgIGVycm9yLnN0YWNrXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpdCgnZGV2ZSBmdW5jaW9uYXIgY29tIGVycm8gY3VzdG9taXphZG8nLCAoKSA9PiB7XHJcbiAgICAgICAgY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICAgICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdDdXN0b21FcnJvcic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBDdXN0b21FcnJvcignQ3VzdG9tIGVycm9yIG1lc3NhZ2UnKTtcclxuXHJcbiAgICAgICAgc3BhblJlc3VsdC5zZXRFcnJvcihlcnJvcik7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRBdHRyaWJ1dGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgICAgJ2Vycm9yLnR5cGUnLFxyXG4gICAgICAgICAgJ0N1c3RvbUVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXJyb3IubWVzc2FnZScsXHJcbiAgICAgICAgICAnQ3VzdG9tIGVycm9yIG1lc3NhZ2UnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnc2V0QXR0cmlidXRlJywgKCkgPT4ge1xyXG4gICAgICBpdCgnZGV2ZSBhZGljaW9uYXIgYXRyaWJ1dG8gc3RyaW5nJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0QXR0cmlidXRlKCdjdXN0b20ua2V5JywgJ2N1c3RvbSB2YWx1ZScpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAgICdjdXN0b20ua2V5JyxcclxuICAgICAgICAgICdjdXN0b20gdmFsdWUnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpdCgnZGV2ZSBhZGljaW9uYXIgYXRyaWJ1dG8gbnVtw6lyaWNvJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0QXR0cmlidXRlKCdjdXN0b20uY291bnQnLCAxMjMpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY3VzdG9tLmNvdW50JywgMTIzKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpdCgnZGV2ZSBhZGljaW9uYXIgYXRyaWJ1dG8gYm9vbGVhbm8nLCAoKSA9PiB7XHJcbiAgICAgICAgc3BhblJlc3VsdC5zZXRBdHRyaWJ1dGUoJ2N1c3RvbS5lbmFibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRBdHRyaWJ1dGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgICAgJ2N1c3RvbS5lbmFibGVkJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgncmVjb3JkRXhjZXB0aW9uJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgcmVnaXN0cmFyIGV4Y2XDp8OjbyBjb20gdG9kb3Mgb3MgYXRyaWJ1dG9zJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignRXhjZXB0aW9uIHRlc3QnKTtcclxuICAgICAgZXJyb3Iuc3RhY2sgPSAnRXJyb3Igc3RhY2sgdHJhY2UgaGVyZSc7XHJcblxyXG4gICAgICBzdGFuZGFyZFRyYWNlci5yZWNvcmRFeGNlcHRpb24obW9ja1NwYW4sIGVycm9yKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5yZWNvcmRFeGNlcHRpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVycm9yKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yLnR5cGUnLCAnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2Vycm9yLm1lc3NhZ2UnLFxyXG4gICAgICAgICdFeGNlcHRpb24gdGVzdCdcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2Vycm9yLnN0YWNrJyxcclxuICAgICAgICAnRXJyb3Igc3RhY2sgdHJhY2UgaGVyZSdcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGZ1bmNpb25hciBzZW0gc3RhY2sgdHJhY2UnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdObyBzdGFjaycpO1xyXG4gICAgICBkZWxldGUgZXJyb3Iuc3RhY2s7XHJcblxyXG4gICAgICBzdGFuZGFyZFRyYWNlci5yZWNvcmRFeGNlcHRpb24obW9ja1NwYW4sIGVycm9yKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5yZWNvcmRFeGNlcHRpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVycm9yKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yLnR5cGUnLCAnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2Vycm9yLm1lc3NhZ2UnLFxyXG4gICAgICAgICdObyBzdGFjaydcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpOyAvLyBBcGVuYXMgdHlwZSBlIG1lc3NhZ2VcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnY2Vuw6FyaW9zIGRlIHVzbyBjb21wbGV0b3MnLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBnZXJlbmNpYXIgZmx1eG8gZGUgc3VjZXNzbyBjb21wbGV0bycsICgpID0+IHtcclxuICAgICAgY29uc3Qgc3BhblJlc3VsdCA9IHN0YW5kYXJkVHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgc3Bhbk5hbWU6ICdjb21wbGV0ZS1vcGVyYXRpb24nLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnY29tcGxldGUtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Byb2Nlc3NEYXRhJyxcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0xMjMnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvZGF0YScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzcGFuUmVzdWx0LnNldEF0dHJpYnV0ZSgnY3VzdG9tLnN0ZXAnLCAncHJvY2Vzc2luZycpO1xyXG4gICAgICBzcGFuUmVzdWx0LnNldFN1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgIHNwYW5SZXN1bHQuZW5kKCk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja1RyYWNlci5zdGFydFNwYW4pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2N1c3RvbS5zdGVwJyxcclxuICAgICAgICAncHJvY2Vzc2luZydcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2V4ZWN1dGlvbi5zdWNjZXNzJyxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRTdGF0dXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcclxuICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyxcclxuICAgICAgfSk7XHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5lbmQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGdlcmVuY2lhciBmbHV4byBkZSBlcnJvIGNvbXBsZXRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBzcGFuUmVzdWx0ID0gc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ2Vycm9yLW9wZXJhdGlvbicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdlcnJvci1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ09wZXJhdGlvbiBmYWlsZWQnKTtcclxuXHJcbiAgICAgIHNwYW5SZXN1bHQuc2V0RXJyb3IoZXJyb3IpO1xyXG4gICAgICBzcGFuUmVzdWx0LmVuZCgpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnJlY29yZEV4Y2VwdGlvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXJyb3IpO1xyXG4gICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAnZXhlY3V0aW9uLnN1Y2Nlc3MnLFxyXG4gICAgICAgIGZhbHNlXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRTdGF0dXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcclxuICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcclxuICAgICAgICBtZXNzYWdlOiAnT3BlcmF0aW9uIGZhaWxlZCcsXHJcbiAgICAgIH0pO1xyXG4gICAgICBleHBlY3QobW9ja1NwYW4uZW5kKS50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StandardTracer = exports.StandardLogger = void 0;
|
|
4
|
+
var logger_1 = require("./logger");
|
|
5
|
+
Object.defineProperty(exports, "StandardLogger", { enumerable: true, get: function () { return logger_1.StandardLogger; } });
|
|
6
|
+
var tracer_1 = require("./tracer");
|
|
7
|
+
Object.defineProperty(exports, "StandardTracer", { enumerable: true, get: function () { return tracer_1.StandardTracer; } });
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBMEM7QUFBakMsd0dBQUEsY0FBYyxPQUFBO0FBRXZCLG1DQUEwQztBQUFqQyx3R0FBQSxjQUFjLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTdGFuZGFyZExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcclxuZXhwb3J0IHsgSVN0YW5kYXJkTG9nZ2VyLCBTdGFuZGFyZExvZ0RhdGEgfSBmcm9tICcuL2xvZ2dlci10eXBlcyc7XHJcbmV4cG9ydCB7IFN0YW5kYXJkVHJhY2VyIH0gZnJvbSAnLi90cmFjZXInO1xyXG5leHBvcnQge1xyXG4gIElTdGFuZGFyZFRyYWNlcixcclxuICBTdGFuZGFyZFRyYWNlRGF0YSxcclxuICBTdGFuZGFyZFNwYW5SZXN1bHQsXHJcbn0gZnJvbSAnLi90cmFjZXItdHlwZXMnO1xyXG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface StandardLogData {
|
|
2
|
+
severity: 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
|
|
3
|
+
message: string;
|
|
4
|
+
error?: Error;
|
|
5
|
+
serviceName: string;
|
|
6
|
+
environment: string;
|
|
7
|
+
http?: {
|
|
8
|
+
method?: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
endpoint?: string;
|
|
11
|
+
statusCode?: number;
|
|
12
|
+
headers?: Record<string, any>;
|
|
13
|
+
body?: any;
|
|
14
|
+
params?: Record<string, any>;
|
|
15
|
+
query?: Record<string, any>;
|
|
16
|
+
};
|
|
17
|
+
user?: {
|
|
18
|
+
accountUserUid?: string;
|
|
19
|
+
accountUid?: string;
|
|
20
|
+
applicationUid?: string;
|
|
21
|
+
};
|
|
22
|
+
execution?: {
|
|
23
|
+
requestId?: string;
|
|
24
|
+
awsRequestId?: string;
|
|
25
|
+
functionName?: string;
|
|
26
|
+
invocationId?: string;
|
|
27
|
+
controller?: string;
|
|
28
|
+
controllerMethod?: string;
|
|
29
|
+
origin?: string;
|
|
30
|
+
};
|
|
31
|
+
performance?: {
|
|
32
|
+
durationMs?: number;
|
|
33
|
+
success?: boolean;
|
|
34
|
+
};
|
|
35
|
+
context?: Record<string, any>;
|
|
36
|
+
timestamp: string;
|
|
37
|
+
}
|
|
38
|
+
export interface IStandardLogger {
|
|
39
|
+
logError(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
40
|
+
logInfo(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
41
|
+
logWarn(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
42
|
+
logDebug(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvbG9nZ2VyLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogSW50ZXJmYWNlIHBhZHLDo28gcGFyYSBsb2dzIGVzdHJ1dHVyYWRvcyBlbSB0b2RhIGEgYXBsaWNhw6fDo28uXHJcbiAqIENvbWJpbmEgY2FtcG9zIGltcG9ydGFudGVzIGRlIGFtYmFzIGltcGxlbWVudGHDp8O1ZXMgKFRzZWQgZSBTU1QpLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZExvZ0RhdGEge1xyXG4gIC8vIEluZm9ybWHDp8O1ZXMgZG8gZXJyby9ldmVudG9cclxuICBzZXZlcml0eTogJ0VSUk9SJyB8ICdXQVJOJyB8ICdJTkZPJyB8ICdERUJVRyc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIGVycm9yPzogRXJyb3I7XHJcblxyXG4gIC8vIElkZW50aWZpY2HDp8OjbyBkbyBzZXJ2acOnb1xyXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XHJcbiAgZW52aXJvbm1lbnQ6IHN0cmluZzsgLy8gZGV2ZWxvcG1lbnQsIHN0YWdpbmcsIHByb2R1Y3Rpb25cclxuXHJcbiAgLy8gQ29udGV4dG8gZGEgcmVxdWlzacOnw6NvIEhUVFBcclxuICBodHRwPzoge1xyXG4gICAgbWV0aG9kPzogc3RyaW5nO1xyXG4gICAgdXJsPzogc3RyaW5nO1xyXG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XHJcbiAgICBzdGF0dXNDb2RlPzogbnVtYmVyO1xyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICBib2R5PzogYW55O1xyXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICB9O1xyXG5cclxuICAvLyBJZGVudGlmaWNhw6fDo28gZG8gdXN1w6FyaW8vY29udGFcclxuICB1c2VyPzoge1xyXG4gICAgYWNjb3VudFVzZXJVaWQ/OiBzdHJpbmc7XHJcbiAgICBhY2NvdW50VWlkPzogc3RyaW5nO1xyXG4gICAgYXBwbGljYXRpb25VaWQ/OiBzdHJpbmc7XHJcbiAgfTtcclxuXHJcbiAgLy8gQ29udGV4dG8gZGEgZXhlY3XDp8Ojb1xyXG4gIGV4ZWN1dGlvbj86IHtcclxuICAgIHJlcXVlc3RJZD86IHN0cmluZztcclxuICAgIGF3c1JlcXVlc3RJZD86IHN0cmluZztcclxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcclxuICAgIGludm9jYXRpb25JZD86IHN0cmluZztcclxuICAgIGNvbnRyb2xsZXI/OiBzdHJpbmc7XHJcbiAgICBjb250cm9sbGVyTWV0aG9kPzogc3RyaW5nO1xyXG4gICAgb3JpZ2luPzogc3RyaW5nOyAvLyBvcmlnZW0gZGEgcmVxdWlzacOnw6NvIChleDogd2ViLCBtb2JpbGUpXHJcbiAgfTtcclxuXHJcbiAgLy8gUGVyZm9ybWFuY2VcclxuICBwZXJmb3JtYW5jZT86IHtcclxuICAgIGR1cmF0aW9uTXM/OiBudW1iZXI7XHJcbiAgICBzdWNjZXNzPzogYm9vbGVhbjtcclxuICB9O1xyXG5cclxuICAvLyBDb250ZXh0byBhZGljaW9uYWwgbGl2cmVcclxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuXHJcbiAgLy8gVGltZXN0YW1wXHJcbiAgdGltZXN0YW1wOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgcGFyYSBvIGxvZ2dlciBjb3JlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElTdGFuZGFyZExvZ2dlciB7XHJcbiAgbG9nRXJyb3IoXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD47XHJcbiAgbG9nSW5mbyhkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPik6IFByb21pc2U8dm9pZD47XHJcbiAgbG9nV2FybihkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPik6IFByb21pc2U8dm9pZD47XHJcbiAgbG9nRGVidWcoXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD47XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Logger } from '@opentelemetry/api-logs';
|
|
2
|
+
import { IStandardLogger, StandardLogData } from './logger-types';
|
|
3
|
+
export declare class StandardLogger implements IStandardLogger {
|
|
4
|
+
private readonly defaultServiceName;
|
|
5
|
+
private logger;
|
|
6
|
+
constructor(logger: Logger, defaultServiceName?: string);
|
|
7
|
+
logError(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
8
|
+
logInfo(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
9
|
+
logWarn(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
10
|
+
logDebug(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
|
|
11
|
+
private log;
|
|
12
|
+
private buildAttributes;
|
|
13
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
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.StandardLogger = void 0;
|
|
13
|
+
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
14
|
+
class StandardLogger {
|
|
15
|
+
constructor(logger, defaultServiceName = 'unknown-service') {
|
|
16
|
+
this.defaultServiceName = defaultServiceName;
|
|
17
|
+
this.logger = logger;
|
|
18
|
+
}
|
|
19
|
+
logError(data) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
yield this.log(Object.assign(Object.assign({}, data), { severity: 'ERROR' }));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
logInfo(data) {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
yield this.log(Object.assign(Object.assign({}, data), { severity: 'INFO' }));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
logWarn(data) {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
yield this.log(Object.assign(Object.assign({}, data), { severity: 'WARN' }));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
logDebug(data) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
yield this.log(Object.assign(Object.assign({}, data), { severity: 'DEBUG' }));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
log(data) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
const fullData = Object.assign(Object.assign({}, data), { timestamp: new Date().toISOString(), serviceName: data.serviceName || this.defaultServiceName });
|
|
42
|
+
const severityMap = {
|
|
43
|
+
ERROR: api_logs_1.SeverityNumber.ERROR,
|
|
44
|
+
WARN: api_logs_1.SeverityNumber.WARN,
|
|
45
|
+
INFO: api_logs_1.SeverityNumber.INFO,
|
|
46
|
+
DEBUG: api_logs_1.SeverityNumber.DEBUG,
|
|
47
|
+
};
|
|
48
|
+
const logRecord = {
|
|
49
|
+
severityNumber: severityMap[fullData.severity],
|
|
50
|
+
severityText: fullData.severity,
|
|
51
|
+
body: fullData.message,
|
|
52
|
+
attributes: this.buildAttributes(fullData),
|
|
53
|
+
};
|
|
54
|
+
this.logger.emit(logRecord);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
buildAttributes(data) {
|
|
58
|
+
const attributes = {
|
|
59
|
+
timestamp: data.timestamp,
|
|
60
|
+
'service.name': data.serviceName,
|
|
61
|
+
'deployment.environment.name': data.environment,
|
|
62
|
+
};
|
|
63
|
+
if (data.error) {
|
|
64
|
+
attributes['error.type'] = data.error.name;
|
|
65
|
+
attributes['error.message'] = data.error.message;
|
|
66
|
+
attributes['error.stack'] = data.error.stack || '';
|
|
67
|
+
}
|
|
68
|
+
if (data.http) {
|
|
69
|
+
if (data.http.method)
|
|
70
|
+
attributes['http.method'] = data.http.method;
|
|
71
|
+
if (data.http.url)
|
|
72
|
+
attributes['http.url'] = data.http.url;
|
|
73
|
+
if (data.http.endpoint)
|
|
74
|
+
attributes['http.endpoint'] = data.http.endpoint;
|
|
75
|
+
if (data.http.statusCode)
|
|
76
|
+
attributes['http.status_code'] = data.http.statusCode;
|
|
77
|
+
if (data.http.headers)
|
|
78
|
+
attributes['http.headers'] = JSON.stringify(data.http.headers);
|
|
79
|
+
if (data.http.body)
|
|
80
|
+
attributes['http.body'] = JSON.stringify(data.http.body);
|
|
81
|
+
if (data.http.params)
|
|
82
|
+
attributes['http.params'] = JSON.stringify(data.http.params);
|
|
83
|
+
if (data.http.query)
|
|
84
|
+
attributes['http.query'] = JSON.stringify(data.http.query);
|
|
85
|
+
}
|
|
86
|
+
if (data.user) {
|
|
87
|
+
if (data.user.accountUserUid)
|
|
88
|
+
attributes['accountUser.uid'] = data.user.accountUserUid;
|
|
89
|
+
if (data.user.accountUid)
|
|
90
|
+
attributes['account.uid'] = data.user.accountUid;
|
|
91
|
+
if (data.user.applicationUid)
|
|
92
|
+
attributes['application.uid'] = data.user.applicationUid;
|
|
93
|
+
}
|
|
94
|
+
if (data.execution) {
|
|
95
|
+
if (data.execution.requestId)
|
|
96
|
+
attributes['request.id'] = data.execution.requestId;
|
|
97
|
+
if (data.execution.awsRequestId)
|
|
98
|
+
attributes['aws.request.id'] = data.execution.awsRequestId;
|
|
99
|
+
if (data.execution.functionName)
|
|
100
|
+
attributes['faas.name'] = data.execution.functionName;
|
|
101
|
+
if (data.execution.invocationId)
|
|
102
|
+
attributes['faas.invocation_id'] = data.execution.invocationId;
|
|
103
|
+
if (data.execution.controller)
|
|
104
|
+
attributes['controller.name'] = data.execution.controller;
|
|
105
|
+
if (data.execution.controllerMethod)
|
|
106
|
+
attributes['controller.method'] = data.execution.controllerMethod;
|
|
107
|
+
if (data.execution.origin)
|
|
108
|
+
attributes['origin'] = data.execution.origin;
|
|
109
|
+
}
|
|
110
|
+
if (data.performance) {
|
|
111
|
+
if (data.performance.durationMs)
|
|
112
|
+
attributes['duration.ms'] = data.performance.durationMs;
|
|
113
|
+
if (data.performance.success !== undefined)
|
|
114
|
+
attributes['execution.success'] = data.performance.success;
|
|
115
|
+
}
|
|
116
|
+
if (data.context) {
|
|
117
|
+
attributes['context'] = JSON.stringify(data.context);
|
|
118
|
+
}
|
|
119
|
+
return Object.fromEntries(Object.entries(attributes).filter(([, value]) => value !== undefined && value !== null));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.StandardLogger = StandardLogger;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFpRTtBQU9qRSxNQUFhLGNBQWM7SUFHekIsWUFDRSxNQUFjLEVBQ0cscUJBQTZCLGlCQUFpQjtRQUE5Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRCO1FBRS9ELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFSyxRQUFRLENBQ1osSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxPQUFPLElBQUcsQ0FBQztRQUNqRCxDQUFDO0tBQUE7SUFFSyxPQUFPLENBQ1gsSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxNQUFNLElBQUcsQ0FBQztRQUNoRCxDQUFDO0tBQUE7SUFFSyxPQUFPLENBQ1gsSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxNQUFNLElBQUcsQ0FBQztRQUNoRCxDQUFDO0tBQUE7SUFFSyxRQUFRLENBQ1osSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxPQUFPLElBQUcsQ0FBQztRQUNqRCxDQUFDO0tBQUE7SUFFYSxHQUFHLENBQ2YsSUFFQzs7WUFFRCxNQUFNLFFBQVEsbUNBQ1QsSUFBSSxLQUNQLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQ3pELENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEIsS0FBSyxFQUFFLHlCQUFjLENBQUMsS0FBSztnQkFDM0Is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QUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDMUUsQ0FBQztRQUdELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVO2dCQUM3QixVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDMUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTO2dCQUN4QyxVQUFVLENBQUMsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUMvRCxDQUFDO1FBR0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFHRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUMvQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUNyRCxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1SUQsd0NBNElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIsIExvZ2dlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzJztcclxuaW1wb3J0IHsgSVN0YW5kYXJkTG9nZ2VyLCBTdGFuZGFyZExvZ0RhdGEgfSBmcm9tICcuL2xvZ2dlci10eXBlcyc7XHJcblxyXG4vKipcclxuICogTG9nZ2VyIGNvcmUgcXVlIGltcGxlbWVudGEgbyBwYWRyw6NvIGRlIGxvZ3MgZXN0cnV0dXJhZG9zLlxyXG4gKiBSZWNlYmUgdW0gTG9nZ2VyUHJvdmlkZXIgZG8gT3BlblRlbGVtZXRyeSBwYXJhIGVtaXRpciBvcyBsb2dzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN0YW5kYXJkTG9nZ2VyIGltcGxlbWVudHMgSVN0YW5kYXJkTG9nZ2VyIHtcclxuICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGxvZ2dlcjogTG9nZ2VyLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U2VydmljZU5hbWU6IHN0cmluZyA9ICd1bmtub3duLXNlcnZpY2UnXHJcbiAgKSB7XHJcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvZ0Vycm9yKFxyXG4gICAgZGF0YTogT21pdDxTdGFuZGFyZExvZ0RhdGEsICdzZXZlcml0eScgfCAndGltZXN0YW1wJz5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubG9nKHsgLi4uZGF0YSwgc2V2ZXJpdHk6ICdFUlJPUicgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2dJbmZvKFxyXG4gICAgZGF0YTogT21pdDxTdGFuZGFyZExvZ0RhdGEsICdzZXZlcml0eScgfCAndGltZXN0YW1wJz5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubG9nKHsgLi4uZGF0YSwgc2V2ZXJpdHk6ICdJTkZPJyB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvZ1dhcm4oXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sb2coeyAuLi5kYXRhLCBzZXZlcml0eTogJ1dBUk4nIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9nRGVidWcoXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sb2coeyAuLi5kYXRhLCBzZXZlcml0eTogJ0RFQlVHJyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9nKFxyXG4gICAgZGF0YTogT21pdDxTdGFuZGFyZExvZ0RhdGEsICd0aW1lc3RhbXAnPiAmIHtcclxuICAgICAgc2V2ZXJpdHk6IFN0YW5kYXJkTG9nRGF0YVsnc2V2ZXJpdHknXTtcclxuICAgIH1cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGZ1bGxEYXRhOiBTdGFuZGFyZExvZ0RhdGEgPSB7XHJcbiAgICAgIC4uLmRhdGEsXHJcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogZGF0YS5zZXJ2aWNlTmFtZSB8fCB0aGlzLmRlZmF1bHRTZXJ2aWNlTmFtZSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2V2ZXJpdHlNYXAgPSB7XHJcbiAgICAgIEVSUk9SOiBTZXZlcml0eU51bWJlci5FUlJPUixcclxuICAgICAgV0FSTjogU2V2ZXJpdHlOdW1iZXIuV0FSTixcclxuICAgICAgSU5GTzogU2V2ZXJpdHlOdW1iZXIuSU5GTyxcclxuICAgICAgREVCVUc6IFNldmVyaXR5TnVtYmVyLkRFQlVHLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsb2dSZWNvcmQgPSB7XHJcbiAgICAgIHNldmVyaXR5TnVtYmVyOiBzZXZlcml0eU1hcFtmdWxsRGF0YS5zZXZlcml0eV0sXHJcbiAgICAgIHNldmVyaXR5VGV4dDogZnVsbERhdGEuc2V2ZXJpdHksXHJcbiAgICAgIGJvZHk6IGZ1bGxEYXRhLm1lc3NhZ2UsXHJcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuYnVpbGRBdHRyaWJ1dGVzKGZ1bGxEYXRhKSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5sb2dnZXIuZW1pdChsb2dSZWNvcmQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEF0dHJpYnV0ZXMoZGF0YTogU3RhbmRhcmRMb2dEYXRhKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICB0aW1lc3RhbXA6IGRhdGEudGltZXN0YW1wLFxyXG4gICAgICAnc2VydmljZS5uYW1lJzogZGF0YS5zZXJ2aWNlTmFtZSxcclxuICAgICAgJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSc6IGRhdGEuZW52aXJvbm1lbnQsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEluZm9ybWHDp8O1ZXMgZG8gZXJyb1xyXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcclxuICAgICAgYXR0cmlidXRlc1snZXJyb3IudHlwZSddID0gZGF0YS5lcnJvci5uYW1lO1xyXG4gICAgICBhdHRyaWJ1dGVzWydlcnJvci5tZXNzYWdlJ10gPSBkYXRhLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgIGF0dHJpYnV0ZXNbJ2Vycm9yLnN0YWNrJ10gPSBkYXRhLmVycm9yLnN0YWNrIHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhUVFBcclxuICAgIGlmIChkYXRhLmh0dHApIHtcclxuICAgICAgaWYgKGRhdGEuaHR0cC5tZXRob2QpIGF0dHJpYnV0ZXNbJ2h0dHAubWV0aG9kJ10gPSBkYXRhLmh0dHAubWV0aG9kO1xyXG4gICAgICBpZiAoZGF0YS5odHRwLnVybCkgYXR0cmlidXRlc1snaHR0cC51cmwnXSA9IGRhdGEuaHR0cC51cmw7XHJcbiAgICAgIGlmIChkYXRhLmh0dHAuZW5kcG9pbnQpIGF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSA9IGRhdGEuaHR0cC5lbmRwb2ludDtcclxuICAgICAgaWYgKGRhdGEuaHR0cC5zdGF0dXNDb2RlKVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2h0dHAuc3RhdHVzX2NvZGUnXSA9IGRhdGEuaHR0cC5zdGF0dXNDb2RlO1xyXG4gICAgICBpZiAoZGF0YS5odHRwLmhlYWRlcnMpXHJcbiAgICAgICAgYXR0cmlidXRlc1snaHR0cC5oZWFkZXJzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmh0dHAuaGVhZGVycyk7XHJcbiAgICAgIGlmIChkYXRhLmh0dHAuYm9keSlcclxuICAgICAgICBhdHRyaWJ1dGVzWydodHRwLmJvZHknXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuaHR0cC5ib2R5KTtcclxuICAgICAgaWYgKGRhdGEuaHR0cC5wYXJhbXMpXHJcbiAgICAgICAgYXR0cmlidXRlc1snaHR0cC5wYXJhbXMnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuaHR0cC5wYXJhbXMpO1xyXG4gICAgICBpZiAoZGF0YS5odHRwLnF1ZXJ5KVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2h0dHAucXVlcnknXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuaHR0cC5xdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXN1w6FyaW9cclxuICAgIGlmIChkYXRhLnVzZXIpIHtcclxuICAgICAgaWYgKGRhdGEudXNlci5hY2NvdW50VXNlclVpZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSA9IGRhdGEudXNlci5hY2NvdW50VXNlclVpZDtcclxuICAgICAgaWYgKGRhdGEudXNlci5hY2NvdW50VWlkKVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2FjY291bnQudWlkJ10gPSBkYXRhLnVzZXIuYWNjb3VudFVpZDtcclxuICAgICAgaWYgKGRhdGEudXNlci5hcHBsaWNhdGlvblVpZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSA9IGRhdGEudXNlci5hcHBsaWNhdGlvblVpZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdcOnw6NvXHJcbiAgICBpZiAoZGF0YS5leGVjdXRpb24pIHtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLnJlcXVlc3RJZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydyZXF1ZXN0LmlkJ10gPSBkYXRhLmV4ZWN1dGlvbi5yZXF1ZXN0SWQ7XHJcbiAgICAgIGlmIChkYXRhLmV4ZWN1dGlvbi5hd3NSZXF1ZXN0SWQpXHJcbiAgICAgICAgYXR0cmlidXRlc1snYXdzLnJlcXVlc3QuaWQnXSA9IGRhdGEuZXhlY3V0aW9uLmF3c1JlcXVlc3RJZDtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLmZ1bmN0aW9uTmFtZSlcclxuICAgICAgICBhdHRyaWJ1dGVzWydmYWFzLm5hbWUnXSA9IGRhdGEuZXhlY3V0aW9uLmZ1bmN0aW9uTmFtZTtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLmludm9jYXRpb25JZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydmYWFzLmludm9jYXRpb25faWQnXSA9IGRhdGEuZXhlY3V0aW9uLmludm9jYXRpb25JZDtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLmNvbnRyb2xsZXIpXHJcbiAgICAgICAgYXR0cmlidXRlc1snY29udHJvbGxlci5uYW1lJ10gPSBkYXRhLmV4ZWN1dGlvbi5jb250cm9sbGVyO1xyXG4gICAgICBpZiAoZGF0YS5leGVjdXRpb24uY29udHJvbGxlck1ldGhvZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydjb250cm9sbGVyLm1ldGhvZCddID0gZGF0YS5leGVjdXRpb24uY29udHJvbGxlck1ldGhvZDtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLm9yaWdpbikgYXR0cmlidXRlc1snb3JpZ2luJ10gPSBkYXRhLmV4ZWN1dGlvbi5vcmlnaW47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGVyZm9ybWFuY2VcclxuICAgIGlmIChkYXRhLnBlcmZvcm1hbmNlKSB7XHJcbiAgICAgIGlmIChkYXRhLnBlcmZvcm1hbmNlLmR1cmF0aW9uTXMpXHJcbiAgICAgICAgYXR0cmlidXRlc1snZHVyYXRpb24ubXMnXSA9IGRhdGEucGVyZm9ybWFuY2UuZHVyYXRpb25NcztcclxuICAgICAgaWYgKGRhdGEucGVyZm9ybWFuY2Uuc3VjY2VzcyAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2V4ZWN1dGlvbi5zdWNjZXNzJ10gPSBkYXRhLnBlcmZvcm1hbmNlLnN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udGV4dG8gYWRpY2lvbmFsXHJcbiAgICBpZiAoZGF0YS5jb250ZXh0KSB7XHJcbiAgICAgIGF0dHJpYnV0ZXNbJ2NvbnRleHQnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZC9udWxsXHJcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxyXG4gICAgICBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKS5maWx0ZXIoXHJcbiAgICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbFxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=
|