woonplan-packages-redishelper 1.0.50 → 1.0.55
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/getters.d.ts +3 -4
- package/dist/getters.js +32 -62
- package/dist/index.d.ts +4 -3
- package/dist/index.js +55 -2
- package/dist/memdb.d.ts +4 -0
- package/dist/memdb.js +6 -0
- package/dist/setters.js +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/utils.d.ts +3 -1
- package/dist/utils.js +6 -1
- package/getters.ts +44 -98
- package/index.ts +76 -3
- package/memdb.ts +7 -0
- package/package.json +5 -2
- package/setters.ts +1 -1
- package/types.ts +3 -0
- package/utils.ts +4 -2
package/dist/getters.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Redis } from "ioredis";
|
|
2
|
-
import {
|
|
3
|
-
declare const getOrRequestKey: (
|
|
4
|
-
declare const requestAndWaitForData: (client: Redis, data: Struct, service: string) => Promise<unknown>;
|
|
2
|
+
import { RedisConfig } from "./types";
|
|
3
|
+
declare const getOrRequestKey: (config: RedisConfig, key: string, service: string) => Promise<unknown>;
|
|
5
4
|
declare const subscribeToMessageResponse: (client: Redis, messageid: string) => Promise<number>;
|
|
6
5
|
declare const requestAndWaitForList: (client: Redis, service: string, listname: string, listsubject: string, props: {} | undefined, {}: {}) => Promise<unknown>;
|
|
7
|
-
export { getOrRequestKey, requestAndWaitForList, subscribeToMessageResponse
|
|
6
|
+
export { getOrRequestKey, requestAndWaitForList, subscribeToMessageResponse };
|
package/dist/getters.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.subscribeToMessageResponse = exports.requestAndWaitForList = exports.getOrRequestKey = void 0;
|
|
4
4
|
var utils_1 = require("./utils");
|
|
5
|
-
var
|
|
6
|
-
|
|
5
|
+
var memdb_1 = require("./memdb");
|
|
6
|
+
var uuid_1 = require("uuid");
|
|
7
|
+
var timeout = 250;
|
|
8
|
+
var getOrRequestKey = function (config, key, service) { return new Promise(function (resolve, reject) {
|
|
9
|
+
var getterclient = (0, memdb_1.getRedisClient)(config);
|
|
10
|
+
getterclient.get(key)
|
|
7
11
|
.then(function (result) {
|
|
8
12
|
if (result)
|
|
9
13
|
resolve(result);
|
|
10
14
|
if (!result) {
|
|
11
|
-
return requestAndWaitForKey(
|
|
15
|
+
return requestAndWaitForKey(getterclient, config, key, service);
|
|
12
16
|
}
|
|
13
17
|
})
|
|
14
18
|
.then(function (result) { return resolve(result); })
|
|
@@ -18,84 +22,50 @@ var getOrRequestKey = function (client, key, service) { return new Promise(funct
|
|
|
18
22
|
});
|
|
19
23
|
}); };
|
|
20
24
|
exports.getOrRequestKey = getOrRequestKey;
|
|
21
|
-
var requestAndWaitForKey = function (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return subscribeToMessageResponse(client, messageid);
|
|
29
|
-
}).then(function () {
|
|
30
|
-
console.log("subscribed to ".concat(createdMessageId, " at ").concat(new Date().toUTCString()));
|
|
25
|
+
var requestAndWaitForKey = function (getterclient, config, key, service) { return new Promise(function (resolve) {
|
|
26
|
+
var messageid = (0, uuid_1.v4)();
|
|
27
|
+
// create a listener
|
|
28
|
+
var listenerclient = (0, memdb_1.getRedisClient)(config);
|
|
29
|
+
subscribeToMessageResponse(listenerclient, messageid).
|
|
30
|
+
then(function () {
|
|
31
|
+
console.log("subscribed to ".concat(messageid, " at ").concat(new Date().toISOString()));
|
|
31
32
|
// we are subscribed
|
|
32
33
|
// setting up a one time event listener
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
resolve(message);
|
|
38
|
-
else
|
|
39
|
-
resolve(null);
|
|
40
|
-
}).catch(function (error) {
|
|
41
|
-
console.log(error);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
// setup timeout
|
|
45
|
-
setTimeout(function () {
|
|
46
|
-
if (client.status != "end") {
|
|
47
|
-
console.log("sub timedout");
|
|
48
|
-
client.unsubscribe();
|
|
34
|
+
listenerclient.once("message", function (channel, message) {
|
|
35
|
+
if (message.length)
|
|
36
|
+
resolve(message);
|
|
37
|
+
else
|
|
49
38
|
resolve(null);
|
|
50
|
-
}
|
|
51
|
-
}, 250);
|
|
52
|
-
}).catch(function (e) {
|
|
53
|
-
console.log(e);
|
|
54
|
-
resolve(null);
|
|
55
|
-
});
|
|
56
|
-
}); };
|
|
57
|
-
var requestAndWaitForData = function (client, data, service) { return new Promise(function (resolve) {
|
|
58
|
-
service = capitalizeFirstLetter(service);
|
|
59
|
-
client.xadd("dataRequestedFrom".concat(service, "Service"), '*', 'data', JSON.stringify(data))
|
|
60
|
-
.then(function (messageid) {
|
|
61
|
-
// create a key to listen to, the key contains the message we just created;
|
|
62
|
-
return subscribeToMessageResponse(client, messageid);
|
|
63
|
-
}).then(function () {
|
|
64
|
-
// we are subscribed
|
|
65
|
-
// setting up a one time event listener
|
|
66
|
-
client.once("message", function (channel, message) {
|
|
67
39
|
console.log("unsubscribing from ".concat(channel));
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
resolve(message);
|
|
71
|
-
else
|
|
72
|
-
resolve(null);
|
|
73
|
-
});
|
|
40
|
+
listenerclient.unsubscribe();
|
|
41
|
+
listenerclient.disconnect();
|
|
74
42
|
});
|
|
75
43
|
// setup timeout
|
|
76
44
|
setTimeout(function () {
|
|
77
|
-
if (
|
|
45
|
+
if (listenerclient.status != "end") {
|
|
78
46
|
console.log("sub timedout");
|
|
79
|
-
client.unsubscribe();
|
|
80
47
|
resolve(null);
|
|
48
|
+
listenerclient.unsubscribe();
|
|
49
|
+
listenerclient.disconnect();
|
|
81
50
|
}
|
|
82
|
-
},
|
|
83
|
-
})
|
|
51
|
+
}, timeout);
|
|
52
|
+
});
|
|
53
|
+
// send out the request
|
|
54
|
+
getterclient.xadd((0, utils_1.getKeyRequestedChannelName)(service), '*', 'key', key, 'messageid', messageid)
|
|
55
|
+
.catch(function (e) {
|
|
84
56
|
console.log(e);
|
|
85
57
|
resolve(null);
|
|
86
|
-
})
|
|
58
|
+
})
|
|
59
|
+
.finally(function () { return getterclient.disconnect(); });
|
|
87
60
|
}); };
|
|
88
|
-
exports.requestAndWaitForData = requestAndWaitForData;
|
|
89
61
|
var subscribeToMessageResponse = function (client, messageid) { return client.subscribe((0, utils_1.getMessageReponseKey)(messageid)); };
|
|
90
62
|
exports.subscribeToMessageResponse = subscribeToMessageResponse;
|
|
91
63
|
var requestAndWaitForList = function (client, service, listname, listsubject, props, _a) {
|
|
92
64
|
if (props === void 0) { props = {}; }
|
|
93
65
|
return new Promise(function (resolve) {
|
|
94
|
-
service = capitalizeFirstLetter(service);
|
|
95
66
|
// send message for list to be created and then block untill we have a list
|
|
96
|
-
client.xadd(
|
|
67
|
+
client.xadd((0, utils_1.getListRequestedChannelName)(service), '*', 'listname', listname, 'listsubject', listsubject, 'props', JSON.stringify(props))
|
|
97
68
|
.then(function () { return resolve(client.blmove(listname, listname, 'RIGHT', 'LEFT', 2)); });
|
|
98
69
|
});
|
|
99
70
|
};
|
|
100
71
|
exports.requestAndWaitForList = requestAndWaitForList;
|
|
101
|
-
var capitalizeFirstLetter = function (string) { return string.charAt(0).toUpperCase() + string.slice(1); };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Redis } from "ioredis";
|
|
2
|
-
import { RedisMessage } from "./types";
|
|
2
|
+
import { RedisConfig, RedisMessage } from "./types";
|
|
3
3
|
import { sendMessageToStream, publishMessageResponse } from "./setters";
|
|
4
|
-
import { getOrRequestKey, subscribeToMessageResponse, requestAndWaitForList
|
|
4
|
+
import { getOrRequestKey, subscribeToMessageResponse, requestAndWaitForList } from "./getters";
|
|
5
5
|
declare const listenToStream: (client: Redis, groupname: string, channelname: string, consumername: string, callback: Function) => Promise<boolean>;
|
|
6
|
-
|
|
6
|
+
declare const dataRequester: (config: RedisConfig, groupname: string, service: string, consumername: string, callback: Function) => void;
|
|
7
|
+
export { listenToStream, RedisMessage, sendMessageToStream, publishMessageResponse, getOrRequestKey, dataRequester, subscribeToMessageResponse, requestAndWaitForList };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.requestAndWaitForList = exports.subscribeToMessageResponse = exports.
|
|
3
|
+
exports.requestAndWaitForList = exports.subscribeToMessageResponse = exports.dataRequester = exports.getOrRequestKey = exports.publishMessageResponse = exports.sendMessageToStream = exports.listenToStream = void 0;
|
|
4
4
|
var setters_1 = require("./setters");
|
|
5
5
|
Object.defineProperty(exports, "sendMessageToStream", { enumerable: true, get: function () { return setters_1.sendMessageToStream; } });
|
|
6
6
|
Object.defineProperty(exports, "publishMessageResponse", { enumerable: true, get: function () { return setters_1.publishMessageResponse; } });
|
|
@@ -8,7 +8,8 @@ var getters_1 = require("./getters");
|
|
|
8
8
|
Object.defineProperty(exports, "getOrRequestKey", { enumerable: true, get: function () { return getters_1.getOrRequestKey; } });
|
|
9
9
|
Object.defineProperty(exports, "subscribeToMessageResponse", { enumerable: true, get: function () { return getters_1.subscribeToMessageResponse; } });
|
|
10
10
|
Object.defineProperty(exports, "requestAndWaitForList", { enumerable: true, get: function () { return getters_1.requestAndWaitForList; } });
|
|
11
|
-
|
|
11
|
+
var memdb_1 = require("./memdb");
|
|
12
|
+
var utils_1 = require("./utils");
|
|
12
13
|
var listenToStream = function (client, groupname, channelname, consumername, callback) { return new Promise(function (resolve, reject) {
|
|
13
14
|
createGroup(client, groupname, channelname).then(function () {
|
|
14
15
|
listenForMessage(client, groupname, channelname, consumername, callback);
|
|
@@ -27,6 +28,58 @@ var createGroup = function (client, groupname, channelname) { return new Promise
|
|
|
27
28
|
reject(error);
|
|
28
29
|
});
|
|
29
30
|
}); };
|
|
31
|
+
// this function is made as a responsding function to getters/requestAndWaitForKey
|
|
32
|
+
// dataRequester listens to a stream and then publishes a respond
|
|
33
|
+
var dataRequester = function (config, groupname, service, consumername, callback) {
|
|
34
|
+
var channelname = (0, utils_1.getKeyRequestedChannelName)(service);
|
|
35
|
+
var listenerclient = (0, memdb_1.getRedisClient)(config);
|
|
36
|
+
createGroup(listenerclient, groupname, channelname)
|
|
37
|
+
.then(function () { return listenForMessageForDataRequest(listenerclient, groupname, channelname, consumername, callback); });
|
|
38
|
+
};
|
|
39
|
+
exports.dataRequester = dataRequester;
|
|
40
|
+
var getMessagedataFromResult = function (results) {
|
|
41
|
+
if (!results.length)
|
|
42
|
+
throw ('no-messagedata');
|
|
43
|
+
var result = results[0], messages = result[1];
|
|
44
|
+
if (!messages.length)
|
|
45
|
+
throw ('no-messagedata');
|
|
46
|
+
var message = messages[0], id = message[0], keysandvalues = message[1];
|
|
47
|
+
var messagedata = {};
|
|
48
|
+
keysandvalues.forEach(function (key, n) {
|
|
49
|
+
if (!(n == 0 || n % 2 == 0))
|
|
50
|
+
return;
|
|
51
|
+
messagedata[key] = keysandvalues[n + 1];
|
|
52
|
+
});
|
|
53
|
+
return { messagedata: messagedata, id: id };
|
|
54
|
+
};
|
|
55
|
+
var listenForMessageForDataRequest = function (listenerclient, groupname, channelname, consumername, callback) {
|
|
56
|
+
var streammsgid = '';
|
|
57
|
+
var messageid = '';
|
|
58
|
+
// block client while listening for a message
|
|
59
|
+
listenerclient.xreadgroup('GROUP', groupname, consumername, 'COUNT', 1, 'BLOCK', 0, 'STREAMS', channelname, '>')
|
|
60
|
+
.then(function (results) {
|
|
61
|
+
return getMessagedataFromResult(results);
|
|
62
|
+
})
|
|
63
|
+
.then(function (_a) {
|
|
64
|
+
var messagedata = _a.messagedata, id = _a.id;
|
|
65
|
+
// messageid should have been set in getters/requestAndWaitForKey
|
|
66
|
+
if ('messageid' in messagedata)
|
|
67
|
+
messageid = messagedata.id;
|
|
68
|
+
//stream id from redis
|
|
69
|
+
streammsgid = id;
|
|
70
|
+
return messagedata;
|
|
71
|
+
})
|
|
72
|
+
.then(function (messagedata) {
|
|
73
|
+
return callback(messagedata, streammsgid);
|
|
74
|
+
})
|
|
75
|
+
.then(function (result) { return (0, setters_1.publishMessageResponse)(listenerclient, messageid, result != null ? result : ''); })
|
|
76
|
+
.finally(function () {
|
|
77
|
+
listenerclient.xack(channelname, groupname, streammsgid).then(function () {
|
|
78
|
+
console.log(streammsgid + ' acknowledged');
|
|
79
|
+
});
|
|
80
|
+
listenForMessageForDataRequest(listenerclient, groupname, channelname, consumername, callback);
|
|
81
|
+
});
|
|
82
|
+
};
|
|
30
83
|
var listenForMessage = function (client, groupname, channelname, consumername, callback, lastId) {
|
|
31
84
|
if (lastId === void 0) { lastId = "$"; }
|
|
32
85
|
console.log("listening to ".concat(channelname, " as ").concat(consumername));
|
package/dist/memdb.d.ts
ADDED
package/dist/memdb.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRedisClient = void 0;
|
|
4
|
+
var IORedis = require("ioredis");
|
|
5
|
+
var getRedisClient = function (config) { return new IORedis(config.REDISURL); };
|
|
6
|
+
exports.getRedisClient = getRedisClient;
|
package/dist/setters.js
CHANGED
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.sendMessageToStream = exports.publishMessageResponse = void 0;
|
|
13
13
|
var utils_1 = require("./utils");
|
|
14
14
|
var publishMessageResponse = function (client, messageid, message) {
|
|
15
|
-
console.log("publishing to ".concat(messageid, " at ").concat(new Date().
|
|
15
|
+
console.log("publishing to ".concat(messageid, " at ").concat(new Date().toISOString()));
|
|
16
16
|
return client.publish((0, utils_1.getMessageReponseKey)(messageid), message);
|
|
17
17
|
};
|
|
18
18
|
exports.publishMessageResponse = publishMessageResponse;
|
package/dist/types.d.ts
CHANGED
package/dist/utils.d.ts
CHANGED
|
@@ -2,4 +2,6 @@ import { RedisMessage } from "./types";
|
|
|
2
2
|
declare const getMessageReponseKey: (messageid: string) => string;
|
|
3
3
|
declare const reduceArraysToArray: (toArray: any[], fromArray: []) => any[];
|
|
4
4
|
declare const redisMessageToArrayOfKeysAndValues: (message: RedisMessage) => any[];
|
|
5
|
-
|
|
5
|
+
declare const getKeyRequestedChannelName: (service: string) => string;
|
|
6
|
+
declare const getListRequestedChannelName: (service: string) => string;
|
|
7
|
+
export { getMessageReponseKey, redisMessageToArrayOfKeysAndValues, reduceArraysToArray, getKeyRequestedChannelName, getListRequestedChannelName };
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.reduceArraysToArray = exports.redisMessageToArrayOfKeysAndValues = exports.getMessageReponseKey = void 0;
|
|
3
|
+
exports.getListRequestedChannelName = exports.getKeyRequestedChannelName = exports.reduceArraysToArray = exports.redisMessageToArrayOfKeysAndValues = exports.getMessageReponseKey = void 0;
|
|
4
4
|
var messagePrefix = "messageresponse";
|
|
5
5
|
var getMessageReponseKey = function (messageid) { return messagePrefix + messageid; };
|
|
6
6
|
exports.getMessageReponseKey = getMessageReponseKey;
|
|
@@ -8,3 +8,8 @@ var reduceArraysToArray = function (toArray, fromArray) { return toArray.concat(
|
|
|
8
8
|
exports.reduceArraysToArray = reduceArraysToArray;
|
|
9
9
|
var redisMessageToArrayOfKeysAndValues = function (message) { return Object.keys(message).map(function (key) { return [key, message[key]]; }); };
|
|
10
10
|
exports.redisMessageToArrayOfKeysAndValues = redisMessageToArrayOfKeysAndValues;
|
|
11
|
+
var capitalizeFirstLetter = function (string) { return string.charAt(0).toUpperCase() + string.slice(1); };
|
|
12
|
+
var getKeyRequestedChannelName = function (service) { return "keyRequestedFrom".concat(capitalizeFirstLetter(service), "Service"); };
|
|
13
|
+
exports.getKeyRequestedChannelName = getKeyRequestedChannelName;
|
|
14
|
+
var getListRequestedChannelName = function (service) { return "listRequestedFrom".concat(capitalizeFirstLetter(service), "Service"); };
|
|
15
|
+
exports.getListRequestedChannelName = getListRequestedChannelName;
|
package/getters.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { Redis } from "ioredis"
|
|
2
|
-
import { getMessageReponseKey } from "./utils"
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { getMessageReponseKey, getKeyRequestedChannelName, getListRequestedChannelName } from "./utils"
|
|
3
|
+
import { RedisConfig } from "./types"
|
|
4
|
+
import { getRedisClient } from "./memdb"
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
|
|
7
|
+
const timeout = 250;
|
|
8
|
+
|
|
9
|
+
const getOrRequestKey = ( config:RedisConfig, key:string, service:string ) => new Promise((resolve, reject) => {
|
|
10
|
+
const getterclient = getRedisClient( config )
|
|
11
|
+
getterclient.get( key )
|
|
6
12
|
.then(
|
|
7
13
|
( result ) => {
|
|
8
14
|
if( result ) resolve( result );
|
|
9
15
|
if( !result ){
|
|
10
|
-
return requestAndWaitForKey(
|
|
16
|
+
return requestAndWaitForKey( getterclient, config, key, service )
|
|
11
17
|
}
|
|
12
18
|
}
|
|
13
19
|
)
|
|
@@ -22,113 +28,56 @@ const getOrRequestKey = ( client:Redis, key:string, service:string ) => new Prom
|
|
|
22
28
|
)
|
|
23
29
|
})
|
|
24
30
|
|
|
31
|
+
|
|
25
32
|
const requestAndWaitForKey = (
|
|
26
|
-
|
|
33
|
+
getterclient:Redis,
|
|
34
|
+
config:RedisConfig,
|
|
27
35
|
key:string,
|
|
28
36
|
service:string,
|
|
29
|
-
) => new Promise((resolve) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
(
|
|
37
|
-
|
|
38
|
-
// create a key to listen to, the key contains the message we just created;
|
|
39
|
-
return subscribeToMessageResponse( client, messageid )
|
|
40
|
-
}
|
|
41
|
-
).then(
|
|
42
|
-
() => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
console.log( `subscribed to ${createdMessageId} at ${new Date().toUTCString()}` )
|
|
46
|
-
|
|
37
|
+
) => new Promise((resolve) => {
|
|
38
|
+
const messageid = uuidv4()
|
|
39
|
+
|
|
40
|
+
// create a listener
|
|
41
|
+
const listenerclient = getRedisClient( config )
|
|
42
|
+
subscribeToMessageResponse( listenerclient, messageid ).
|
|
43
|
+
then(
|
|
44
|
+
() => {
|
|
45
|
+
console.log( `subscribed to ${messageid} at ${new Date().toISOString()}` )
|
|
47
46
|
// we are subscribed
|
|
48
47
|
// setting up a one time event listener
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
listenerclient.once( "message", ( channel, message ) => {
|
|
49
|
+
if( message.length ) resolve( message );
|
|
50
|
+
else resolve( null )
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
() => {
|
|
54
|
-
if( message.length ) resolve( message );
|
|
55
|
-
else resolve( null )
|
|
56
|
-
}
|
|
57
|
-
).catch(
|
|
58
|
-
(error) => {
|
|
59
|
-
console.log( error )
|
|
60
|
-
}
|
|
61
|
-
);
|
|
52
|
+
console.log( `unsubscribing from ${channel}` )
|
|
62
53
|
|
|
63
|
-
|
|
54
|
+
listenerclient.unsubscribe()
|
|
55
|
+
listenerclient.disconnect()
|
|
56
|
+
})
|
|
64
57
|
|
|
65
58
|
// setup timeout
|
|
66
59
|
setTimeout( () => {
|
|
67
|
-
if(
|
|
60
|
+
if( listenerclient.status != "end" ){
|
|
68
61
|
console.log( `sub timedout`)
|
|
69
|
-
client.unsubscribe();
|
|
70
62
|
resolve( null )
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
).catch(
|
|
76
|
-
(e) => {
|
|
77
|
-
console.log( e )
|
|
78
|
-
resolve( null )
|
|
63
|
+
listenerclient.unsubscribe()
|
|
64
|
+
listenerclient.disconnect()
|
|
65
|
+
}
|
|
66
|
+
}, timeout )
|
|
79
67
|
}
|
|
80
68
|
)
|
|
81
|
-
})
|
|
82
|
-
|
|
83
69
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
service:string,
|
|
88
|
-
) => new Promise((resolve) => {
|
|
89
|
-
service = capitalizeFirstLetter( service );
|
|
90
|
-
|
|
91
|
-
client.xadd( `dataRequestedFrom${service}Service`, '*', 'data', JSON.stringify( data ) )
|
|
92
|
-
.then(
|
|
93
|
-
(messageid:string) => {
|
|
94
|
-
// create a key to listen to, the key contains the message we just created;
|
|
95
|
-
return subscribeToMessageResponse( client, messageid )
|
|
96
|
-
}
|
|
97
|
-
).then(
|
|
98
|
-
() => {
|
|
99
|
-
// we are subscribed
|
|
100
|
-
// setting up a one time event listener
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
client.once( "message", ( channel, message ) => {
|
|
105
|
-
console.log( `unsubscribing from ${channel}` )
|
|
106
|
-
|
|
107
|
-
client.unsubscribe().then(
|
|
108
|
-
() => {
|
|
109
|
-
if( message.length ) resolve( message );
|
|
110
|
-
else resolve( null )
|
|
111
|
-
}
|
|
112
|
-
);
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
// setup timeout
|
|
116
|
-
setTimeout( () => {
|
|
117
|
-
if( client.status != "end" ){
|
|
118
|
-
console.log( `sub timedout`)
|
|
119
|
-
client.unsubscribe();
|
|
120
|
-
resolve( null )
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
}, 250 )
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
).catch(
|
|
70
|
+
// send out the request
|
|
71
|
+
getterclient.xadd( getKeyRequestedChannelName( service ), '*', 'key', key, 'messageid', messageid )
|
|
72
|
+
.catch(
|
|
127
73
|
(e) => {
|
|
128
74
|
console.log( e )
|
|
129
75
|
resolve( null )
|
|
130
76
|
}
|
|
131
77
|
)
|
|
78
|
+
.finally(
|
|
79
|
+
() => getterclient.disconnect()
|
|
80
|
+
)
|
|
132
81
|
})
|
|
133
82
|
|
|
134
83
|
const subscribeToMessageResponse = ( client:Redis, messageid:string ) => client.subscribe( getMessageReponseKey( messageid ) )
|
|
@@ -143,17 +92,14 @@ const requestAndWaitForList = (
|
|
|
143
92
|
props = {}
|
|
144
93
|
,{
|
|
145
94
|
|
|
146
|
-
}) => new Promise((resolve) => {
|
|
147
|
-
service = capitalizeFirstLetter( service );
|
|
148
|
-
|
|
95
|
+
}) => new Promise((resolve) => {
|
|
149
96
|
// send message for list to be created and then block untill we have a list
|
|
150
|
-
client.xadd(
|
|
97
|
+
client.xadd( getListRequestedChannelName( service ), '*', 'listname', listname, 'listsubject', listsubject, 'props', JSON.stringify( props ))
|
|
151
98
|
.then(
|
|
152
99
|
() => resolve( client.blmove( listname, listname, 'RIGHT', 'LEFT', 2) )
|
|
153
100
|
)
|
|
154
101
|
})
|
|
155
102
|
|
|
156
|
-
const capitalizeFirstLetter = (string:string) => string.charAt(0).toUpperCase() + string.slice(1)
|
|
157
103
|
|
|
158
104
|
|
|
159
|
-
export { getOrRequestKey, requestAndWaitForList, subscribeToMessageResponse
|
|
105
|
+
export { getOrRequestKey, requestAndWaitForList, subscribeToMessageResponse }
|
package/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Redis } from "ioredis"
|
|
2
|
-
import { RedisMessage } from "./types"
|
|
2
|
+
import { RedisConfig, RedisMessage, Struct } from "./types"
|
|
3
3
|
import { sendMessageToStream, publishMessageResponse } from "./setters"
|
|
4
|
-
import { getOrRequestKey, subscribeToMessageResponse, requestAndWaitForList
|
|
4
|
+
import { getOrRequestKey, subscribeToMessageResponse, requestAndWaitForList } from "./getters"
|
|
5
|
+
import { getRedisClient } from "./memdb"
|
|
6
|
+
import { getKeyRequestedChannelName } from "./utils"
|
|
5
7
|
|
|
6
8
|
const listenToStream = ( client:Redis, groupname:string, channelname:string, consumername:string, callback:Function ):Promise<boolean> => new Promise((resolve,reject) => {
|
|
7
9
|
createGroup( client, groupname, channelname ).then(
|
|
@@ -31,6 +33,77 @@ const createGroup = ( client:Redis, groupname:string, channelname:string ):Promi
|
|
|
31
33
|
)
|
|
32
34
|
})
|
|
33
35
|
|
|
36
|
+
|
|
37
|
+
// this function is made as a responsding function to getters/requestAndWaitForKey
|
|
38
|
+
// dataRequester listens to a stream and then publishes a respond
|
|
39
|
+
const dataRequester = ( config:RedisConfig, groupname:string, service:string, consumername:string, callback:Function ) => {
|
|
40
|
+
const channelname = getKeyRequestedChannelName( service ) ;
|
|
41
|
+
const listenerclient = getRedisClient( config )
|
|
42
|
+
createGroup( listenerclient, groupname, channelname )
|
|
43
|
+
.then(
|
|
44
|
+
() => listenForMessageForDataRequest( listenerclient, groupname, channelname, consumername, callback )
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const getMessagedataFromResult = ( results:any ) => {
|
|
49
|
+
if( !results.length ) throw('no-messagedata');
|
|
50
|
+
|
|
51
|
+
const result = results[0],
|
|
52
|
+
messages = result[1]
|
|
53
|
+
|
|
54
|
+
if( !messages.length ) throw('no-messagedata');
|
|
55
|
+
const message = messages[0],
|
|
56
|
+
id = message[0],
|
|
57
|
+
keysandvalues = message[1] as string[]
|
|
58
|
+
|
|
59
|
+
let messagedata:RedisMessage = {};
|
|
60
|
+
|
|
61
|
+
keysandvalues.forEach( (key, n ) => {
|
|
62
|
+
if( !( n == 0 || n % 2 == 0 ) ) return;
|
|
63
|
+
messagedata[key] = keysandvalues[n+1];
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return { messagedata, id}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const listenForMessageForDataRequest = (
|
|
70
|
+
listenerclient:Redis, groupname:string, channelname:string, consumername:string, callback:Function
|
|
71
|
+
) => {
|
|
72
|
+
|
|
73
|
+
let streammsgid = '';
|
|
74
|
+
let messageid = '';
|
|
75
|
+
// block client while listening for a message
|
|
76
|
+
listenerclient.xreadgroup('GROUP', groupname, consumername, 'COUNT', 1, 'BLOCK', 0, 'STREAMS', channelname, '>')
|
|
77
|
+
.then( (results) =>
|
|
78
|
+
getMessagedataFromResult( results )
|
|
79
|
+
)
|
|
80
|
+
.then(({messagedata,id}) => {
|
|
81
|
+
// messageid should have been set in getters/requestAndWaitForKey
|
|
82
|
+
if( 'messageid' in messagedata ) messageid = messagedata.id;
|
|
83
|
+
|
|
84
|
+
//stream id from redis
|
|
85
|
+
streammsgid = id;
|
|
86
|
+
return messagedata
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
.then( (messagedata) =>
|
|
90
|
+
callback( messagedata, streammsgid )
|
|
91
|
+
)
|
|
92
|
+
.then(
|
|
93
|
+
( result:any ) => publishMessageResponse( listenerclient, messageid, result != null ? result : '' )
|
|
94
|
+
)
|
|
95
|
+
.finally( () =>
|
|
96
|
+
{
|
|
97
|
+
listenerclient.xack( channelname, groupname, streammsgid ).then( () => {
|
|
98
|
+
console.log( streammsgid + ' acknowledged')
|
|
99
|
+
})
|
|
100
|
+
listenForMessageForDataRequest( listenerclient, groupname, channelname, consumername, callback );
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
34
107
|
const listenForMessage = ( client:Redis, groupname:string, channelname:string, consumername:string, callback:Function, lastId = "$" ) => {
|
|
35
108
|
console.log( `listening to ${channelname} as ${consumername}`)
|
|
36
109
|
client.xreadgroup('GROUP', groupname, consumername, 'COUNT', 1, 'BLOCK', 0, 'STREAMS', channelname, '>')
|
|
@@ -81,4 +154,4 @@ const listenForMessage = ( client:Redis, groupname:string, channelname:string, c
|
|
|
81
154
|
})
|
|
82
155
|
}
|
|
83
156
|
|
|
84
|
-
export { listenToStream, RedisMessage, sendMessageToStream, publishMessageResponse,
|
|
157
|
+
export { listenToStream, RedisMessage, sendMessageToStream, publishMessageResponse, getOrRequestKey, dataRequester, subscribeToMessageResponse, requestAndWaitForList }
|
package/memdb.ts
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "woonplan-packages-redishelper",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.55",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -15,9 +15,12 @@
|
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@types/ioredis": "^4.28.4",
|
|
17
17
|
"@types/node": "^16.11.13",
|
|
18
|
+
"@types/uuid": "^8.3.4",
|
|
18
19
|
"typescript": "^4.2.3"
|
|
19
20
|
},
|
|
20
21
|
"dependencies": {
|
|
21
|
-
"@types/ioredis": "^4.28.5"
|
|
22
|
+
"@types/ioredis": "^4.28.5",
|
|
23
|
+
"ioredis": "^4.28.2",
|
|
24
|
+
"uuid": "^8.3.2"
|
|
22
25
|
}
|
|
23
26
|
}
|
package/setters.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { RedisMessage } from "./types"
|
|
|
4
4
|
import { getMessageReponseKey, redisMessageToArrayOfKeysAndValues, reduceArraysToArray } from "./utils"
|
|
5
5
|
|
|
6
6
|
const publishMessageResponse = ( client:Redis, messageid:string, message:string ) => {
|
|
7
|
-
console.log( `publishing to ${messageid} at ${new Date().
|
|
7
|
+
console.log( `publishing to ${messageid} at ${new Date().toISOString()}` )
|
|
8
8
|
return client.publish( getMessageReponseKey( messageid ), message )
|
|
9
9
|
}
|
|
10
10
|
|
package/types.ts
CHANGED
package/utils.ts
CHANGED
|
@@ -4,5 +4,7 @@ const messagePrefix:string = "messageresponse";
|
|
|
4
4
|
const getMessageReponseKey = ( messageid:string ) => messagePrefix + messageid
|
|
5
5
|
const reduceArraysToArray = ( toArray:any[], fromArray:[] ) => toArray.concat( fromArray )
|
|
6
6
|
const redisMessageToArrayOfKeysAndValues = ( message:RedisMessage ):any[] => Object.keys(message).map((key) => [ key, message[key]]);
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const capitalizeFirstLetter = (string:string) => string.charAt(0).toUpperCase() + string.slice(1)
|
|
8
|
+
const getKeyRequestedChannelName = ( service:string ) => `keyRequestedFrom${capitalizeFirstLetter(service)}Service`
|
|
9
|
+
const getListRequestedChannelName = ( service:string ) => `listRequestedFrom${capitalizeFirstLetter(service)}Service`
|
|
10
|
+
export { getMessageReponseKey, redisMessageToArrayOfKeysAndValues, reduceArraysToArray, getKeyRequestedChannelName, getListRequestedChannelName };
|