Skip to content

Commit 2ce8bcf

Browse files
authored
* Fix timeout is not a function bug (#71)
1 parent faa0cbd commit 2ce8bcf

File tree

6 files changed

+161
-3
lines changed

6 files changed

+161
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.1.3 (June 5, 2020)
2+
3+
* Fix `timeout is not a function` bug
4+
15
## 2.1.2 (May 22, 2020)
26

37
* Update sailor version to 2.6.7

lib/actions/write.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ async function ProcessAction(msg, cfg) {
8888
rowCount = 0;
8989
self.logger.trace('Emitting message %j', messageToEmit);
9090
await self.emit('data', messageToEmit);
91+
await init(cfg);
9192
}, TIMEOUT_BETWEEN_EVENTS);
9293

9394
let row = msg.body.writer;

lib/actions/writeFromJson.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ async function init(cfg) {
6161
util.addRetryCountInterceptorToAxios(ax);
6262
readyFlag = true;
6363
}
64-
async function ProcessAction(msg) {
64+
65+
async function ProcessAction(msg, cfg) {
6566
// eslint-disable-next-line consistent-this
6667
const self = this;
6768
const { inputObject } = msg.body;
@@ -83,6 +84,7 @@ async function ProcessAction(msg) {
8384
}
8485

8586
if (timeout) {
87+
this.logger.info('Clearing timeout...');
8688
clearTimeout(timeout);
8789
}
8890

@@ -114,6 +116,7 @@ async function ProcessAction(msg) {
114116
rowCount = 0;
115117
self.logger.trace('Emitting message %j', messageToEmit);
116118
await self.emit('data', messageToEmit);
119+
await init(cfg);
117120
}, TIMEOUT_BETWEEN_EVENTS);
118121

119122
let row = inputObject;

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "csv-component",
3-
"version": "2.1.2",
3+
"version": "2.1.3",
44
"description": "CSV Component for elastic.io platform",
55
"main": "index.js",
66
"scripts": {

spec/writeTimeoutError.js

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/* eslint-disable no-unused-vars */
2+
const chai = require('chai');
3+
const chaiAsPromised = require('chai-as-promised');
4+
const fs = require('fs');
5+
const nock = require('nock');
6+
const sinon = require('sinon');
7+
const logger = require('@elastic.io/component-logger')();
8+
9+
chai.use(chaiAsPromised);
10+
const { expect } = require('chai');
11+
12+
if (fs.existsSync('.env')) {
13+
// eslint-disable-next-line global-require
14+
require('dotenv').config();
15+
} else {
16+
process.env.ELASTICIO_API_USERNAME = 'name';
17+
process.env.ELASTICIO_API_KEY = 'key';
18+
}
19+
20+
const write = require('../lib/actions/write.js');
21+
const writeFromJson = require('../lib/actions/writeFromJson.js');
22+
23+
// eslint-disable-next-line func-names
24+
describe('CSV Write Timeout', function () {
25+
this.timeout(180000);
26+
27+
let emit;
28+
let cfg;
29+
30+
before(async () => {
31+
nock('https://api.elastic.io', { encodedQueryParams: true })
32+
.post('/v2/resources/storage/signed-url')
33+
.reply(200,
34+
{ put_url: 'https://examlple.mock/putUrl', get_url: 'https://examlple.mock/getUrl' })
35+
.persist();
36+
37+
nock('https://examlple.mock')
38+
.put('/putUrl')
39+
.reply(200, {})
40+
.persist();
41+
});
42+
43+
beforeEach(() => {
44+
emit = sinon.spy();
45+
});
46+
47+
describe('raw', () => {
48+
before(() => {
49+
cfg = {
50+
writer: {
51+
columns: [
52+
{ property: 'header1' },
53+
{ property: 'header2' },
54+
],
55+
},
56+
};
57+
});
58+
59+
it('should write', async () => {
60+
await write.init.call({
61+
logger,
62+
}, cfg);
63+
64+
const msg1 = {
65+
body: {
66+
inputObject: {
67+
ProductKey: 'text11',
68+
CategoryGroup_1: 'text12',
69+
},
70+
},
71+
};
72+
73+
for (let i = 0; i < 3; i += 1) {
74+
// eslint-disable-next-line no-await-in-loop
75+
await write.process.call({
76+
emit,
77+
logger,
78+
}, msg1, cfg);
79+
// eslint-disable-next-line no-await-in-loop
80+
await new Promise(resolve => setTimeout(resolve, 1000));
81+
}
82+
await new Promise(resolve => setTimeout(resolve, 12000));
83+
expect(emit.getCalls().length).to.equal(4);
84+
expect(emit.getCalls().filter(call => call.args[0] === 'data').length).to.equal(1);
85+
for (let i = 0; i < 3; i += 1) {
86+
// eslint-disable-next-line no-await-in-loop
87+
await write.process.call({
88+
emit,
89+
logger,
90+
}, msg1, cfg);
91+
// eslint-disable-next-line no-await-in-loop
92+
await new Promise(resolve => setTimeout(resolve, 1000));
93+
}
94+
95+
await new Promise(resolve => setTimeout(resolve, 12000));
96+
expect(emit.getCalls().length).to.equal(8);
97+
expect(emit.getCalls().filter(call => call.args[0] === 'data').length).to.equal(2);
98+
});
99+
});
100+
101+
describe('From Object', () => {
102+
before(() => {
103+
cfg = {
104+
includeHeaders: 'Yes',
105+
separator: 'semicolon',
106+
};
107+
});
108+
109+
it('should write from object', async () => {
110+
await writeFromJson.init.call({
111+
logger,
112+
}, cfg);
113+
114+
const msg1 = {
115+
body: {
116+
inputObject: {
117+
ProductKey: 'text11',
118+
CategoryGroup_1: 'text12',
119+
},
120+
},
121+
};
122+
123+
for (let i = 0; i < 3; i += 1) {
124+
// eslint-disable-next-line no-await-in-loop
125+
await writeFromJson.process.call({
126+
emit,
127+
logger,
128+
}, msg1, cfg);
129+
// eslint-disable-next-line no-await-in-loop
130+
await new Promise(resolve => setTimeout(resolve, 1000));
131+
}
132+
await new Promise(resolve => setTimeout(resolve, 12000));
133+
expect(emit.getCalls().length).to.equal(4);
134+
expect(emit.getCalls().filter(call => call.args[0] === 'data').length).to.equal(1);
135+
for (let i = 0; i < 3; i += 1) {
136+
// eslint-disable-next-line no-await-in-loop
137+
await writeFromJson.process.call({
138+
emit,
139+
logger,
140+
}, msg1, cfg);
141+
// eslint-disable-next-line no-await-in-loop
142+
await new Promise(resolve => setTimeout(resolve, 1000));
143+
}
144+
145+
await new Promise(resolve => setTimeout(resolve, 12000));
146+
expect(emit.getCalls().length).to.equal(8);
147+
expect(emit.getCalls().filter(call => call.args[0] === 'data').length).to.equal(2);
148+
});
149+
});
150+
});

0 commit comments

Comments
 (0)