Skip to content
This repository was archived by the owner on Mar 17, 2023. It is now read-only.

Commit 690dbef

Browse files
committed
lint and mutex.wrap
1 parent 8e0f209 commit 690dbef

File tree

11 files changed

+189
-86
lines changed

11 files changed

+189
-86
lines changed

.eslintrc.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
module.exports = {
2+
env: {
3+
commonjs: true,
4+
es6: true,
5+
node: true,
6+
},
7+
extends: ['airbnb-base', 'plugin:jest/recommended', 'plugin:prettier/recommended'],
8+
globals: {
9+
Atomics: 'readonly',
10+
SharedArrayBuffer: 'readonly',
11+
fetch: 'readonly',
12+
fetchMock: 'readonly'
13+
},
14+
parserOptions: {
15+
ecmaVersion: 2018,
16+
},
17+
plugins: ['jest'],
18+
rules: {
19+
'camelcase': 'off',
20+
'no-console': 'warn',
21+
'no-trailing-spaces': 'off',
22+
'global-require': 'off',
23+
'no-underscore-dangle': 'off', // mongoId
24+
'padded-blocks': 'off',
25+
'no-unused-vars': 'warn',
26+
'no-param-reassign': ['error', { props: false }],
27+
'radix': 'warn',
28+
'max-len': [
29+
'error',
30+
{ code: 120, comments: 200, ignoreTrailingComments: true, ignoreUrls: true },
31+
],
32+
'prettier/prettier': ['error'],
33+
"jest/no-focused-tests": "warn",
34+
"jest/no-standalone-expect": "warn",
35+
},
36+
overrides: [
37+
{
38+
files: ['tests/**/*.js'],
39+
rules: {
40+
'no-unused-vars': 'off',
41+
'no-console': 'off',
42+
'prefer-const': 'off',
43+
},
44+
},
45+
{
46+
files: ['*.md'],
47+
rules: {
48+
'arrow-body-style': 0,
49+
'consistent-return': 0,
50+
'flowtype/require-valid-file-annotation': 0,
51+
'import/no-extraneous-dependencies': 0,
52+
'import/no-unresolved': 0,
53+
'jest/no-focused-tests': 0,
54+
'jest/no-identical-title': 0,
55+
'jest/valid-expect': 0,
56+
'no-undef': 0,
57+
'no-unused-vars': 0,
58+
'prettier/prettier': 0,
59+
'react/jsx-no-undef': 0,
60+
'react/react-in-jsx-scope': 0,
61+
'sort-keys': 0,
62+
},
63+
},
64+
],
65+
};

.eslintrc.json

Lines changed: 0 additions & 41 deletions
This file was deleted.

.prettierrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"printWidth": 100,
2+
"printWidth": 120,
33
"singleQuote": true,
44
"trailingComma": "all"
55
}

