@autofleet/rabbit 3.2.19-beta.4 → 3.2.19-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -2
- package/dist/index.js +34 -44
- package/package.json +1 -1
- package/src/index.ts +62 -45
- package/src/lib/types.ts +2 -0
- package/coverage/clover.xml +0 -7
- package/coverage/coverage-final.json +0 -1
- package/coverage/lcov-report/base.css +0 -212
- package/coverage/lcov-report/index.html +0 -60
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -1
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -158
- package/coverage/lcov.info +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -58,7 +58,6 @@ declare class RabbitMq implements IAfRabbitMq {
|
|
|
58
58
|
DISCONNECT_MSG: string;
|
|
59
59
|
RECONNECT_MSG: string;
|
|
60
60
|
channel: ChannelWrapper | null;
|
|
61
|
-
publishChannelSetupPromise: Promise<ChannelWrapper> | null;
|
|
62
61
|
blockReconnect: boolean | null | undefined;
|
|
63
62
|
connection: AmqpConnectionManager | null | undefined;
|
|
64
63
|
em: EventEmitter;
|
|
@@ -92,7 +91,7 @@ declare class RabbitMq implements IAfRabbitMq {
|
|
|
92
91
|
private consumeFromRabbit;
|
|
93
92
|
consumeFromExchange(queue: string, exchange: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any>;
|
|
94
93
|
publish(exchange: string, content: any, customHeaders?: any): Promise<boolean>;
|
|
95
|
-
sendToQueue(queue: string, content: any, options?: any, customHeaders?: any): Promise<boolean | undefined>;
|
|
94
|
+
sendToQueue(queue: string, content: any, options?: any, customHeaders?: any, isBlocking?: boolean): Promise<boolean | undefined>;
|
|
96
95
|
isConnected(): Promise<boolean>;
|
|
97
96
|
gracefulShutdown(signal: string): Promise<void>;
|
|
98
97
|
}
|
package/dist/index.js
CHANGED
|
@@ -117,7 +117,6 @@ class RabbitMq {
|
|
|
117
117
|
};
|
|
118
118
|
this.em = new events_1.EventEmitter();
|
|
119
119
|
this.channel = null;
|
|
120
|
-
this.publishChannelSetupPromise = null;
|
|
121
120
|
this.connection = null;
|
|
122
121
|
this.creatingConnection = false;
|
|
123
122
|
this.exchanges = {};
|
|
@@ -242,25 +241,22 @@ class RabbitMq {
|
|
|
242
241
|
}
|
|
243
242
|
}
|
|
244
243
|
async assertChannel({ force = false } = {}) {
|
|
245
|
-
|
|
246
|
-
this.
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
return this.publishChannelSetupPromise;
|
|
244
|
+
return new Promise(async (resolve, reject) => {
|
|
245
|
+
if (this.channel && !force) {
|
|
246
|
+
return resolve(this.channel);
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
const channel = await this.getNewChannel({});
|
|
250
|
+
channel.on('error', (err) => {
|
|
251
|
+
logger_1.default.error('rabbit: channel error', { err });
|
|
252
|
+
});
|
|
253
|
+
this.channel = channel;
|
|
254
|
+
resolve(channel);
|
|
255
|
+
}
|
|
256
|
+
catch (e) {
|
|
257
|
+
reject(e);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
264
260
|
}
|
|
265
261
|
async assertExchange(exchangeName, options) {
|
|
266
262
|
const channel = await this.assertChannel();
|
|
@@ -472,31 +468,25 @@ class RabbitMq {
|
|
|
472
468
|
await channel.publish(exchange, '', Buffer.from(JSON.stringify(content)), RabbitMq.getPublishOptions(customHeaders));
|
|
473
469
|
});
|
|
474
470
|
}
|
|
475
|
-
async sendToQueue(queue, content, options, customHeaders) {
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
const res = await this.channel?.sendToQueue(queue, Buffer.from(JSON.stringify(content)), RabbitMq.getPublishOptions(customHeaders));
|
|
493
|
-
debug(`rabbit: sending to queue ${queue}`, { res });
|
|
494
|
-
return res;
|
|
495
|
-
}
|
|
496
|
-
catch (e) {
|
|
497
|
-
logger_1.default.error(`rabbit sendToQueue: failed to send to queue ${queue}`, { e });
|
|
498
|
-
throw e;
|
|
471
|
+
async sendToQueue(queue, content, options, customHeaders, isBlocking) {
|
|
472
|
+
const callback = async () => {
|
|
473
|
+
try {
|
|
474
|
+
RabbitMq.validateName('queue', queue);
|
|
475
|
+
await this.assertChannel();
|
|
476
|
+
await this.assertQueue(queue, options);
|
|
477
|
+
const res = await this.channel?.sendToQueue(queue, Buffer.from(JSON.stringify(content)), RabbitMq.getPublishOptions(customHeaders));
|
|
478
|
+
debug(`rabbit: sending to queue ${queue}`, { res });
|
|
479
|
+
return res;
|
|
480
|
+
}
|
|
481
|
+
catch (e) {
|
|
482
|
+
logger_1.default.error(`rabbit: failed to send to queue ${queue}`, { e });
|
|
483
|
+
throw e;
|
|
484
|
+
}
|
|
485
|
+
};
|
|
486
|
+
if (isBlocking) {
|
|
487
|
+
return callback();
|
|
499
488
|
}
|
|
489
|
+
return (0, utils_1.wrapSetImmediate)(callback);
|
|
500
490
|
}
|
|
501
491
|
async isConnected() {
|
|
502
492
|
const connection = await this.getConnection();
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -36,13 +36,13 @@ import {
|
|
|
36
36
|
QueuesCache,
|
|
37
37
|
RedisLockType,
|
|
38
38
|
ExchangesCache, CONSUMER_DEFAULT_OPTIONS, QueueSetupPromisesDictionary,
|
|
39
|
+
ConnectionRole,
|
|
39
40
|
} from './lib/types';
|
|
40
41
|
|
|
41
42
|
// const debug = nodeDebug('af-rabbitmq')
|
|
42
43
|
const debug = logger.debug.bind(logger);
|
|
43
44
|
|
|
44
45
|
const PUBLISH_TIMEOUT = 1000 * 10;
|
|
45
|
-
|
|
46
46
|
export interface IAfRabbitMq {
|
|
47
47
|
ack: any;
|
|
48
48
|
nack: any;
|
|
@@ -82,11 +82,13 @@ type newChannelOpts = {
|
|
|
82
82
|
name?: string;
|
|
83
83
|
onClose?: null | ((args: any | null) => void);
|
|
84
84
|
options?: CreateChannelOpts | undefined;
|
|
85
|
+
connectionRole: ConnectionRole,
|
|
85
86
|
};
|
|
86
87
|
|
|
87
88
|
type assertChannelOpts = {
|
|
88
89
|
channelName?: string;
|
|
89
90
|
force?: boolean;
|
|
91
|
+
connectionRole: ConnectionRole;
|
|
90
92
|
}
|
|
91
93
|
|
|
92
94
|
type AfConsumer = {
|
|
@@ -145,11 +147,15 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
145
147
|
|
|
146
148
|
blockReconnect: boolean | null | undefined
|
|
147
149
|
|
|
148
|
-
|
|
150
|
+
consumeConnection: AmqpConnectionManager | null | undefined;
|
|
151
|
+
|
|
152
|
+
publishConnection: AmqpConnectionManager | null | undefined;
|
|
149
153
|
|
|
150
154
|
em: EventEmitter;
|
|
151
155
|
|
|
152
|
-
|
|
156
|
+
creatingConsumeConnection: boolean;
|
|
157
|
+
|
|
158
|
+
creatingPublishConnection: boolean;
|
|
153
159
|
|
|
154
160
|
exchanges: ExchangesCache;
|
|
155
161
|
|
|
@@ -172,8 +178,10 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
172
178
|
this.em = new EventEmitter();
|
|
173
179
|
this.channel = null;
|
|
174
180
|
this.publishChannelSetupPromise = null;
|
|
175
|
-
this.
|
|
176
|
-
this.
|
|
181
|
+
this.consumeConnection = null;
|
|
182
|
+
this.publishConnection = null;
|
|
183
|
+
this.creatingPublishConnection = false;
|
|
184
|
+
this.creatingConsumeConnection = false;
|
|
177
185
|
this.exchanges = {};
|
|
178
186
|
this.queues = {};
|
|
179
187
|
this.queueSetupPromises = {};
|
|
@@ -270,16 +278,21 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
270
278
|
}
|
|
271
279
|
}
|
|
272
280
|
|
|
273
|
-
|
|
281
|
+
geConnectionByRole = (connectionRole: ConnectionRole) => (connectionRole === ConnectionRole.Consumer
|
|
282
|
+
? { connectionByRole: this.consumeConnection, creatingConnectionByRole: this.creatingConsumeConnection }
|
|
283
|
+
: { connectionByRole: this.publishConnection, creatingConnectionByRole: this.creatingPublishConnection });
|
|
284
|
+
|
|
285
|
+
async getConnection(connectionRole: ConnectionRole) {
|
|
274
286
|
return new Promise<AmqpConnectionManager>(async (resolve, reject) => {
|
|
287
|
+
let { connectionByRole, creatingConnectionByRole } = this.geConnectionByRole(connectionRole);
|
|
275
288
|
if (this.blockReconnect) {
|
|
276
289
|
debug('rabbit: block reconnect');
|
|
277
290
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
278
291
|
// @ts-ignore
|
|
279
292
|
return resolve();
|
|
280
293
|
}
|
|
281
|
-
if (
|
|
282
|
-
if (this.options?.disableReconnect ||
|
|
294
|
+
if (connectionByRole !== null) {
|
|
295
|
+
if (this.options?.disableReconnect || connectionByRole?.isConnected()) {
|
|
283
296
|
debug('rabbit: connection - is connected');
|
|
284
297
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
285
298
|
// @ts-ignore
|
|
@@ -287,13 +300,13 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
287
300
|
}
|
|
288
301
|
debug('rabbit: connection - reconnecting');
|
|
289
302
|
}
|
|
290
|
-
if (
|
|
303
|
+
if (creatingConnectionByRole) {
|
|
291
304
|
debug('rabbit: creating connection emi');
|
|
292
305
|
this.em.once(CONNECTION_CREATED_CONST, resolve);
|
|
293
306
|
this.em.once(CONNECTION_FAILED_CONST, reject);
|
|
294
307
|
return;
|
|
295
308
|
}
|
|
296
|
-
|
|
309
|
+
creatingConnectionByRole = true;
|
|
297
310
|
let isResolved = false;
|
|
298
311
|
|
|
299
312
|
// It is import to use it as a function and not as a variable
|
|
@@ -310,12 +323,12 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
310
323
|
};
|
|
311
324
|
|
|
312
325
|
const defaultUrls = findServers();
|
|
313
|
-
const
|
|
326
|
+
const newConnection: AmqpConnectionManager = await connect(defaultUrls, {
|
|
314
327
|
findServers,
|
|
315
328
|
});
|
|
316
329
|
|
|
317
|
-
|
|
318
|
-
|
|
330
|
+
connectionByRole = newConnection;
|
|
331
|
+
connectionByRole.on('error', (err) => {
|
|
319
332
|
logger.error('rabbit: connection error', { err });
|
|
320
333
|
if (!isResolved) {
|
|
321
334
|
isResolved = true;
|
|
@@ -324,7 +337,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
324
337
|
}
|
|
325
338
|
});
|
|
326
339
|
|
|
327
|
-
|
|
340
|
+
connectionByRole.on('connectFailed', (err) => {
|
|
328
341
|
this.consumersTags = [];
|
|
329
342
|
logger.error('rabbit: connection connectFailed', { err });
|
|
330
343
|
if (!isResolved) {
|
|
@@ -334,7 +347,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
334
347
|
}
|
|
335
348
|
});
|
|
336
349
|
|
|
337
|
-
|
|
350
|
+
connectionByRole.on('disconnect', ({ err }) => {
|
|
338
351
|
this.consumersTags = [];
|
|
339
352
|
debug('rabbit: connection closed');
|
|
340
353
|
if (this.options?.disableReconnect) {
|
|
@@ -344,20 +357,22 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
344
357
|
logger.error(`${this.RECONNECT_MSG}${err && ` - ${err}`}`);
|
|
345
358
|
}
|
|
346
359
|
});
|
|
347
|
-
|
|
360
|
+
connectionByRole.once('connect', async () => {
|
|
348
361
|
debug('rabbit: connection established');
|
|
349
|
-
|
|
350
|
-
this.em.emit(CONNECTION_CREATED_CONST,
|
|
362
|
+
creatingConnectionByRole = false;
|
|
363
|
+
this.em.emit(CONNECTION_CREATED_CONST, connectionByRole);
|
|
351
364
|
isResolved = true;
|
|
352
|
-
resolve(
|
|
365
|
+
resolve(connectionByRole);
|
|
353
366
|
});
|
|
354
367
|
});
|
|
355
368
|
}
|
|
356
369
|
|
|
357
|
-
async getNewChannel({
|
|
370
|
+
async getNewChannel({
|
|
371
|
+
name = rand().toString(), onClose = null, options = {}, connectionRole,
|
|
372
|
+
}: newChannelOpts = { connectionRole: ConnectionRole.Consumer }): Promise<ChannelWrapper> {
|
|
358
373
|
let connection!: AmqpConnectionManager;
|
|
359
374
|
try {
|
|
360
|
-
connection = await this.getConnection();
|
|
375
|
+
connection = await this.getConnection(connectionRole);
|
|
361
376
|
} catch (e) {
|
|
362
377
|
logger.error(`rabbit: error on get connection for new channel ${name} `, { e });
|
|
363
378
|
throw e;
|
|
@@ -377,7 +392,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
377
392
|
}
|
|
378
393
|
}
|
|
379
394
|
|
|
380
|
-
async assertChannel({ force = false }
|
|
395
|
+
async assertChannel({ force = false, connectionRole }: assertChannelOpts = { connectionRole: ConnectionRole.Consumer }): Promise<ChannelWrapper> {
|
|
381
396
|
if (!this.publishChannelSetupPromise) {
|
|
382
397
|
this.publishChannelSetupPromise = new Promise<ChannelWrapper>(async (resolve, reject) => {
|
|
383
398
|
if (this.channel && !force) {
|
|
@@ -385,7 +400,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
385
400
|
}
|
|
386
401
|
|
|
387
402
|
try {
|
|
388
|
-
const channel = await this.getNewChannel({});
|
|
403
|
+
const channel = await this.getNewChannel({ connectionRole });
|
|
389
404
|
channel.on('error', (err) => {
|
|
390
405
|
logger.error('rabbit: channel error', { err });
|
|
391
406
|
});
|
|
@@ -400,7 +415,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
400
415
|
}
|
|
401
416
|
|
|
402
417
|
async assertExchange(exchangeName: string, options?: any) {
|
|
403
|
-
const channel: ChannelWrapper = await this.assertChannel();
|
|
418
|
+
const channel: ChannelWrapper = await this.assertChannel({ connectionRole: options.connectionRole });
|
|
404
419
|
if (this.exchanges[exchangeName]) {
|
|
405
420
|
return this.exchanges[exchangeName];
|
|
406
421
|
}
|
|
@@ -409,35 +424,36 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
409
424
|
return exchange;
|
|
410
425
|
}
|
|
411
426
|
|
|
412
|
-
async getQueueLength(queue: string) {
|
|
427
|
+
async getQueueLength(queue: string, connectionRole: ConnectionRole) {
|
|
413
428
|
RabbitMq.validateName('queue', queue);
|
|
429
|
+
const { connectionByRole } = this.geConnectionByRole(connectionRole);
|
|
414
430
|
const { channel } = this;
|
|
415
431
|
if (!channel) {
|
|
416
432
|
throw new Error('channel is not defined');
|
|
417
433
|
}
|
|
418
|
-
debug('rabbit: getting queue length', { queue, connected:
|
|
434
|
+
debug('rabbit: getting queue length', { queue, connected: connectionByRole?.isConnected() });
|
|
419
435
|
return channel?.checkQueue(queue);
|
|
420
436
|
}
|
|
421
437
|
|
|
422
|
-
private async deleteQueue(queue: string) {
|
|
438
|
+
private async deleteQueue(queue: string, connectionRole: ConnectionRole) {
|
|
423
439
|
RabbitMq.validateName('queue', queue);
|
|
424
|
-
const channel: ChannelWrapper = await this.assertChannel();
|
|
440
|
+
const channel: ChannelWrapper = await this.assertChannel({ connectionRole });
|
|
425
441
|
logger.info('rabbit: deleting queue', { queue });
|
|
426
442
|
const deleteQueueRes = await channel.deleteQueue(queue);
|
|
427
443
|
debug('queue deleted', deleteQueueRes);
|
|
428
444
|
return deleteQueueRes;
|
|
429
445
|
}
|
|
430
446
|
|
|
431
|
-
async bindQueue(queue: string, exchange: string) {
|
|
432
|
-
const channel: ChannelWrapper = await this.assertChannel();
|
|
447
|
+
async bindQueue(queue: string, exchange: string, connectionRole: ConnectionRole) {
|
|
448
|
+
const channel: ChannelWrapper = await this.assertChannel({ connectionRole });
|
|
433
449
|
await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.bindQueue(queue, exchange, ''));
|
|
434
450
|
return channel.bindQueue(queue, exchange, '');
|
|
435
451
|
}
|
|
436
452
|
|
|
437
|
-
async setupQueue(queueName: string, options?: Options.AssertQueue): Promise<Replies.AssertQueue> {
|
|
453
|
+
async setupQueue(queueName: string, connectionRole: ConnectionRole, options?: Options.AssertQueue): Promise<Replies.AssertQueue> {
|
|
438
454
|
let queue: Replies.AssertQueue;
|
|
439
455
|
try {
|
|
440
|
-
const channel: ChannelWrapper = await this.assertChannel();
|
|
456
|
+
const channel: ChannelWrapper = await this.assertChannel({ connectionRole });
|
|
441
457
|
debug('assertQueue->channel.addSetup', { queueName });
|
|
442
458
|
await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.assertQueue(queueName, options));
|
|
443
459
|
debug('assertQueue->channel.assertQueue', { queueName });
|
|
@@ -446,8 +462,8 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
446
462
|
logger.error('rabbit: assertQueue error', { queueName, options, error: e });
|
|
447
463
|
if (!this.options?.dontRetryAssert) {
|
|
448
464
|
debug('retrying assertQueue', { queueName });
|
|
449
|
-
const channel = await this.assertChannel({ force: true });
|
|
450
|
-
await this.deleteQueue(queueName);
|
|
465
|
+
const channel = await this.assertChannel({ force: true, connectionRole });
|
|
466
|
+
await this.deleteQueue(queueName, connectionRole);
|
|
451
467
|
|
|
452
468
|
debug('retrying assertQueue->channel.addSetup', { queueName });
|
|
453
469
|
await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.assertQueue(queueName, options));
|
|
@@ -462,7 +478,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
462
478
|
return queue;
|
|
463
479
|
}
|
|
464
480
|
|
|
465
|
-
async assertQueue(queueName: string, options?: Options.AssertQueue) {
|
|
481
|
+
async assertQueue(queueName: string, connectionRole: ConnectionRole, options?: Options.AssertQueue) {
|
|
466
482
|
RabbitMq.validateName('queue', queueName);
|
|
467
483
|
if (this.queues[queueName]) {
|
|
468
484
|
delete this.queueSetupPromises[queueName];
|
|
@@ -473,7 +489,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
473
489
|
return this.queueSetupPromises[queueName];
|
|
474
490
|
}
|
|
475
491
|
|
|
476
|
-
this.queueSetupPromises[queueName] = this.setupQueue(queueName, options);
|
|
492
|
+
this.queueSetupPromises[queueName] = this.setupQueue(queueName, connectionRole, options);
|
|
477
493
|
return this.queueSetupPromises[queueName];
|
|
478
494
|
}
|
|
479
495
|
|
|
@@ -527,7 +543,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
527
543
|
}
|
|
528
544
|
logger.info(`rabbit: Consuming with lock from queue ${queue} with lockTimeout: ${lockTimeout}ms`);
|
|
529
545
|
}
|
|
530
|
-
const channel = await this.getNewChannel({});
|
|
546
|
+
const channel = await this.getNewChannel({ connectionRole: ConnectionRole.Consumer });
|
|
531
547
|
return channel.addSetup(async (confirmChannel: ConfirmChannel) => {
|
|
532
548
|
await confirmChannel.assertQueue(queue, options ? { messageTtl: options.messageTtl } : undefined);
|
|
533
549
|
await confirmChannel.prefetch(limit, true);
|
|
@@ -619,7 +635,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
619
635
|
RabbitMq.validateName('queue', queue);
|
|
620
636
|
const { limit, deadMessageTtl } = optionsWithDefaults;
|
|
621
637
|
await this.saveConsumer(queue, callback, options);
|
|
622
|
-
const channel: ChannelWrapper = await this.getNewChannel({ name: `consume-exchange
|
|
638
|
+
const channel: ChannelWrapper = await this.getNewChannel({ name: `consume - exchange - ${exchange} -queue - ${queue}`, connectionRole: ConnectionRole.Consumer });
|
|
623
639
|
|
|
624
640
|
return channel.addSetup(async (c: ConfirmChannel) => {
|
|
625
641
|
const assertExchange = await assertExchangeFanout(c, exchange);
|
|
@@ -640,8 +656,8 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
640
656
|
async publish(exchange: string, content: any, customHeaders?: any) : Promise<boolean> {
|
|
641
657
|
return wrapSetImmediate(async () => {
|
|
642
658
|
RabbitMq.validateName('exchange', exchange);
|
|
643
|
-
const channel: ChannelWrapper = await this.assertChannel();
|
|
644
|
-
await this.assertExchange(exchange);
|
|
659
|
+
const channel: ChannelWrapper = await this.assertChannel({ connectionRole: ConnectionRole.Publisher });
|
|
660
|
+
await this.assertExchange(exchange, { connectionRole: ConnectionRole.Publisher });
|
|
645
661
|
await channel.publish(exchange, '',
|
|
646
662
|
Buffer.from(JSON.stringify(content)),
|
|
647
663
|
RabbitMq.getPublishOptions(customHeaders));
|
|
@@ -655,7 +671,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
655
671
|
customHeaders?: any,
|
|
656
672
|
): Promise<boolean | undefined> {
|
|
657
673
|
try {
|
|
658
|
-
await this.assertChannel();
|
|
674
|
+
await this.assertChannel({ connectionRole: ConnectionRole.Publisher });
|
|
659
675
|
} catch (e) {
|
|
660
676
|
logger.error(`rabbit sendToQueue: failed to send assert channel when sending to queue ${queue}`, { e });
|
|
661
677
|
throw e;
|
|
@@ -663,7 +679,7 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
663
679
|
|
|
664
680
|
try {
|
|
665
681
|
RabbitMq.validateName('queue', queue);
|
|
666
|
-
await this.assertQueue(queue, options);
|
|
682
|
+
await this.assertQueue(queue, ConnectionRole.Publisher, options);
|
|
667
683
|
} catch (e) {
|
|
668
684
|
logger.error(`rabbit sendToQueue: failed to assert queue ${queue}`, { e });
|
|
669
685
|
throw e;
|
|
@@ -676,13 +692,14 @@ class RabbitMq implements IAfRabbitMq {
|
|
|
676
692
|
debug(`rabbit: sending to queue ${queue}`, { res });
|
|
677
693
|
return res;
|
|
678
694
|
} catch (e) {
|
|
679
|
-
|
|
695
|
+
const isConnected = await this.isConnected(ConnectionRole.Publisher);
|
|
696
|
+
logger.error(`rabbit sendToQueue: failed to send to queue ${queue}, isConnected: ${isConnected}`, { e });
|
|
680
697
|
throw e;
|
|
681
698
|
}
|
|
682
699
|
}
|
|
683
700
|
|
|
684
|
-
async isConnected()
|
|
685
|
-
const connection = await this.getConnection();
|
|
701
|
+
async isConnected(connectionRole: ConnectionRole): Promise<boolean> {
|
|
702
|
+
const connection = await this.getConnection(connectionRole);
|
|
686
703
|
const isConnected = connection.isConnected();
|
|
687
704
|
if (!isConnected) {
|
|
688
705
|
logger.error('rabbit: isConnected - false');
|
package/src/lib/types.ts
CHANGED
package/coverage/clover.xml
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<coverage generated="1675584950929" clover="3.2.0">
|
|
3
|
-
<project timestamp="1675584950929" name="All files">
|
|
4
|
-
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0" elements="0" coveredelements="0" complexity="0" loc="0" ncloc="0" packages="0" files="0" classes="0">
|
|
5
|
-
</metrics>
|
|
6
|
-
</project>
|
|
7
|
-
</coverage>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
body, html {
|
|
2
|
-
margin:0; padding: 0;
|
|
3
|
-
height: 100%;
|
|
4
|
-
}
|
|
5
|
-
body {
|
|
6
|
-
font-family: Helvetica Neue, Helvetica, Arial;
|
|
7
|
-
font-size: 14px;
|
|
8
|
-
color:#333;
|
|
9
|
-
}
|
|
10
|
-
.small { font-size: 12px; }
|
|
11
|
-
*, *:after, *:before {
|
|
12
|
-
-webkit-box-sizing:border-box;
|
|
13
|
-
-moz-box-sizing:border-box;
|
|
14
|
-
box-sizing:border-box;
|
|
15
|
-
}
|
|
16
|
-
h1 { font-size: 20px; margin: 0;}
|
|
17
|
-
h2 { font-size: 14px; }
|
|
18
|
-
pre {
|
|
19
|
-
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
20
|
-
margin: 0;
|
|
21
|
-
padding: 0;
|
|
22
|
-
-moz-tab-size: 2;
|
|
23
|
-
-o-tab-size: 2;
|
|
24
|
-
tab-size: 2;
|
|
25
|
-
}
|
|
26
|
-
a { color:#0074D9; text-decoration:none; }
|
|
27
|
-
a:hover { text-decoration:underline; }
|
|
28
|
-
.strong { font-weight: bold; }
|
|
29
|
-
.space-top1 { padding: 10px 0 0 0; }
|
|
30
|
-
.pad2y { padding: 20px 0; }
|
|
31
|
-
.pad1y { padding: 10px 0; }
|
|
32
|
-
.pad2x { padding: 0 20px; }
|
|
33
|
-
.pad2 { padding: 20px; }
|
|
34
|
-
.pad1 { padding: 10px; }
|
|
35
|
-
.space-left2 { padding-left:55px; }
|
|
36
|
-
.space-right2 { padding-right:20px; }
|
|
37
|
-
.center { text-align:center; }
|
|
38
|
-
.clearfix { display:block; }
|
|
39
|
-
.clearfix:after {
|
|
40
|
-
content:'';
|
|
41
|
-
display:block;
|
|
42
|
-
height:0;
|
|
43
|
-
clear:both;
|
|
44
|
-
visibility:hidden;
|
|
45
|
-
}
|
|
46
|
-
.fl { float: left; }
|
|
47
|
-
@media only screen and (max-width:640px) {
|
|
48
|
-
.col3 { width:100%; max-width:100%; }
|
|
49
|
-
.hide-mobile { display:none!important; }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.quiet {
|
|
53
|
-
color: #7f7f7f;
|
|
54
|
-
color: rgba(0,0,0,0.5);
|
|
55
|
-
}
|
|
56
|
-
.quiet a { opacity: 0.7; }
|
|
57
|
-
|
|
58
|
-
.fraction {
|
|
59
|
-
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
|
60
|
-
font-size: 10px;
|
|
61
|
-
color: #555;
|
|
62
|
-
background: #E8E8E8;
|
|
63
|
-
padding: 4px 5px;
|
|
64
|
-
border-radius: 3px;
|
|
65
|
-
vertical-align: middle;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
div.path a:link, div.path a:visited { color: #333; }
|
|
69
|
-
table.coverage {
|
|
70
|
-
border-collapse: collapse;
|
|
71
|
-
margin: 10px 0 0 0;
|
|
72
|
-
padding: 0;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
table.coverage td {
|
|
76
|
-
margin: 0;
|
|
77
|
-
padding: 0;
|
|
78
|
-
vertical-align: top;
|
|
79
|
-
}
|
|
80
|
-
table.coverage td.line-count {
|
|
81
|
-
text-align: right;
|
|
82
|
-
padding: 0 5px 0 20px;
|
|
83
|
-
}
|
|
84
|
-
table.coverage td.line-coverage {
|
|
85
|
-
text-align: right;
|
|
86
|
-
padding-right: 10px;
|
|
87
|
-
min-width:20px;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
table.coverage td span.cline-any {
|
|
91
|
-
display: inline-block;
|
|
92
|
-
padding: 0 5px;
|
|
93
|
-
width: 100%;
|
|
94
|
-
}
|
|
95
|
-
.missing-if-branch {
|
|
96
|
-
display: inline-block;
|
|
97
|
-
margin-right: 5px;
|
|
98
|
-
border-radius: 3px;
|
|
99
|
-
position: relative;
|
|
100
|
-
padding: 0 4px;
|
|
101
|
-
background: #333;
|
|
102
|
-
color: yellow;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.skip-if-branch {
|
|
106
|
-
display: none;
|
|
107
|
-
margin-right: 10px;
|
|
108
|
-
position: relative;
|
|
109
|
-
padding: 0 4px;
|
|
110
|
-
background: #ccc;
|
|
111
|
-
color: white;
|
|
112
|
-
}
|
|
113
|
-
.missing-if-branch .typ, .skip-if-branch .typ {
|
|
114
|
-
color: inherit !important;
|
|
115
|
-
}
|
|
116
|
-
.coverage-summary {
|
|
117
|
-
border-collapse: collapse;
|
|
118
|
-
width: 100%;
|
|
119
|
-
}
|
|
120
|
-
.coverage-summary tr { border-bottom: 1px solid #bbb; }
|
|
121
|
-
.keyline-all { border: 1px solid #ddd; }
|
|
122
|
-
.coverage-summary td, .coverage-summary th { padding: 10px; }
|
|
123
|
-
.coverage-summary tbody { border: 1px solid #bbb; }
|
|
124
|
-
.coverage-summary td { border-right: 1px solid #bbb; }
|
|
125
|
-
.coverage-summary td:last-child { border-right: none; }
|
|
126
|
-
.coverage-summary th {
|
|
127
|
-
text-align: left;
|
|
128
|
-
font-weight: normal;
|
|
129
|
-
white-space: nowrap;
|
|
130
|
-
}
|
|
131
|
-
.coverage-summary th.file { border-right: none !important; }
|
|
132
|
-
.coverage-summary th.pct { }
|
|
133
|
-
.coverage-summary th.pic,
|
|
134
|
-
.coverage-summary th.abs,
|
|
135
|
-
.coverage-summary td.pct,
|
|
136
|
-
.coverage-summary td.abs { text-align: right; }
|
|
137
|
-
.coverage-summary td.file { white-space: nowrap; }
|
|
138
|
-
.coverage-summary td.pic { min-width: 120px !important; }
|
|
139
|
-
.coverage-summary tfoot td { }
|
|
140
|
-
|
|
141
|
-
.coverage-summary .sorter {
|
|
142
|
-
height: 10px;
|
|
143
|
-
width: 7px;
|
|
144
|
-
display: inline-block;
|
|
145
|
-
margin-left: 0.5em;
|
|
146
|
-
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
|
|
147
|
-
}
|
|
148
|
-
.coverage-summary .sorted .sorter {
|
|
149
|
-
background-position: 0 -20px;
|
|
150
|
-
}
|
|
151
|
-
.coverage-summary .sorted-desc .sorter {
|
|
152
|
-
background-position: 0 -10px;
|
|
153
|
-
}
|
|
154
|
-
.status-line { height: 10px; }
|
|
155
|
-
/* dark red */
|
|
156
|
-
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
|
|
157
|
-
.low .chart { border:1px solid #C21F39 }
|
|
158
|
-
/* medium red */
|
|
159
|
-
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
|
|
160
|
-
/* light red */
|
|
161
|
-
.low, .cline-no { background:#FCE1E5 }
|
|
162
|
-
/* light green */
|
|
163
|
-
.high, .cline-yes { background:rgb(230,245,208) }
|
|
164
|
-
/* medium green */
|
|
165
|
-
.cstat-yes { background:rgb(161,215,106) }
|
|
166
|
-
/* dark green */
|
|
167
|
-
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
|
|
168
|
-
.high .chart { border:1px solid rgb(77,146,33) }
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
.medium .chart { border:1px solid #666; }
|
|
172
|
-
.medium .cover-fill { background: #666; }
|
|
173
|
-
|
|
174
|
-
.cbranch-no { background: yellow !important; color: #111; }
|
|
175
|
-
|
|
176
|
-
.cstat-skip { background: #ddd; color: #111; }
|
|
177
|
-
.fstat-skip { background: #ddd; color: #111 !important; }
|
|
178
|
-
.cbranch-skip { background: #ddd !important; color: #111; }
|
|
179
|
-
|
|
180
|
-
span.cline-neutral { background: #eaeaea; }
|
|
181
|
-
.medium { background: #eaeaea; }
|
|
182
|
-
|
|
183
|
-
.cover-fill, .cover-empty {
|
|
184
|
-
display:inline-block;
|
|
185
|
-
height: 12px;
|
|
186
|
-
}
|
|
187
|
-
.chart {
|
|
188
|
-
line-height: 0;
|
|
189
|
-
}
|
|
190
|
-
.cover-empty {
|
|
191
|
-
background: white;
|
|
192
|
-
}
|
|
193
|
-
.cover-full {
|
|
194
|
-
border-right: none !important;
|
|
195
|
-
}
|
|
196
|
-
pre.prettyprint {
|
|
197
|
-
border: none !important;
|
|
198
|
-
padding: 0 !important;
|
|
199
|
-
margin: 0 !important;
|
|
200
|
-
}
|
|
201
|
-
.com { color: #999 !important; }
|
|
202
|
-
.ignore-none { color: #999; font-weight: normal; }
|
|
203
|
-
|
|
204
|
-
.wrapper {
|
|
205
|
-
min-height: 100%;
|
|
206
|
-
height: auto !important;
|
|
207
|
-
height: 100%;
|
|
208
|
-
margin: 0 auto -48px;
|
|
209
|
-
}
|
|
210
|
-
.footer, .push {
|
|
211
|
-
height: 48px;
|
|
212
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<title>Code coverage report for All files</title>
|
|
5
|
-
<meta charset="utf-8" />
|
|
6
|
-
<link rel="stylesheet" href="prettify.css" />
|
|
7
|
-
<link rel="stylesheet" href="base.css" />
|
|
8
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
9
|
-
<style type='text/css'>
|
|
10
|
-
.coverage-summary .sorter {
|
|
11
|
-
background-image: url(sort-arrow-sprite.png);
|
|
12
|
-
}
|
|
13
|
-
</style>
|
|
14
|
-
</head>
|
|
15
|
-
<body>
|
|
16
|
-
<div class='wrapper'>
|
|
17
|
-
<div class='pad1'>
|
|
18
|
-
<h1>
|
|
19
|
-
All files
|
|
20
|
-
</h1>
|
|
21
|
-
<div class='clearfix'>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
<div class='status-line medium'></div>
|
|
25
|
-
<div class="pad1">
|
|
26
|
-
<table class="coverage-summary">
|
|
27
|
-
<thead>
|
|
28
|
-
<tr>
|
|
29
|
-
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
|
|
30
|
-
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
|
|
31
|
-
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
|
|
32
|
-
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
33
|
-
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
|
|
34
|
-
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
35
|
-
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
|
|
36
|
-
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
37
|
-
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
|
|
38
|
-
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
39
|
-
</tr>
|
|
40
|
-
</thead>
|
|
41
|
-
<tbody></tbody>
|
|
42
|
-
</table>
|
|
43
|
-
</div><div class='push'></div><!-- for sticky footer -->
|
|
44
|
-
</div><!-- /wrapper -->
|
|
45
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
46
|
-
Code coverage
|
|
47
|
-
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Feb 05 2023 10:15:50 GMT+0200 (Israel Standard Time)
|
|
48
|
-
</div>
|
|
49
|
-
</div>
|
|
50
|
-
<script src="prettify.js"></script>
|
|
51
|
-
<script>
|
|
52
|
-
window.onload = function () {
|
|
53
|
-
if (typeof prettyPrint === 'function') {
|
|
54
|
-
prettyPrint();
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
</script>
|
|
58
|
-
<script src="sorter.js"></script>
|
|
59
|
-
</body>
|
|
60
|
-
</html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
|
|
Binary file
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
var addSorting = (function () {
|
|
2
|
-
"use strict";
|
|
3
|
-
var cols,
|
|
4
|
-
currentSort = {
|
|
5
|
-
index: 0,
|
|
6
|
-
desc: false
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
// returns the summary table element
|
|
10
|
-
function getTable() { return document.querySelector('.coverage-summary'); }
|
|
11
|
-
// returns the thead element of the summary table
|
|
12
|
-
function getTableHeader() { return getTable().querySelector('thead tr'); }
|
|
13
|
-
// returns the tbody element of the summary table
|
|
14
|
-
function getTableBody() { return getTable().querySelector('tbody'); }
|
|
15
|
-
// returns the th element for nth column
|
|
16
|
-
function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
|
|
17
|
-
|
|
18
|
-
// loads all columns
|
|
19
|
-
function loadColumns() {
|
|
20
|
-
var colNodes = getTableHeader().querySelectorAll('th'),
|
|
21
|
-
colNode,
|
|
22
|
-
cols = [],
|
|
23
|
-
col,
|
|
24
|
-
i;
|
|
25
|
-
|
|
26
|
-
for (i = 0; i < colNodes.length; i += 1) {
|
|
27
|
-
colNode = colNodes[i];
|
|
28
|
-
col = {
|
|
29
|
-
key: colNode.getAttribute('data-col'),
|
|
30
|
-
sortable: !colNode.getAttribute('data-nosort'),
|
|
31
|
-
type: colNode.getAttribute('data-type') || 'string'
|
|
32
|
-
};
|
|
33
|
-
cols.push(col);
|
|
34
|
-
if (col.sortable) {
|
|
35
|
-
col.defaultDescSort = col.type === 'number';
|
|
36
|
-
colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return cols;
|
|
40
|
-
}
|
|
41
|
-
// attaches a data attribute to every tr element with an object
|
|
42
|
-
// of data values keyed by column name
|
|
43
|
-
function loadRowData(tableRow) {
|
|
44
|
-
var tableCols = tableRow.querySelectorAll('td'),
|
|
45
|
-
colNode,
|
|
46
|
-
col,
|
|
47
|
-
data = {},
|
|
48
|
-
i,
|
|
49
|
-
val;
|
|
50
|
-
for (i = 0; i < tableCols.length; i += 1) {
|
|
51
|
-
colNode = tableCols[i];
|
|
52
|
-
col = cols[i];
|
|
53
|
-
val = colNode.getAttribute('data-value');
|
|
54
|
-
if (col.type === 'number') {
|
|
55
|
-
val = Number(val);
|
|
56
|
-
}
|
|
57
|
-
data[col.key] = val;
|
|
58
|
-
}
|
|
59
|
-
return data;
|
|
60
|
-
}
|
|
61
|
-
// loads all row data
|
|
62
|
-
function loadData() {
|
|
63
|
-
var rows = getTableBody().querySelectorAll('tr'),
|
|
64
|
-
i;
|
|
65
|
-
|
|
66
|
-
for (i = 0; i < rows.length; i += 1) {
|
|
67
|
-
rows[i].data = loadRowData(rows[i]);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// sorts the table using the data for the ith column
|
|
71
|
-
function sortByIndex(index, desc) {
|
|
72
|
-
var key = cols[index].key,
|
|
73
|
-
sorter = function (a, b) {
|
|
74
|
-
a = a.data[key];
|
|
75
|
-
b = b.data[key];
|
|
76
|
-
return a < b ? -1 : a > b ? 1 : 0;
|
|
77
|
-
},
|
|
78
|
-
finalSorter = sorter,
|
|
79
|
-
tableBody = document.querySelector('.coverage-summary tbody'),
|
|
80
|
-
rowNodes = tableBody.querySelectorAll('tr'),
|
|
81
|
-
rows = [],
|
|
82
|
-
i;
|
|
83
|
-
|
|
84
|
-
if (desc) {
|
|
85
|
-
finalSorter = function (a, b) {
|
|
86
|
-
return -1 * sorter(a, b);
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
for (i = 0; i < rowNodes.length; i += 1) {
|
|
91
|
-
rows.push(rowNodes[i]);
|
|
92
|
-
tableBody.removeChild(rowNodes[i]);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
rows.sort(finalSorter);
|
|
96
|
-
|
|
97
|
-
for (i = 0; i < rows.length; i += 1) {
|
|
98
|
-
tableBody.appendChild(rows[i]);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// removes sort indicators for current column being sorted
|
|
102
|
-
function removeSortIndicators() {
|
|
103
|
-
var col = getNthColumn(currentSort.index),
|
|
104
|
-
cls = col.className;
|
|
105
|
-
|
|
106
|
-
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
|
|
107
|
-
col.className = cls;
|
|
108
|
-
}
|
|
109
|
-
// adds sort indicators for current column being sorted
|
|
110
|
-
function addSortIndicators() {
|
|
111
|
-
getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
|
|
112
|
-
}
|
|
113
|
-
// adds event listeners for all sorter widgets
|
|
114
|
-
function enableUI() {
|
|
115
|
-
var i,
|
|
116
|
-
el,
|
|
117
|
-
ithSorter = function ithSorter(i) {
|
|
118
|
-
var col = cols[i];
|
|
119
|
-
|
|
120
|
-
return function () {
|
|
121
|
-
var desc = col.defaultDescSort;
|
|
122
|
-
|
|
123
|
-
if (currentSort.index === i) {
|
|
124
|
-
desc = !currentSort.desc;
|
|
125
|
-
}
|
|
126
|
-
sortByIndex(i, desc);
|
|
127
|
-
removeSortIndicators();
|
|
128
|
-
currentSort.index = i;
|
|
129
|
-
currentSort.desc = desc;
|
|
130
|
-
addSortIndicators();
|
|
131
|
-
};
|
|
132
|
-
};
|
|
133
|
-
for (i =0 ; i < cols.length; i += 1) {
|
|
134
|
-
if (cols[i].sortable) {
|
|
135
|
-
// add the click event handler on the th so users
|
|
136
|
-
// dont have to click on those tiny arrows
|
|
137
|
-
el = getNthColumn(i).querySelector('.sorter').parentElement;
|
|
138
|
-
if (el.addEventListener) {
|
|
139
|
-
el.addEventListener('click', ithSorter(i));
|
|
140
|
-
} else {
|
|
141
|
-
el.attachEvent('onclick', ithSorter(i));
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
// adds sorting functionality to the UI
|
|
147
|
-
return function () {
|
|
148
|
-
if (!getTable()) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
cols = loadColumns();
|
|
152
|
-
loadData(cols);
|
|
153
|
-
addSortIndicators();
|
|
154
|
-
enableUI();
|
|
155
|
-
};
|
|
156
|
-
})();
|
|
157
|
-
|
|
158
|
-
window.addEventListener('load', addSorting);
|
package/coverage/lcov.info
DELETED
|
File without changes
|