orator 3.0.3 → 3.0.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orator",
3
- "version": "3.0.3",
3
+ "version": "3.0.5",
4
4
  "description": "Unopinionated restful web API server container",
5
5
  "main": "source/Orator.js",
6
6
  "scripts": {
@@ -58,12 +58,13 @@
58
58
  "mocha": "10.2.0",
59
59
  "nyc": "^15.1.0",
60
60
  "vinyl-buffer": "^1.0.1",
61
- "vinyl-source-stream": "^2.0.0"
61
+ "vinyl-source-stream": "^2.0.0",
62
+ "orator-serviceserver-restify": "^1.0.1"
62
63
  },
63
64
  "dependencies": {
64
65
  "async": "^3.2.4",
65
- "fable": "~3.0.3",
66
+ "fable": "^3.0.7",
66
67
  "find-my-way": "^7.5.0",
67
- "orator-serviceserver": "^1.0.1"
68
+ "orator-serviceserver": "^1.0.2"
68
69
  }
69
70
  }
@@ -28,6 +28,28 @@ class OratorServiceServerIPC extends libOratorServiceServerBase
28
28
  this.postBehaviorFunctions = [];
29
29
  }
30
30
 
31
+ use(fHandlerFunction)
32
+ {
33
+ if (!super.use(fHandlerFunction))
34
+ {
35
+ this.log.error(`IPC provider failed to map USE handler function!`);
36
+ return false;
37
+ }
38
+
39
+ this.preBehaviorFunctions.push(fHandlerFunction);
40
+ }
41
+
42
+ addPostBehaviorFunction(fHandlerFunction)
43
+ {
44
+ if (!super.use(fHandlerFunction))
45
+ {
46
+ this.log.error(`IPC provider failed to map USE handler function!`);
47
+ return false;
48
+ }
49
+
50
+ this.preBehaviorFunctions.push(fHandlerFunction);
51
+ }
52
+
31
53
  executePreBehaviorFunctions(pRequest, pResponse, fNext)
32
54
  {
33
55
  libAsyncEachOfSeries(this.preBehaviorFunctions,
@@ -45,6 +67,17 @@ class OratorServiceServerIPC extends libOratorServiceServerBase
45
67
  });
46
68
  }
47
69
 
70
+ addPostBehaviorFunction(fHandlerFunction)
71
+ {
72
+ if (!super.use(fHandlerFunction))
73
+ {
74
+ this.log.error(`IPC provider failed to map USE handler function!`);
75
+ return false;
76
+ }
77
+
78
+ this.preBehaviorFunctions.push(fHandlerFunction);
79
+ }
80
+
48
81
  executePostBehaviorFunctions(pRequest, pResponse, fNext)
49
82
  {
50
83
  libAsyncEachOfSeries(this.postBehaviorFunctions,
@@ -181,7 +214,7 @@ class OratorServiceServerIPC extends libOratorServiceServerBase
181
214
  invoke(pMethod, pRoute, pData, fCallback)
182
215
  {
183
216
  // If the data is skipped and a callback is parameter 3, do the right thing
184
- let tmpCallback = (typeof(fCallback) == 'function') ? fCallback :
217
+ let tmpCallback = (typeof(fCallback) == 'function') ? fCallback :
185
218
  (typeof(pData) == 'function') ? pData :
186
219
  // This is here in case the developer passed no callback and just wants to fire and forget the IPC call which might not be async safe
187
220
  ()=>{};
@@ -207,7 +240,7 @@ class OratorServiceServerIPC extends libOratorServiceServerBase
207
240
  this.log.error(`IPC Request Error Request GUID [${tmpRequest.guid}] handling route [${pRoute}]: ${pError}`, {Error: pError, Route: pRoute, Data: pData});
208
241
  }
209
242
 
210
- // by default, send data back through
243
+ // by default, send data back through
211
244
  return tmpCallback(pError, tmpSynthesizedResponseData.responseData, tmpSynthesizedResponseData, pResults);
212
245
  });
213
246
  }
package/source/Orator.js CHANGED
@@ -88,6 +88,8 @@ class Orator
88
88
  {
89
89
  this.log.warn(`Orator attempting to initialize a service server after initialization has already completed.`)
90
90
  }
91
+
92
+ return tmpNext()
91
93
  }
92
94
 
93
95
  _startServiceListener(fNext)
@@ -13,6 +13,8 @@ const Expect = Chai.expect;
13
13
  const Assert = Chai.assert;
14
14
 
15
15
  //const libSuperTest = require('supertest');
16
+ const libFable = require('fable');
17
+ const _Fable = new libFable({Product:'Orator-BasicTests-Backplane'});
16
18
 
17
19
  const _MockSettings = (
18
20
  {
@@ -53,7 +55,9 @@ suite
53
55
  // Start the service server
54
56
  tmpOrator.initializeServiceServer();
55
57
  // Start the service
58
+ Expect(tmpOrator.serviceServer.Active).to.equal(false);
56
59
  tmpOrator.startService(fDone);
60
+ Expect(tmpOrator.serviceServer.Active).to.equal(true);
57
61
  }
58
62
  );
59
63
 
@@ -75,7 +79,7 @@ suite
75
79
  {
76
80
  // Send back the request parameters
77
81
  pResponse.send(pRequest.params);
78
- tmpOrator.fable.log.info(`sent ${pRequest.params}`);
82
+ tmpOrator.fable.log.info(`Endpoint sent parameters object:`,pRequest.params);
79
83
  return fNext();
80
84
  }