src/graphql/connect.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,7 @@ const makeRequest = ({ sdk, method, client, remoteServiceName, logger }) => (con
5858
if (throwError) {
5959
// if there is more information
6060
if (Array.isArray(err.graphQLErrors) && err.graphQLErrors.length > 0) {
61-
throw flaverr(
62-
_.pick(err.graphQLErrors[0], ['code', 'httpStatusCode', 'locations', 'path']),
63-
err,
64-
);
61+
throw flaverr(_.pick(err.graphQLErrors[0], ['code', 'httpStatusCode', 'locations', 'path']), err);
6562
}
6663

6764
// else just throw error

src/index.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,7 @@ async function disableGraphql(name = 'default') {
157157

158158
// ---------------------------------------------------------------------------
159159

160-
async function bootstrap(
161-
environment = 'production',
162-
configOverrides = {},
163-
useEnv = true,
164-
overwriteGlobal = false,
165-
) {
160+
async function bootstrap(environment = 'production', configOverrides = {}, useEnv = true, overwriteGlobal = false) {
166161
// create new instance
167162
const instance = _.cloneDeep(defaultInstance);
168163

src/mutex/connect.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const flaverr = require('flaverr');
2+
const bluebird = require('bluebird');
23
const DriverMemory = require('./drivers/memory');
34
const DriverRedis = require('./drivers/redis');
45

@@ -61,6 +62,18 @@ module.exports = async ({ configs, sdk }) => {
6162
acquire: (args) => connection.acquire(args),
6263
destroy: () => connection.destroyInstance(),
6364

65+
wrap: async (args, fn) => {
66+
const unlock = await connection.acquire(args);
67+
68+
return bluebird
69+
.resolve(fn())
70+
.tap(unlock)
71+
.catch(async (err) => {
72+
await unlock();
73+
throw err;
74+
});
75+
},
76+
6477
// dig deeper
6578
connection,
6679
};

src/streams/drivers/kafka/machines/createInstance.js

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,7 @@ module.exports = {
2424
friendlyName: 'createInstance',
2525
description: 'Create stream driver with kafka',
2626

27-
fn(
28-
{
29-
sdk,
30-
connectionString,
31-
sslEnable = false,
32-
sslRejectUnauthorized,
33-
sslCaFile,
34-
sslKeyFile,
35-
sslCertFile,
36-
},
37-
exits,
38-
) {
27+
fn({ sdk, connectionString, sslEnable = false, sslRejectUnauthorized, sslCaFile, sslKeyFile, sslCertFile }, exits) {
3928
// notify to boot
4029
const log = sdk.log.child({
4130
service: 'stream',

src/streams/drivers/kafka/machines/makeObservable.test.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,24 +95,22 @@ describe('check', () => {
9595

9696
const s = makeObservable({ client, sdk, channel: channel2 })
9797
.now()
98-
.observable
99-
.subscribe({ next: () => mock() });
98+
.observable.subscribe({ next: () => mock() });
10099

101-
await Promise.delay(25)
100+
await Promise.delay(25);
102101
await sendSomething(channel1);
103-
await Promise.delay(25)
102+
await Promise.delay(25);
104103
await sendSomething(channel2);
105104

106105
// make sure in next 10s
107-
await (new Promise(resolve => {
106+
await new Promise((resolve) => {
108107
setTimeout(() => {
109-
expect(mock).not.toHaveBeenCalled()
108+
expect(mock).not.toHaveBeenCalled();
110109

111110
s.unsubscribe();
112111
resolve();
113-
}, 10000)
114-
}))
115-
112+
}, 10000);
113+
});
116114
});
117115

118116
it('fromBeginning ok', async () => {

tests/mutex/wrap.test.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
const Promise = require('bluebird');
2+
const uuid = require('uuid').v4;
3+
4+
const bootstrap = require('./_bootstrapSdk');
5+
6+
jest.useRealTimers();
7+
jest.setTimeout(500000);
8+
let sdk;
9+
10+
beforeAll(async () => {
11+
sdk = await bootstrap({
12+
APP_NAME: 'jest',
13+
LOG_DEBUG_ENABLE: true,
14+
MUTEX_DRIVER: 'memory',
15+
});
16+
await sdk.enable_mutex();
17+
});
18+
19+
afterAll(() => jest.clearAllTimers());
20+
21+
describe('check wrap returns', () => {
22+
it('wrap mutex ok on resolves', async () => {
23+
await expect(sdk.mutex.wrap({ key: 'trx' }, () => 1)).resolves.not.toThrow();
24+
});
25+
26+
it('wrap mutex ok on rejects', async () => {
27+
await expect(
28+
sdk.mutex.wrap({ key: 'trx' }, () => {
29+
throw new Error('aha');
30+
}),
31+
).rejects.toThrow(/aha/);
32+
});
33+
});
34+
35+
describe('check wrap no race', () => {
36+
it('no races', async () => {
37+
const mutexKey = uuid();
38+
39+
const beforeAllAt = Date.now();
40+
const loggerTable = [];
41+
42+
const run = async (workerId, workDuration, shouldRunAfter) => {
43+
const createdAt = Date.now();
44+
let startedAt;
45+
let finishedAt;
46+
47+
await sdk.mutex.wrap({ key: mutexKey }, async () => {
48+
startedAt = Date.now();
49+
await Promise.delay(workDuration);
50+
loggerTable.push({
51+
workerId,
52+
waitInSeconds: workDuration / 1000,
53+
startedAt: new Date(startedAt).toISOString().split('T')[1],
54+
shouldRunAfter: new Date(beforeAllAt + shouldRunAfter).toISOString().split('T')[1],
55+
});
56+
finishedAt = Date.now();
57+
});
58+
59+
// its ok?
60+
expect(createdAt).toBeGreaterThan(beforeAllAt);
61+
expect(startedAt).toBeGreaterThan(beforeAllAt);
62+
expect(finishedAt).toBeGreaterThan(beforeAllAt);
63+
64+
// timer in order
65+
expect(startedAt).toBeGreaterThan(createdAt);
66+
expect(finishedAt).toBeGreaterThan(startedAt);
67+
68+
// outside timer
69+
expect(startedAt).toBeGreaterThanOrEqual(beforeAllAt + shouldRunAfter);
70+
71+
return {
72+
createdAt,
73+
startedAt,
74+
finishedAt,
75+
};
76+
};
77+
78+
// mutex not run in order, then we only make sure if its run after certain time
79+
await Promise.all([
80+
// #1 batch
81+
// called At id run in (ms) startedAt should be >=
82+
Promise.delay(1).then(() => run('1.1', 2000, 1)),
83+
Promise.delay(1000).then(() => run('1.2', 2000, 2000)), // batch #1.2 will be randomly assigned
84+
Promise.delay(2000).then(() => run('1.3', 2000, 2000)), // batch #1.2 will be randomly assigned
85+
86+
// #3 batch
87+
// called At id run in (ms) startedAt should be >=
88+
Promise.delay(8000).then(() => run('2.1', 2000, 8000)),
89+
Promise.delay(9000).then(() => run('2.2', 2000, 9000)),
90+
Promise.delay(10000).then(() => run('2.3', 2000, 9000)),
91+
]);
92+
93+
// console.table(loggerTable)
94+
});
95+
});

tests/tracers/zipkin/common-memory.test.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,15 @@ describe('check', () => {
2121
expect(sdk.zipkinTracer.local('static int 1', () => 1)).toBe(1);
2222
expect(sdk.zipkinTracer.local('static int 2', () => 2)).toBe(2);
2323

24-
const spansLength = sdk.log.ringBuffer.records.filter(({ log }) => log === 'zipkin-span')
25-
.length;
24+
const spansLength = sdk.log.ringBuffer.records.filter(({ log }) => log === 'zipkin-span').length;
2625
expect(spansLength).toBe(2);
2726
});
2827

2928
it('local process: promise ', async () => {
30-
await expect(
31-
sdk.zipkinTracer.local('promise int 1', () => Promise.delay(200, 1)),
32-
).resolves.toBe(1);
33-
await expect(
34-
sdk.zipkinTracer.local('promise int 2', () => Promise.delay(200, 2)),
35-
).resolves.toBe(2);
29+
await expect(sdk.zipkinTracer.local('promise int 1', () => Promise.delay(200, 1))).resolves.toBe(1);
30+
await expect(sdk.zipkinTracer.local('promise int 2', () => Promise.delay(200, 2))).resolves.toBe(2);
3631

37-
const spansLength = sdk.log.ringBuffer.records.filter(({ log }) => log === 'zipkin-span')
38-
.length;
32+
const spansLength = sdk.log.ringBuffer.records.filter(({ log }) => log === 'zipkin-span').length;
3933
expect(spansLength).toBe(2);
4034
});
4135
});

tests/utils/cache.test.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ describe('check cache oke', () => {
5858
},
5959
});
6060

61-
expect(cache.redisCache.store.getClient().options.url).toBe(
62-
process.env.REDIS_CONNECTION_STRING,
63-
);
61+
expect(cache.redisCache.store.getClient().options.url).toBe(process.env.REDIS_CONNECTION_STRING);
6462

6563
return cache.redisCache.store.getClient().quit();
6664
});

0 commit comments

Comments
 (0)