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/.config/configstore/update-notifier-npm.json +1 -1
- package/debug/Harness.js +1 -1
- package/dist/orator.js +108 -59
- package/dist/orator.min.js +17 -16
- package/dist/orator.min.js.map +1 -1
- package/package.json +5 -4
- package/source/Orator-ServiceServer-IPC.js +35 -2
- package/source/Orator.js +2 -0
- package/test/Orator_basic_tests.js +112 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orator",
|
|
3
|
-
"version": "3.0.
|
|
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": "
|
|
66
|
+
"fable": "^3.0.7",
|
|
66
67
|
"find-my-way": "^7.5.0",
|
|
67
|
-
"orator-serviceserver": "^1.0.
|
|
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
|
@@ -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
|
|
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
|
-
|
|
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
|
}
|