81
85
  );
@@ -84,11 +88,117 @@ suite
84
88
  tmpOrator.invoke('GET', tmpURI, null,
85
89
  (pError, pResponseData) =>
86
90
  {
87
- tmpOrator.log.info(`Response to [${tmpURI}] came back from IPC resulting in [${pResponseData}]!`)
91
+ let tmpResponseObject = JSON.parse(pResponseData);
92
+ Expect(tmpResponseObject).to.have.a.property('hash');
93
+ Expect(tmpResponseObject.hash).to.equal('SomeHash');
94
+ tmpOrator.log.info(`Response to [${tmpURI}] came back from IPC resulting in [${pResponseData}] which is type ${typeof(pResponseData)}!`);
88
95
  return fDone();
89
96
  });
90
97
  }
91
98
  );
99
+
100
+ test
101
+ (
102
+ 'ipc should be able to process any number of handler additions with the use function',
103
+ (fDone) =>
104
+ {
105
+ let tmpOrator = new libOrator();
106
+ // Initialize the service server
107
+ tmpOrator.initializeServiceServer();
108
+ // Start the service
109
+ tmpOrator.startService();
110
+
111
+ tmpOrator.serviceServer.get
112
+ (
113
+ '/MagicEndpoint/:MagicWords',
114
+ (pRequest, pResponse, fNext) =>
115
+ {
116
+ let tmpResponseObject = (
117
+ {
118
+ MagicWords: pRequest.params.MagicWords,
119
+ MagicIngredients: pRequest.MagicIngredients
120
+ });
121
+ pResponse.send(tmpResponseObject);
122
+ return fNext();
123
+ }
124
+ );
125
+
126
+ _Fable.Utility.waterfall([
127
+ (fStageComplete) =>
128
+ {
129
+ let tmpURI = `/MagicEndpoint/BippityBoppityBoo`;
130
+ tmpOrator.invoke('GET', tmpURI, null,
131
+ (pError, pResponseData) =>
132
+ {
133
+ let tmpResponseObject = JSON.parse(pResponseData);
134
+ Expect(tmpResponseObject).to.have.a.property('MagicWords');
135
+ Expect(tmpResponseObject.MagicWords).to.equal('BippityBoppityBoo');
136
+ Expect(tmpResponseObject).to.not.have.a.property('MagicIngredients');
137
+ //Expect(tmpResponseObject.MagicIngredients).to.be('undefined');
138
+ tmpOrator.log.info(`Response to [${tmpURI}] came back from IPC resulting in [${pResponseData}] which is type ${typeof(pResponseData)}!`);
139
+ return fStageComplete();
140
+ });
141
+ },
142
+ (fStageComplete) =>
143
+ {
144
+ // Add a use parameter that decorates the ingredients
145
+ tmpOrator.serviceServer.use(
146
+ (pRequest, pResponse, fNext) =>
147
+ {
148
+ pRequest.MagicIngredients = [];
149
+ return fNext();
150
+ });
151
+ return fStageComplete();
152
+ },
153
+ (fStageComplete) =>
154
+ {
155
+ let tmpURI = `/MagicEndpoint/BippityBoppityBoo`;
156
+ tmpOrator.invoke('GET', tmpURI, null,
157
+ (pError, pResponseData) =>
158
+ {
159
+ let tmpResponseObject = JSON.parse(pResponseData);
160
+ Expect(tmpResponseObject).to.have.a.property('MagicWords');
161
+ Expect(tmpResponseObject.MagicWords).to.equal('BippityBoppityBoo');
162
+ Expect(tmpResponseObject).to.have.a.property('MagicIngredients');
163
+ Expect(tmpResponseObject.MagicIngredients).to.be.an('array');
164
+ tmpOrator.log.info(`Response to [${tmpURI}] came back from IPC resulting in [${pResponseData}] which is type ${typeof(pResponseData)}!`);
165
+ return fStageComplete();
166
+ });
167
+ },
168
+ (fStageComplete) =>
169
+ {
170
+ // Add a use parameter that decorates the ingredients
171
+ tmpOrator.serviceServer.use(
172
+ (pRequest, pResponse, fNext) =>
173
+ {
174
+ pRequest.MagicIngredients.push('Magic Outcomes');
175
+ return fNext();
176
+ });
177
+ return fStageComplete();
178
+ },
179
+ (fStageComplete) =>
180
+ {
181
+ let tmpURI = `/MagicEndpoint/BippityBoppityBoo`;
182
+ tmpOrator.invoke('GET', tmpURI, null,
183
+ (pError, pResponseData) =>
184
+ {
185
+ let tmpResponseObject = JSON.parse(pResponseData);
186
+ Expect(tmpResponseObject).to.have.a.property('MagicWords');
187
+ Expect(tmpResponseObject.MagicWords).to.equal('BippityBoppityBoo');
188
+ Expect(tmpResponseObject).to.have.a.property('MagicIngredients');
189
+ Expect(tmpResponseObject.MagicIngredients).to.be.an('array');
190
+ Expect(tmpResponseObject.MagicIngredients[0]).to.equal('Magic Outcomes');
191
+ tmpOrator.log.info(`Response to [${tmpURI}] came back from IPC resulting in [${pResponseData}] which is type ${typeof(pResponseData)}!`);
192
+ return fStageComplete();
193
+ });
194
+ }
195
+ ],
196
+ (pError) =>
197
+ {
198
+ return fDone();
199
+ })
200
+ }
201
+ );
92
202
  }
93
203
  );
94
204
  }