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 CHANGED
@@ -1,7 +1,6 @@
1
1
  import { Redis } from "ioredis";
2
- import { Struct } from "./types";
3
- declare const getOrRequestKey: (client: Redis, key: string, service: string) => Promise<unknown>;
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, requestAndWaitForData };
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.requestAndWaitForData = exports.subscribeToMessageResponse = exports.requestAndWaitForList = exports.getOrRequestKey = void 0;
3
+ exports.subscribeToMessageResponse = exports.requestAndWaitForList = exports.getOrRequestKey = void 0;
4
4
  var utils_1 = require("./utils");
5
- var getOrRequestKey = function (client, key, service) { return new Promise(function (resolve, reject) {
6
- client.get(key)
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(client, key, service);
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 (client, key, service) { return new Promise(function (resolve) {
22
- service = capitalizeFirstLetter(service);
23
- var createdMessageId = '';
24
- client.xadd("keyRequestedFrom".concat(service, "Service"), '*', 'key', key)
25
- .then(function (messageid) {
26
- createdMessageId = messageid;
27
- // create a key to listen to, the key contains the message we just created;
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
- client.once("message", function (channel, message) {
34
- console.log("unsubscribing from ".concat(channel));
35
- client.unsubscribe().then(function () {
36
- if (message.length)
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
- client.unsubscribe().then(function () {
69
- if (message.length)
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 (client.status != "end") {
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
- }, 250);
83
- }).catch(function (e) {
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("listRequestedFrom".concat(service, "Service"), '*', 'listname', listname, 'listsubject', listsubject, 'props', JSON.stringify(props))
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, requestAndWaitForData } from "./getters";
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
- export { listenToStream, RedisMessage, sendMessageToStream, publishMessageResponse, requestAndWaitForData, getOrRequestKey, subscribeToMessageResponse, requestAndWaitForList };
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.getOrRequestKey = exports.requestAndWaitForData = exports.publishMessageResponse = exports.sendMessageToStream = exports.listenToStream = void 0;
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
- Object.defineProperty(exports, "requestAndWaitForData", { enumerable: true, get: function () { return getters_1.requestAndWaitForData; } });
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));
@@ -0,0 +1,4 @@
1
+ import { RedisConfig } from "./types";
2
+ import { Redis } from "ioredis";
3
+ declare const getRedisClient: (config: RedisConfig) => Redis;
4
+ export { getRedisClient };
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().toUTCString()));
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
@@ -4,3 +4,6 @@ export interface RedisMessage {
4
4
  export interface Struct {
5
5
  [index: string]: any;
6
6
  }
7
+ export interface RedisConfig {
8
+ REDISURL: string | number | undefined;
9
+ }
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
- export { getMessageReponseKey, redisMessageToArrayOfKeysAndValues, reduceArraysToArray };
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 { Struct } from "./types"
4
- const getOrRequestKey = ( client:Redis, key:string, service:string ) => new Promise((resolve, reject) => {
5
- client.get( key )
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( client, key, service )
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
- client:Redis,
33
+ getterclient:Redis,
34
+ config:RedisConfig,
27
35
  key:string,
28
36
  service:string,
29
- ) => new Promise((resolve) => {
30
- service = capitalizeFirstLetter( service );
31
-
32
- let createdMessageId = '';
33
-
34
- client.xadd( `keyRequestedFrom${service}Service`, '*', 'key', key )
35
- .then(
36
- (messageid:string) => {
37
- createdMessageId = messageid;
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
- client.once( "message", ( channel, message ) => {
50
- console.log( `unsubscribing from ${channel}` )
48
+ listenerclient.once( "message", ( channel, message ) => {
49
+ if( message.length ) resolve( message );
50
+ else resolve( null )
51
51
 
52
- client.unsubscribe().then(
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( client.status != "end" ){
60
+ if( listenerclient.status != "end" ){
68
61
  console.log( `sub timedout`)
69
- client.unsubscribe();
70
62
  resolve( null )
71
- }
72
-
73
- }, 250 )
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
- const requestAndWaitForData = (
85
- client:Redis,
86
- data:Struct,
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( `listRequestedFrom${service}Service`, '*', 'listname', listname, 'listsubject', listsubject, 'props', JSON.stringify( props ))
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, requestAndWaitForData }
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, requestAndWaitForData } from "./getters"
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, requestAndWaitForData, getOrRequestKey, subscribeToMessageResponse, requestAndWaitForList }
157
+ export { listenToStream, RedisMessage, sendMessageToStream, publishMessageResponse, getOrRequestKey, dataRequester, subscribeToMessageResponse, requestAndWaitForList }
package/memdb.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { RedisConfig } from "./types"
2
+ import { Redis } from "ioredis"
3
+ const IORedis = require("ioredis");
4
+
5
+ const getRedisClient = ( config:RedisConfig ):Redis => new IORedis( config.REDISURL );
6
+
7
+ export { getRedisClient }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "woonplan-packages-redishelper",
3
- "version": "1.0.50",
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().toUTCString()}` )
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
@@ -5,3 +5,6 @@ export interface Struct{
5
5
  [index: string]: any;
6
6
  }
7
7
 
8
+ export interface RedisConfig{
9
+ REDISURL: string | number | undefined;
10
+ }
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
- export { getMessageReponseKey, redisMessageToArrayOfKeysAndValues, reduceArraysToArray };
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 };