Skip to content

Commit bde9c38

Browse files
committed
refactor: changes after review
1 parent 112d8af commit bde9c38

File tree

6 files changed

+80
-48
lines changed

6 files changed

+80
-48
lines changed

src/composeBull.ts

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { schemaComposer, SchemaComposer } from 'graphql-compose';
1+
import {
2+
schemaComposer,
3+
SchemaComposer,
4+
ObjectTypeComposerFieldConfigAsObjectDefinition,
5+
} from 'graphql-compose';
26
import { Options } from './definitions';
37
import { getQueueTC, getJobTC } from './types';
48
import { createQueuesFC, createQueueKeysFC, createQueueFC, createJobFC } from './query';
@@ -19,22 +23,54 @@ import {
1923
createJobUpdateFC,
2024
createJobLogAddFC,
2125
} from './mutation';
22-
import { createMutationFC, predefineQueueArgs } from './helpers';
26+
import { createMutationFC, wrapQueueArgs } from './helpers';
2327

2428
export function composeBull(opts: Options & { schemaComposer?: SchemaComposer<any> }) {
2529
const sc = opts?.schemaComposer || schemaComposer;
2630

31+
/**
32+
* Compose several FC creator with middlewares
33+
* Eg. composeFC(sc, opts)(createQueueKeysFC, wrapQueueArgs, wrapOtherMiddleware)
34+
* Will work like the following code:
35+
* let fc = createQueueKeysFC(sc, opts);
36+
* fc = wrapQueueArgs(fc, sc, opts)
37+
* fc = wrapOtherMiddleware(fc, sc, opts)
38+
* return fc;
39+
*/
40+
function composeFC(sc: SchemaComposer<any>, opts: Options) {
41+
return (
42+
creator: (
43+
sc: SchemaComposer<any>,
44+
opts: Options
45+
) => ObjectTypeComposerFieldConfigAsObjectDefinition<any, any>,
46+
...middlewares: ((
47+
fc: ObjectTypeComposerFieldConfigAsObjectDefinition<any, any>,
48+
sc: SchemaComposer<any>,
49+
opts: Options
50+
) => ObjectTypeComposerFieldConfigAsObjectDefinition<any, any>)[]
51+
): ObjectTypeComposerFieldConfigAsObjectDefinition<any, any> => {
52+
let fc = creator(sc, opts);
53+
for (let i = 0; i < middlewares.length; i++) {
54+
fc = middlewares[i](fc, sc, opts);
55+
}
56+
return fc;
57+
};
58+
}
59+
60+
const wrap = composeFC(sc, opts);
61+
2762
return {
2863
QueueTC: getQueueTC(sc, opts),
2964
JobTC: getJobTC(sc, opts),
3065
queryFields: {
31-
queueKeys: predefineQueueArgs(createQueueKeysFC(sc, opts), opts),
66+
queueKeys: wrap(createQueueKeysFC, wrapQueueArgs),
3267
queues: predefineQueueArgs(createQueuesFC(sc, opts), opts),
3368
queue: predefineQueueArgs(createQueueFC(sc, opts), opts),
3469
job: predefineQueueArgs(createJobFC(sc, opts), opts),
3570
},
3671
mutationFields: {
37-
queueClean: predefineQueueArgs(createMutationFC(createQueueCleanFC, sc, opts), opts),
72+
queueClean: wrap(createQueueCleanFC, createMutationFC, predefineQueueArgs),
73+
// queueClean: predefineQueueArgs(createMutationFC(createQueueCleanFC, sc, opts), opts),
3874
queueDrain: predefineQueueArgs(createMutationFC(createQueueDrainFC, sc, opts), opts),
3975
queuePause: predefineQueueArgs(createMutationFC(createQueuePauseFC, sc, opts), opts),
4076
queueResume: predefineQueueArgs(createMutationFC(createQueueResumeFC, sc, opts), opts),

src/definitions.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ObjectTypeComposer } from 'graphql-compose';
2-
import Redis, { RedisOptions } from 'ioredis';
2+
import IORedis, { RedisOptions } from 'ioredis';
33

44
export type Options = {
55
typePrefix: string;
@@ -8,10 +8,5 @@ export type Options = {
88
name: string;
99
prefix: string;
1010
};
11-
redis?:
12-
| {
13-
uri?: string;
14-
opts?: RedisOptions;
15-
}
16-
| Redis.Redis;
11+
redis?: RedisOptions | IORedis.Redis;
1712
};

src/helpers/getBullConnection.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
import { Options } from './../definitions';
22
import Redis from 'ioredis';
33

4-
let connection: Redis.Redis;
4+
const connectionMap = new Map<Options['redis'], Redis.Redis>();
55

66
export function getBullConnection(opts: Options): Redis.Redis {
7+
let connection = connectionMap.get(opts.redis);
78
if (connection) {
89
return connection;
910
}
1011

11-
if (opts.redis instanceof Redis) {
12+
if (opts?.redis instanceof Redis) {
1213
connection = opts.redis;
13-
} else if (opts?.redis?.uri) {
14-
connection = new Redis(opts.redis.uri);
15-
} else if (opts?.redis?.opts) {
16-
connection = new Redis(opts.redis.opts);
14+
} else if (opts?.redis) {
15+
connection = new Redis(opts.redis);
1716
} else {
1817
connection = new Redis();
1918
}
2019

20+
connectionMap.set(opts.redis, connection);
21+
2122
return connection;
2223
}

src/helpers/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ export * from './queueTitles';
33
export * from './MutationError';
44
export * from './normalizePrefixGlob';
55
export * from './wrapMutationFC';
6-
export * from './predefineQueueArgs';
6+
export * from './wrapQueueArgs';

src/helpers/predefineQueueArgs.ts

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

src/helpers/wrapQueueArgs.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { Options } from '../definitions';
2+
import { ObjectTypeComposerFieldConfigAsObjectDefinition, SchemaComposer } from 'graphql-compose';
3+
4+
export function wrapQueueArgs(
5+
fieldConfig: ObjectTypeComposerFieldConfigAsObjectDefinition<any, any>,
6+
sc: SchemaComposer<any>,
7+
opts: Options
8+
): ObjectTypeComposerFieldConfigAsObjectDefinition<any, any> {
9+
// remove args if they provided via config
10+
if (opts?.queue?.name && fieldConfig.args?.queueName) {
11+
delete fieldConfig.args.queueName;
12+
}
13+
if (opts?.queue?.prefix && fieldConfig.args?.prefix) {
14+
delete fieldConfig.args.prefix;
15+
}
16+
17+
// pass config props to sub resolve issue
18+
if (opts?.queue?.name || opts?.queue?.prefix) {
19+
const predifinedArgs = {} as Record<string, any>;
20+
if (opts?.queue?.name) predifinedArgs.queueName = opts.queue?.name;
21+
if (opts?.queue?.prefix) predifinedArgs.prefix = opts.queue?.prefix;
22+
23+
const subResolve = fieldConfig.resolve || (() => ({}));
24+
fieldConfig.resolve = async (source, args, context, info) => {
25+
return subResolve(source, { ...predifinedArgs, ...args }, context, info);
26+
};
27+
}
28+
29+
return fieldConfig;
30+
}

0 commit comments

Comments
 (0)