orator 6.0.0 → 6.0.2
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/CONTRIBUTING.md +50 -0
- package/README.md +11 -5
- package/dist/indoctrinate_content_staging/Indoctrinate-Catalog-AppData.json +2364 -0
- package/docs/css/docuserve.css +73 -0
- package/docs/index.html +1 -1
- package/docs/retold-catalog.json +85 -0
- package/package.json +6 -6
|
@@ -0,0 +1,2364 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SourceContentCatalog": {
|
|
3
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/code-server/config.yaml": {
|
|
4
|
+
"UUID": "65756a02-192c-47f8-ae9a-a888e8a58c75",
|
|
5
|
+
"Type": "URI",
|
|
6
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/code-server/config.yaml",
|
|
7
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/code-server/config.yaml",
|
|
8
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/.config/code-server",
|
|
9
|
+
"Name": "config.yaml",
|
|
10
|
+
"MimeType": "text/yaml",
|
|
11
|
+
"Nature": "text",
|
|
12
|
+
"Format": "yaml",
|
|
13
|
+
"Schema": "Default",
|
|
14
|
+
"Content": false,
|
|
15
|
+
"Labels": [
|
|
16
|
+
"__LABELSET_TYPE",
|
|
17
|
+
"FILE",
|
|
18
|
+
"__LABELSET_ADDRESS",
|
|
19
|
+
".config",
|
|
20
|
+
"code-server",
|
|
21
|
+
"__LABELSET_NAME",
|
|
22
|
+
"config",
|
|
23
|
+
"__LABELSET_EXTENSION",
|
|
24
|
+
".yaml",
|
|
25
|
+
"__LABELSET_FILENAME",
|
|
26
|
+
"config.yaml",
|
|
27
|
+
"__LABELSET_FULLPATH",
|
|
28
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/code-server/config.yaml",
|
|
29
|
+
"__LABELSET_FORMAT",
|
|
30
|
+
"yaml",
|
|
31
|
+
"Default"
|
|
32
|
+
],
|
|
33
|
+
"FSTAT": {
|
|
34
|
+
"Size": 70,
|
|
35
|
+
"Created": "2024-08-16T15:15:48.866Z",
|
|
36
|
+
"Modified": "2024-08-16T15:15:48.866Z",
|
|
37
|
+
"Accessed": "2024-08-16T15:15:52.535Z",
|
|
38
|
+
"Mode": 33188
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm-check-updates.json": {
|
|
42
|
+
"UUID": "2137132f-3f32-406c-a8ca-7261fa27c4be",
|
|
43
|
+
"Type": "URI",
|
|
44
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm-check-updates.json",
|
|
45
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm-check-updates.json",
|
|
46
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore",
|
|
47
|
+
"Name": "update-notifier-npm-check-updates.json",
|
|
48
|
+
"MimeType": "application/json",
|
|
49
|
+
"Nature": "application",
|
|
50
|
+
"Format": "json",
|
|
51
|
+
"Schema": "Default",
|
|
52
|
+
"Content": false,
|
|
53
|
+
"Labels": [
|
|
54
|
+
"__LABELSET_TYPE",
|
|
55
|
+
"FILE",
|
|
56
|
+
"__LABELSET_ADDRESS",
|
|
57
|
+
".config",
|
|
58
|
+
"configstore",
|
|
59
|
+
"__LABELSET_NAME",
|
|
60
|
+
"update",
|
|
61
|
+
"notifier",
|
|
62
|
+
"npm",
|
|
63
|
+
"check",
|
|
64
|
+
"updates",
|
|
65
|
+
"__LABELSET_EXTENSION",
|
|
66
|
+
".json",
|
|
67
|
+
"__LABELSET_FILENAME",
|
|
68
|
+
"update-notifier-npm-check-updates.json",
|
|
69
|
+
"__LABELSET_FULLPATH",
|
|
70
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm-check-updates.json",
|
|
71
|
+
"__LABELSET_FORMAT",
|
|
72
|
+
"json",
|
|
73
|
+
"Default"
|
|
74
|
+
],
|
|
75
|
+
"FSTAT": {
|
|
76
|
+
"Size": 55,
|
|
77
|
+
"Created": "2024-08-16T15:15:48.866Z",
|
|
78
|
+
"Modified": "2024-08-16T15:15:48.867Z",
|
|
79
|
+
"Accessed": "2024-08-16T15:15:52.535Z",
|
|
80
|
+
"Mode": 33188
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm.json": {
|
|
84
|
+
"UUID": "611d5e34-1e4a-4942-bccd-1544f960e97d",
|
|
85
|
+
"Type": "URI",
|
|
86
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm.json",
|
|
87
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm.json",
|
|
88
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore",
|
|
89
|
+
"Name": "update-notifier-npm.json",
|
|
90
|
+
"MimeType": "application/json",
|
|
91
|
+
"Nature": "application",
|
|
92
|
+
"Format": "json",
|
|
93
|
+
"Schema": "Default",
|
|
94
|
+
"Content": false,
|
|
95
|
+
"Labels": [
|
|
96
|
+
"__LABELSET_TYPE",
|
|
97
|
+
"FILE",
|
|
98
|
+
"__LABELSET_ADDRESS",
|
|
99
|
+
".config",
|
|
100
|
+
"configstore",
|
|
101
|
+
"__LABELSET_NAME",
|
|
102
|
+
"update",
|
|
103
|
+
"notifier",
|
|
104
|
+
"npm",
|
|
105
|
+
"__LABELSET_EXTENSION",
|
|
106
|
+
".json",
|
|
107
|
+
"__LABELSET_FILENAME",
|
|
108
|
+
"update-notifier-npm.json",
|
|
109
|
+
"__LABELSET_FULLPATH",
|
|
110
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.config/configstore/update-notifier-npm.json",
|
|
111
|
+
"__LABELSET_FORMAT",
|
|
112
|
+
"json",
|
|
113
|
+
"Default"
|
|
114
|
+
],
|
|
115
|
+
"FSTAT": {
|
|
116
|
+
"Size": 55,
|
|
117
|
+
"Created": "2024-08-16T15:15:48.867Z",
|
|
118
|
+
"Modified": "2024-08-16T15:15:48.867Z",
|
|
119
|
+
"Accessed": "2024-08-16T15:15:52.535Z",
|
|
120
|
+
"Mode": 33188
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.gitignore": {
|
|
124
|
+
"UUID": "6562f757-f835-43c2-8583-8eb80371e7d5",
|
|
125
|
+
"Type": "URI",
|
|
126
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.gitignore",
|
|
127
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.gitignore",
|
|
128
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
129
|
+
"Name": ".gitignore",
|
|
130
|
+
"MimeType": null,
|
|
131
|
+
"Nature": "UNKNOWN",
|
|
132
|
+
"Format": "UNKNOWN",
|
|
133
|
+
"Schema": "Default",
|
|
134
|
+
"Content": false,
|
|
135
|
+
"Labels": [
|
|
136
|
+
"__LABELSET_TYPE",
|
|
137
|
+
"FILE",
|
|
138
|
+
"__LABELSET_ADDRESS",
|
|
139
|
+
"__LABELSET_NAME",
|
|
140
|
+
"__LABELSET_EXTENSION",
|
|
141
|
+
"",
|
|
142
|
+
"__LABELSET_FILENAME",
|
|
143
|
+
".gitignore",
|
|
144
|
+
"__LABELSET_FULLPATH",
|
|
145
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.gitignore",
|
|
146
|
+
"__LABELSET_FORMAT",
|
|
147
|
+
"UNKNOWN",
|
|
148
|
+
"Default"
|
|
149
|
+
],
|
|
150
|
+
"FSTAT": {
|
|
151
|
+
"Size": 719,
|
|
152
|
+
"Created": "2024-08-16T15:15:48.867Z",
|
|
153
|
+
"Modified": "2024-08-16T15:15:48.867Z",
|
|
154
|
+
"Accessed": "2024-08-16T15:15:52.456Z",
|
|
155
|
+
"Mode": 33188
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.vscode/launch.json": {
|
|
159
|
+
"UUID": "5d3fb326-8f91-4101-a861-07ff0818d8ac",
|
|
160
|
+
"Type": "URI",
|
|
161
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.vscode/launch.json",
|
|
162
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.vscode/launch.json",
|
|
163
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/.vscode",
|
|
164
|
+
"Name": "launch.json",
|
|
165
|
+
"MimeType": "application/json",
|
|
166
|
+
"Nature": "application",
|
|
167
|
+
"Format": "json",
|
|
168
|
+
"Schema": "Default",
|
|
169
|
+
"Content": false,
|
|
170
|
+
"Labels": [
|
|
171
|
+
"__LABELSET_TYPE",
|
|
172
|
+
"FILE",
|
|
173
|
+
"__LABELSET_ADDRESS",
|
|
174
|
+
".vscode",
|
|
175
|
+
"__LABELSET_NAME",
|
|
176
|
+
"launch",
|
|
177
|
+
"__LABELSET_EXTENSION",
|
|
178
|
+
".json",
|
|
179
|
+
"__LABELSET_FILENAME",
|
|
180
|
+
"launch.json",
|
|
181
|
+
"__LABELSET_FULLPATH",
|
|
182
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/.vscode/launch.json",
|
|
183
|
+
"__LABELSET_FORMAT",
|
|
184
|
+
"json",
|
|
185
|
+
"Default"
|
|
186
|
+
],
|
|
187
|
+
"FSTAT": {
|
|
188
|
+
"Size": 1418,
|
|
189
|
+
"Created": "2024-08-16T15:15:48.867Z",
|
|
190
|
+
"Modified": "2024-08-16T19:27:56.265Z",
|
|
191
|
+
"Accessed": "2024-08-16T19:44:30.566Z",
|
|
192
|
+
"Mode": 33188
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CHANGELOG.md": {
|
|
196
|
+
"UUID": "e75cec14-f243-4bc4-bacc-62a8f06a2255",
|
|
197
|
+
"Type": "URI",
|
|
198
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CHANGELOG.md",
|
|
199
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CHANGELOG.md",
|
|
200
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
201
|
+
"Name": "CHANGELOG.md",
|
|
202
|
+
"MimeType": "text/markdown",
|
|
203
|
+
"Nature": "text",
|
|
204
|
+
"Format": "markdown",
|
|
205
|
+
"Schema": "Default",
|
|
206
|
+
"Content": "# Change Log\n--\n#### 2015-03-06: Steven Velozo\n* Initial Code Dump\n\n#### 2015-03-09: Steven Velozo\n* Test coverage, worked out kinks\n\n#### 2015-03-25\n* Added matrix for enabling Restify Native Modules\n* Changed the nodegrind module to optional so we can run in Windows (no dtrace/c++ there)\n\n#### 2015-03-27\n* Added a property for accessing Restify Native Modules\n* Added the FullResponse restify parser\n\n#### 2015-12-12\n* Added a simple mechanism for adding static routes\n* Added static formatter configuration for legacy ie and CSS\n* Changed web server to be lazily loaded the first time the webServer object is accessed, so raw settings can be twiddled outside the config file\n",
|
|
207
|
+
"Labels": [
|
|
208
|
+
"__LABELSET_TYPE",
|
|
209
|
+
"FILE",
|
|
210
|
+
"__LABELSET_ADDRESS",
|
|
211
|
+
"__LABELSET_NAME",
|
|
212
|
+
"CHANGELOG",
|
|
213
|
+
"__LABELSET_EXTENSION",
|
|
214
|
+
".md",
|
|
215
|
+
"__LABELSET_FILENAME",
|
|
216
|
+
"CHANGELOG.md",
|
|
217
|
+
"__LABELSET_FULLPATH",
|
|
218
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CHANGELOG.md",
|
|
219
|
+
"__LABELSET_FORMAT",
|
|
220
|
+
"markdown",
|
|
221
|
+
"Default"
|
|
222
|
+
],
|
|
223
|
+
"FSTAT": {
|
|
224
|
+
"Size": 680,
|
|
225
|
+
"Created": "2024-01-14T20:54:20.324Z",
|
|
226
|
+
"Modified": "2024-01-14T20:54:20.324Z",
|
|
227
|
+
"Accessed": "2024-01-14T20:54:20.348Z",
|
|
228
|
+
"Mode": 33188
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CONTRIBUTING.md": {
|
|
232
|
+
"UUID": "57a512af-cfee-41ba-991a-b42b85ab44ed",
|
|
233
|
+
"Type": "URI",
|
|
234
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CONTRIBUTING.md",
|
|
235
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CONTRIBUTING.md",
|
|
236
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
237
|
+
"Name": "CONTRIBUTING.md",
|
|
238
|
+
"MimeType": "text/markdown",
|
|
239
|
+
"Nature": "text",
|
|
240
|
+
"Format": "markdown",
|
|
241
|
+
"Schema": "Default",
|
|
242
|
+
"Content": "# Contributing to Retold\n\nWe welcome contributions to Retold and its modules. This guide covers the expectations and process for contributing.\n\n## Code of Conduct\n\nThe Retold community values **empathy**, **equity**, **kindness**, and **thoughtfulness**. We expect all participants to treat each other with respect, assume good intent, and engage constructively. These values apply to all interactions: pull requests, issues, discussions, and code review.\n\n## How to Contribute\n\n### Pull Requests\n\nPull requests are the preferred method for contributing changes. To submit one:\n\n1. Fork the module repository you want to change\n2. Create a branch for your work\n3. Make your changes, following the code style of the module you are editing\n4. Ensure your changes have test coverage (see below)\n5. Open a pull request against the module's main branch\n\n**Submitting a pull request does not guarantee it will be accepted.** Maintainers review contributions for fit, quality, and alignment with the project's direction. A PR may be declined, or you may be asked to revise it. This is normal and not a reflection on the quality of your effort.\n\n### Reporting Issues\n\nIf you find a bug or have a feature suggestion, open an issue on the relevant module's repository. Include enough detail to reproduce the problem or understand the proposal.\n\n## Test Coverage\n\nEvery commit must include test coverage for the changes it introduces. Retold modules use Mocha in TDD style. Before submitting:\n\n- **Write tests** for any new functionality or bug fixes\n- **Run the existing test suite** with `npm test` and confirm all tests pass\n- **Check coverage** with `npm run coverage` if the module supports it\n\nPull requests that break existing tests or lack coverage for new code will not be merged.\n\n## Code Style\n\nFollow the conventions of the module you are working in. The general Retold style is:\n\n- **Tabs** for indentation, never spaces\n- **Plain JavaScript** only (no TypeScript)\n- **Allman-style braces** (opening brace on its own line)\n- **Variable naming:** `pVariable` for parameters, `tmpVariable` for temporaries, `libSomething` for imports\n\nWhen in doubt, match what the surrounding code does.\n\n## Repository Structure\n\nEach module is its own git repository. The [retold](https://github.com/stevenvelozo/retold) repository tracks module organization but does not contain module source code. Direct your pull request to the specific module repository where your change belongs.\n",
|
|
243
|
+
"Labels": [
|
|
244
|
+
"__LABELSET_TYPE",
|
|
245
|
+
"FILE",
|
|
246
|
+
"__LABELSET_ADDRESS",
|
|
247
|
+
"__LABELSET_NAME",
|
|
248
|
+
"CONTRIBUTING",
|
|
249
|
+
"__LABELSET_EXTENSION",
|
|
250
|
+
".md",
|
|
251
|
+
"__LABELSET_FILENAME",
|
|
252
|
+
"CONTRIBUTING.md",
|
|
253
|
+
"__LABELSET_FULLPATH",
|
|
254
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/CONTRIBUTING.md",
|
|
255
|
+
"__LABELSET_FORMAT",
|
|
256
|
+
"markdown",
|
|
257
|
+
"Default"
|
|
258
|
+
],
|
|
259
|
+
"FSTAT": {
|
|
260
|
+
"Size": 2471,
|
|
261
|
+
"Created": "2026-02-17T16:54:22.743Z",
|
|
262
|
+
"Modified": "2026-02-17T16:54:22.744Z",
|
|
263
|
+
"Accessed": "2026-02-17T16:54:23.344Z",
|
|
264
|
+
"Mode": 33188
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/Dockerfile_LUXURYCode": {
|
|
268
|
+
"UUID": "65155647-04a2-4b4b-b435-57ae134323e8",
|
|
269
|
+
"Type": "URI",
|
|
270
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/Dockerfile_LUXURYCode",
|
|
271
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/Dockerfile_LUXURYCode",
|
|
272
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
273
|
+
"Name": "Dockerfile_LUXURYCode",
|
|
274
|
+
"MimeType": null,
|
|
275
|
+
"Nature": "UNKNOWN",
|
|
276
|
+
"Format": "UNKNOWN",
|
|
277
|
+
"Schema": "Default",
|
|
278
|
+
"Content": false,
|
|
279
|
+
"Labels": [
|
|
280
|
+
"__LABELSET_TYPE",
|
|
281
|
+
"FILE",
|
|
282
|
+
"__LABELSET_ADDRESS",
|
|
283
|
+
"__LABELSET_NAME",
|
|
284
|
+
"Dockerfile",
|
|
285
|
+
"LUXURYCode",
|
|
286
|
+
"__LABELSET_EXTENSION",
|
|
287
|
+
"",
|
|
288
|
+
"__LABELSET_FILENAME",
|
|
289
|
+
"Dockerfile_LUXURYCode",
|
|
290
|
+
"__LABELSET_FULLPATH",
|
|
291
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/Dockerfile_LUXURYCode",
|
|
292
|
+
"__LABELSET_FORMAT",
|
|
293
|
+
"UNKNOWN",
|
|
294
|
+
"Default"
|
|
295
|
+
],
|
|
296
|
+
"FSTAT": {
|
|
297
|
+
"Size": 2336,
|
|
298
|
+
"Created": "2024-08-16T15:15:48.867Z",
|
|
299
|
+
"Modified": "2024-08-16T15:15:48.867Z",
|
|
300
|
+
"Accessed": "2024-08-16T15:15:49.016Z",
|
|
301
|
+
"Mode": 33188
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/LICENSE": {
|
|
305
|
+
"UUID": "b67f676d-f098-45ea-9df6-7885dbeec9ed",
|
|
306
|
+
"Type": "URI",
|
|
307
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/LICENSE",
|
|
308
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/LICENSE",
|
|
309
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
310
|
+
"Name": "LICENSE",
|
|
311
|
+
"MimeType": null,
|
|
312
|
+
"Nature": "UNKNOWN",
|
|
313
|
+
"Format": "UNKNOWN",
|
|
314
|
+
"Schema": "Default",
|
|
315
|
+
"Content": false,
|
|
316
|
+
"Labels": [
|
|
317
|
+
"__LABELSET_TYPE",
|
|
318
|
+
"FILE",
|
|
319
|
+
"__LABELSET_ADDRESS",
|
|
320
|
+
"__LABELSET_NAME",
|
|
321
|
+
"LICENSE",
|
|
322
|
+
"__LABELSET_EXTENSION",
|
|
323
|
+
"",
|
|
324
|
+
"__LABELSET_FILENAME",
|
|
325
|
+
"LICENSE",
|
|
326
|
+
"__LABELSET_FULLPATH",
|
|
327
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/LICENSE",
|
|
328
|
+
"__LABELSET_FORMAT",
|
|
329
|
+
"UNKNOWN",
|
|
330
|
+
"Default"
|
|
331
|
+
],
|
|
332
|
+
"FSTAT": {
|
|
333
|
+
"Size": 1081,
|
|
334
|
+
"Created": "2024-01-14T20:54:20.324Z",
|
|
335
|
+
"Modified": "2024-01-14T20:54:20.325Z",
|
|
336
|
+
"Accessed": "2025-02-11T17:53:10.260Z",
|
|
337
|
+
"Mode": 33188
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/README.md": {
|
|
341
|
+
"UUID": "6c6d4664-94be-467b-81b8-c2b9ac9d4d3a",
|
|
342
|
+
"Type": "URI",
|
|
343
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/README.md",
|
|
344
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/README.md",
|
|
345
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
346
|
+
"Name": "README.md",
|
|
347
|
+
"MimeType": "text/markdown",
|
|
348
|
+
"Nature": "text",
|
|
349
|
+
"Format": "markdown",
|
|
350
|
+
"Schema": "Default",
|
|
351
|
+
"Content": "# Orator\n\n> An unopinionated API server abstraction for REST and IPC services\n\nOrator is not an attempt to reinvent the wheel. Nor do we want to make a car with five of them. Orator is a thin abstraction layer over service server implementations (like Restify), providing a consistent interface for building API servers. You can spin up a web server in a single simple line, and configuration is managed through a consistent JSON format -- so as you begin to have 10 or 15 or 5,000 microservices, you don't have a bunch of boilerplate API server code laying around.\n\n## Features\n\n- **Unopinionated Design** - Wraps any service server implementation through a consistent interface\n- **REST and IPC** - Full HTTP server support via Restify, or in-process IPC for testing and microservice composition\n- **Lifecycle Management** - Before/After hooks for initialization and service start phases\n- **Static File Serving** - Built-in static file serving with subdomain-based folder routing\n- **Fable Integration** - First-class service provider in the Fable ecosystem with logging and configuration\n- **Browser & Node.js** - Works in both environments with automatic service server selection\n\n## Quick Start\n\n```javascript\nconst libFable = require('fable');\nconst libOrator = require('orator');\nconst libOratorServiceServerRestify = require('orator-serviceserver-restify');\n\nconst _Fable = new libFable({\n\tProduct: 'MyAPIServer',\n\tProductVersion: '1.0.0',\n\tServicePort: 8080\n});\n\n_Fable.serviceManager.addServiceType('Orator', libOrator);\n_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);\n_Fable.serviceManager.instantiateServiceProvider('Orator');\n_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');\n\n_Fable.Orator.serviceServer.get('/hello/:name',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ greeting: `Hello ${pRequest.params.name}!` });\n\t\treturn fNext();\n\t});\n\n_Fable.Orator.startService(\n\t() =>\n\t{\n\t\tconsole.log('Server is running on port 8080');\n\t});\n```\n\n## Installation\n\n```bash\nnpm install orator\n```\n\n## Configuration\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `Product` | string | `\"Unnamed_Service\"` | Application name identifier |\n| `ProductVersion` | string | `\"0.0.1\"` | Application version string |\n| `ServicePort` | number | `8080` | Port for the service server to listen on |\n| `APIServerPort` | number | - | Legacy alias for ServicePort (automatically migrated) |\n| `RestifyConfiguration` | object | `{}` | Configuration passed to Restify when using the Restify service server |\n\n## Documentation\n\nFull documentation is available in the [`docs`](./docs) folder, or served locally:\n\n```bash\nnpx docsify-cli serve docs\n```\n\n- [Architecture](docs/architecture.md) - Service server abstraction design\n- [Getting Started](docs/getting-started.md) - Step-by-step setup guide\n- [Static File Serving](docs/static-files.md) - Serving files from disk\n- [IPC Server](docs/ipc-server.md) - In-process service invocation\n\n## Related Packages\n\n- [orator-serviceserver-restify](https://github.com/stevenvelozo/orator-serviceserver-restify) - Restify service server implementation\n- [orator-serviceserver-base](https://github.com/stevenvelozo/orator-serviceserver-base) - Abstract service server base class\n- [orator-static-server](https://github.com/stevenvelozo/orator-static-server) - Static file serving\n- [fable](https://github.com/stevenvelozo/fable) - Application services framework\n\n## License\n\nMIT\n\n## Contributing\n\nPull requests are welcome. For details on our code of conduct, contribution process, and testing requirements, see the [Retold Contributing Guide](https://github.com/stevenvelozo/retold/blob/main/docs/contributing.md).\n",
|
|
352
|
+
"Labels": [
|
|
353
|
+
"__LABELSET_TYPE",
|
|
354
|
+
"FILE",
|
|
355
|
+
"__LABELSET_ADDRESS",
|
|
356
|
+
"__LABELSET_NAME",
|
|
357
|
+
"README",
|
|
358
|
+
"__LABELSET_EXTENSION",
|
|
359
|
+
".md",
|
|
360
|
+
"__LABELSET_FILENAME",
|
|
361
|
+
"README.md",
|
|
362
|
+
"__LABELSET_FULLPATH",
|
|
363
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/README.md",
|
|
364
|
+
"__LABELSET_FORMAT",
|
|
365
|
+
"markdown",
|
|
366
|
+
"Default"
|
|
367
|
+
],
|
|
368
|
+
"FSTAT": {
|
|
369
|
+
"Size": 3760,
|
|
370
|
+
"Created": "2026-02-05T22:35:34.909Z",
|
|
371
|
+
"Modified": "2026-02-17T16:56:43.540Z",
|
|
372
|
+
"Accessed": "2026-02-17T16:56:43.949Z",
|
|
373
|
+
"Mode": 33188
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/Harness.js": {
|
|
377
|
+
"UUID": "3d9e05ae-009a-462b-b578-badb3c48a0cd",
|
|
378
|
+
"Type": "URI",
|
|
379
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/Harness.js",
|
|
380
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/Harness.js",
|
|
381
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/debug",
|
|
382
|
+
"Name": "Harness.js",
|
|
383
|
+
"MimeType": "application/javascript",
|
|
384
|
+
"Nature": "application",
|
|
385
|
+
"Format": "javascript",
|
|
386
|
+
"Schema": "Default",
|
|
387
|
+
"Content": false,
|
|
388
|
+
"Labels": [
|
|
389
|
+
"__LABELSET_TYPE",
|
|
390
|
+
"FILE",
|
|
391
|
+
"__LABELSET_ADDRESS",
|
|
392
|
+
"debug",
|
|
393
|
+
"__LABELSET_NAME",
|
|
394
|
+
"Harness",
|
|
395
|
+
"__LABELSET_EXTENSION",
|
|
396
|
+
".js",
|
|
397
|
+
"__LABELSET_FILENAME",
|
|
398
|
+
"Harness.js",
|
|
399
|
+
"__LABELSET_FULLPATH",
|
|
400
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/Harness.js",
|
|
401
|
+
"__LABELSET_FORMAT",
|
|
402
|
+
"javascript",
|
|
403
|
+
"Default"
|
|
404
|
+
],
|
|
405
|
+
"FSTAT": {
|
|
406
|
+
"Size": 1640,
|
|
407
|
+
"Created": "2024-08-16T15:15:48.867Z",
|
|
408
|
+
"Modified": "2024-08-16T18:46:02.347Z",
|
|
409
|
+
"Accessed": "2024-08-16T19:44:30.567Z",
|
|
410
|
+
"Mode": 33188
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package-lock.json": {
|
|
414
|
+
"UUID": "61bb5db0-a300-4d0e-b926-0926eb483b9d",
|
|
415
|
+
"Type": "URI",
|
|
416
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package-lock.json",
|
|
417
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package-lock.json",
|
|
418
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/debug",
|
|
419
|
+
"Name": "package-lock.json",
|
|
420
|
+
"MimeType": "application/json",
|
|
421
|
+
"Nature": "application",
|
|
422
|
+
"Format": "json",
|
|
423
|
+
"Schema": "Default",
|
|
424
|
+
"Content": false,
|
|
425
|
+
"Labels": [
|
|
426
|
+
"__LABELSET_TYPE",
|
|
427
|
+
"FILE",
|
|
428
|
+
"__LABELSET_ADDRESS",
|
|
429
|
+
"debug",
|
|
430
|
+
"__LABELSET_NAME",
|
|
431
|
+
"package",
|
|
432
|
+
"lock",
|
|
433
|
+
"__LABELSET_EXTENSION",
|
|
434
|
+
".json",
|
|
435
|
+
"__LABELSET_FILENAME",
|
|
436
|
+
"package-lock.json",
|
|
437
|
+
"__LABELSET_FULLPATH",
|
|
438
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package-lock.json",
|
|
439
|
+
"__LABELSET_FORMAT",
|
|
440
|
+
"json",
|
|
441
|
+
"Default"
|
|
442
|
+
],
|
|
443
|
+
"FSTAT": {
|
|
444
|
+
"Size": 48569,
|
|
445
|
+
"Created": "2024-08-16T15:18:29.075Z",
|
|
446
|
+
"Modified": "2024-08-16T15:18:29.075Z",
|
|
447
|
+
"Accessed": "2025-11-10T18:07:07.323Z",
|
|
448
|
+
"Mode": 33188
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package.json": {
|
|
452
|
+
"UUID": "82f7d502-4052-43cc-bd40-4f0cd0475f2b",
|
|
453
|
+
"Type": "URI",
|
|
454
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package.json",
|
|
455
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package.json",
|
|
456
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/debug",
|
|
457
|
+
"Name": "package.json",
|
|
458
|
+
"MimeType": "application/json",
|
|
459
|
+
"Nature": "application",
|
|
460
|
+
"Format": "json",
|
|
461
|
+
"Schema": "PackageDotJSON",
|
|
462
|
+
"Content": {
|
|
463
|
+
"name": "orator-debug-server",
|
|
464
|
+
"version": "1.0.0",
|
|
465
|
+
"description": "",
|
|
466
|
+
"main": "Harness.js",
|
|
467
|
+
"scripts": {
|
|
468
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
469
|
+
},
|
|
470
|
+
"author": "",
|
|
471
|
+
"license": "ISC",
|
|
472
|
+
"dependencies": {
|
|
473
|
+
"orator-serviceserver-restify": "^2.0.3"
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
"Labels": [
|
|
477
|
+
"__LABELSET_TYPE",
|
|
478
|
+
"FILE",
|
|
479
|
+
"__LABELSET_ADDRESS",
|
|
480
|
+
"debug",
|
|
481
|
+
"__LABELSET_NAME",
|
|
482
|
+
"package",
|
|
483
|
+
"__LABELSET_EXTENSION",
|
|
484
|
+
".json",
|
|
485
|
+
"__LABELSET_FILENAME",
|
|
486
|
+
"package.json",
|
|
487
|
+
"__LABELSET_FULLPATH",
|
|
488
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/package.json",
|
|
489
|
+
"__LABELSET_FORMAT",
|
|
490
|
+
"json",
|
|
491
|
+
"PackageDotJSON"
|
|
492
|
+
],
|
|
493
|
+
"FSTAT": {
|
|
494
|
+
"Size": 287,
|
|
495
|
+
"Created": "2024-08-16T15:18:07.387Z",
|
|
496
|
+
"Modified": "2024-08-16T15:18:29.059Z",
|
|
497
|
+
"Accessed": "2024-08-16T19:44:30.567Z",
|
|
498
|
+
"Mode": 33188
|
|
499
|
+
}
|
|
500
|
+
},
|
|
501
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.css": {
|
|
502
|
+
"UUID": "6299b940-24b6-47ef-bddd-b014943aca9d",
|
|
503
|
+
"Type": "URI",
|
|
504
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.css",
|
|
505
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.css",
|
|
506
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site",
|
|
507
|
+
"Name": "Test.css",
|
|
508
|
+
"MimeType": "text/css",
|
|
509
|
+
"Nature": "text",
|
|
510
|
+
"Format": "css",
|
|
511
|
+
"Schema": "Default",
|
|
512
|
+
"Content": false,
|
|
513
|
+
"Labels": [
|
|
514
|
+
"__LABELSET_TYPE",
|
|
515
|
+
"FILE",
|
|
516
|
+
"__LABELSET_ADDRESS",
|
|
517
|
+
"debug",
|
|
518
|
+
"site",
|
|
519
|
+
"__LABELSET_NAME",
|
|
520
|
+
"Test",
|
|
521
|
+
"__LABELSET_EXTENSION",
|
|
522
|
+
".css",
|
|
523
|
+
"__LABELSET_FILENAME",
|
|
524
|
+
"Test.css",
|
|
525
|
+
"__LABELSET_FULLPATH",
|
|
526
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.css",
|
|
527
|
+
"__LABELSET_FORMAT",
|
|
528
|
+
"css",
|
|
529
|
+
"Default"
|
|
530
|
+
],
|
|
531
|
+
"FSTAT": {
|
|
532
|
+
"Size": 34,
|
|
533
|
+
"Created": "2024-08-16T15:15:48.868Z",
|
|
534
|
+
"Modified": "2024-08-16T15:15:48.868Z",
|
|
535
|
+
"Accessed": "2024-08-16T15:15:48.901Z",
|
|
536
|
+
"Mode": 33188
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.html": {
|
|
540
|
+
"UUID": "932fa3d1-8c87-475e-844c-911c9a58101e",
|
|
541
|
+
"Type": "URI",
|
|
542
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.html",
|
|
543
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.html",
|
|
544
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site",
|
|
545
|
+
"Name": "Test.html",
|
|
546
|
+
"MimeType": "text/html",
|
|
547
|
+
"Nature": "text",
|
|
548
|
+
"Format": "html",
|
|
549
|
+
"Schema": "Default",
|
|
550
|
+
"Content": false,
|
|
551
|
+
"Labels": [
|
|
552
|
+
"__LABELSET_TYPE",
|
|
553
|
+
"FILE",
|
|
554
|
+
"__LABELSET_ADDRESS",
|
|
555
|
+
"debug",
|
|
556
|
+
"site",
|
|
557
|
+
"__LABELSET_NAME",
|
|
558
|
+
"Test",
|
|
559
|
+
"__LABELSET_EXTENSION",
|
|
560
|
+
".html",
|
|
561
|
+
"__LABELSET_FILENAME",
|
|
562
|
+
"Test.html",
|
|
563
|
+
"__LABELSET_FULLPATH",
|
|
564
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/debug/site/Test.html",
|
|
565
|
+
"__LABELSET_FORMAT",
|
|
566
|
+
"html",
|
|
567
|
+
"Default"
|
|
568
|
+
],
|
|
569
|
+
"FSTAT": {
|
|
570
|
+
"Size": 42,
|
|
571
|
+
"Created": "2024-08-16T15:15:48.868Z",
|
|
572
|
+
"Modified": "2024-08-16T19:28:16.945Z",
|
|
573
|
+
"Accessed": "2024-08-16T19:44:30.567Z",
|
|
574
|
+
"Mode": 33188
|
|
575
|
+
}
|
|
576
|
+
},
|
|
577
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/indoctrinate_content_staging/Indoctrinate-Catalog-AppData.json": {
|
|
578
|
+
"UUID": "3f09af62-1ccc-47c8-97e4-a744027f19bf",
|
|
579
|
+
"Type": "URI",
|
|
580
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/indoctrinate_content_staging/Indoctrinate-Catalog-AppData.json",
|
|
581
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/indoctrinate_content_staging/Indoctrinate-Catalog-AppData.json",
|
|
582
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist/indoctrinate_content_staging",
|
|
583
|
+
"Name": "Indoctrinate-Catalog-AppData.json",
|
|
584
|
+
"MimeType": "application/json",
|
|
585
|
+
"Nature": "application",
|
|
586
|
+
"Format": "json",
|
|
587
|
+
"Schema": "Default",
|
|
588
|
+
"Content": false,
|
|
589
|
+
"Labels": [
|
|
590
|
+
"__LABELSET_TYPE",
|
|
591
|
+
"FILE",
|
|
592
|
+
"__LABELSET_ADDRESS",
|
|
593
|
+
"dist",
|
|
594
|
+
"indoctrinate_content_staging",
|
|
595
|
+
"__LABELSET_NAME",
|
|
596
|
+
"Indoctrinate",
|
|
597
|
+
"Catalog",
|
|
598
|
+
"AppData",
|
|
599
|
+
"__LABELSET_EXTENSION",
|
|
600
|
+
".json",
|
|
601
|
+
"__LABELSET_FILENAME",
|
|
602
|
+
"Indoctrinate-Catalog-AppData.json",
|
|
603
|
+
"__LABELSET_FULLPATH",
|
|
604
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/indoctrinate_content_staging/Indoctrinate-Catalog-AppData.json",
|
|
605
|
+
"__LABELSET_FORMAT",
|
|
606
|
+
"json",
|
|
607
|
+
"Default"
|
|
608
|
+
],
|
|
609
|
+
"FSTAT": {
|
|
610
|
+
"Size": 432,
|
|
611
|
+
"Created": "2026-02-18T03:37:10.781Z",
|
|
612
|
+
"Modified": "2026-02-18T03:37:10.781Z",
|
|
613
|
+
"Accessed": "2026-02-18T03:37:10.781Z",
|
|
614
|
+
"Mode": 33188
|
|
615
|
+
}
|
|
616
|
+
},
|
|
617
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.js": {
|
|
618
|
+
"UUID": "0b745692-964c-41df-9047-e6a1bb1b2ba0",
|
|
619
|
+
"Type": "URI",
|
|
620
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.js",
|
|
621
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.js",
|
|
622
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
623
|
+
"Name": "orator.compatible.js",
|
|
624
|
+
"MimeType": "application/javascript",
|
|
625
|
+
"Nature": "application",
|
|
626
|
+
"Format": "javascript",
|
|
627
|
+
"Schema": "Default",
|
|
628
|
+
"Content": false,
|
|
629
|
+
"Labels": [
|
|
630
|
+
"__LABELSET_TYPE",
|
|
631
|
+
"FILE",
|
|
632
|
+
"__LABELSET_ADDRESS",
|
|
633
|
+
"dist",
|
|
634
|
+
"__LABELSET_NAME",
|
|
635
|
+
"orator",
|
|
636
|
+
"compatible",
|
|
637
|
+
"__LABELSET_EXTENSION",
|
|
638
|
+
".js",
|
|
639
|
+
"__LABELSET_FILENAME",
|
|
640
|
+
"orator.compatible.js",
|
|
641
|
+
"__LABELSET_FULLPATH",
|
|
642
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.js",
|
|
643
|
+
"__LABELSET_FORMAT",
|
|
644
|
+
"javascript",
|
|
645
|
+
"Default"
|
|
646
|
+
],
|
|
647
|
+
"FSTAT": {
|
|
648
|
+
"Size": 205406,
|
|
649
|
+
"Created": "2024-08-16T15:15:48.869Z",
|
|
650
|
+
"Modified": "2024-08-16T15:15:48.871Z",
|
|
651
|
+
"Accessed": "2024-08-16T15:18:43.944Z",
|
|
652
|
+
"Mode": 33188
|
|
653
|
+
}
|
|
654
|
+
},
|
|
655
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js": {
|
|
656
|
+
"UUID": "77a734c5-524e-419a-9867-57ec8644c7e3",
|
|
657
|
+
"Type": "URI",
|
|
658
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js",
|
|
659
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js",
|
|
660
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
661
|
+
"Name": "orator.compatible.min.js",
|
|
662
|
+
"MimeType": "application/javascript",
|
|
663
|
+
"Nature": "application",
|
|
664
|
+
"Format": "javascript",
|
|
665
|
+
"Schema": "Default",
|
|
666
|
+
"Content": false,
|
|
667
|
+
"Labels": [
|
|
668
|
+
"__LABELSET_TYPE",
|
|
669
|
+
"FILE",
|
|
670
|
+
"__LABELSET_ADDRESS",
|
|
671
|
+
"dist",
|
|
672
|
+
"__LABELSET_NAME",
|
|
673
|
+
"orator",
|
|
674
|
+
"compatible",
|
|
675
|
+
"min",
|
|
676
|
+
"__LABELSET_EXTENSION",
|
|
677
|
+
".js",
|
|
678
|
+
"__LABELSET_FILENAME",
|
|
679
|
+
"orator.compatible.min.js",
|
|
680
|
+
"__LABELSET_FULLPATH",
|
|
681
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js",
|
|
682
|
+
"__LABELSET_FORMAT",
|
|
683
|
+
"javascript",
|
|
684
|
+
"Default"
|
|
685
|
+
],
|
|
686
|
+
"FSTAT": {
|
|
687
|
+
"Size": 74118,
|
|
688
|
+
"Created": "2024-08-16T15:15:48.871Z",
|
|
689
|
+
"Modified": "2024-08-16T15:15:48.871Z",
|
|
690
|
+
"Accessed": "2024-08-16T15:18:43.945Z",
|
|
691
|
+
"Mode": 33188
|
|
692
|
+
}
|
|
693
|
+
},
|
|
694
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js.map": {
|
|
695
|
+
"UUID": "575d5097-a288-4158-95be-028057963bcc",
|
|
696
|
+
"Type": "URI",
|
|
697
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js.map",
|
|
698
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js.map",
|
|
699
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
700
|
+
"Name": "orator.compatible.min.js.map",
|
|
701
|
+
"MimeType": "application/json",
|
|
702
|
+
"Nature": "application",
|
|
703
|
+
"Format": "json",
|
|
704
|
+
"Schema": "Default",
|
|
705
|
+
"Content": false,
|
|
706
|
+
"Labels": [
|
|
707
|
+
"__LABELSET_TYPE",
|
|
708
|
+
"FILE",
|
|
709
|
+
"__LABELSET_ADDRESS",
|
|
710
|
+
"dist",
|
|
711
|
+
"__LABELSET_NAME",
|
|
712
|
+
"orator",
|
|
713
|
+
"compatible",
|
|
714
|
+
"min",
|
|
715
|
+
"js",
|
|
716
|
+
"__LABELSET_EXTENSION",
|
|
717
|
+
".map",
|
|
718
|
+
"__LABELSET_FILENAME",
|
|
719
|
+
"orator.compatible.min.js.map",
|
|
720
|
+
"__LABELSET_FULLPATH",
|
|
721
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.compatible.min.js.map",
|
|
722
|
+
"__LABELSET_FORMAT",
|
|
723
|
+
"json",
|
|
724
|
+
"Default"
|
|
725
|
+
],
|
|
726
|
+
"FSTAT": {
|
|
727
|
+
"Size": 403497,
|
|
728
|
+
"Created": "2024-08-16T15:15:48.871Z",
|
|
729
|
+
"Modified": "2024-08-16T15:15:48.877Z",
|
|
730
|
+
"Accessed": "2024-08-16T15:18:43.945Z",
|
|
731
|
+
"Mode": 33188
|
|
732
|
+
}
|
|
733
|
+
},
|
|
734
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.js": {
|
|
735
|
+
"UUID": "ac4f6bfd-fb24-48ca-8b77-8ee5f1053ff2",
|
|
736
|
+
"Type": "URI",
|
|
737
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.js",
|
|
738
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.js",
|
|
739
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
740
|
+
"Name": "orator.js",
|
|
741
|
+
"MimeType": "application/javascript",
|
|
742
|
+
"Nature": "application",
|
|
743
|
+
"Format": "javascript",
|
|
744
|
+
"Schema": "Default",
|
|
745
|
+
"Content": false,
|
|
746
|
+
"Labels": [
|
|
747
|
+
"__LABELSET_TYPE",
|
|
748
|
+
"FILE",
|
|
749
|
+
"__LABELSET_ADDRESS",
|
|
750
|
+
"dist",
|
|
751
|
+
"__LABELSET_NAME",
|
|
752
|
+
"orator",
|
|
753
|
+
"__LABELSET_EXTENSION",
|
|
754
|
+
".js",
|
|
755
|
+
"__LABELSET_FILENAME",
|
|
756
|
+
"orator.js",
|
|
757
|
+
"__LABELSET_FULLPATH",
|
|
758
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.js",
|
|
759
|
+
"__LABELSET_FORMAT",
|
|
760
|
+
"javascript",
|
|
761
|
+
"Default"
|
|
762
|
+
],
|
|
763
|
+
"FSTAT": {
|
|
764
|
+
"Size": 181903,
|
|
765
|
+
"Created": "2024-08-16T15:15:48.877Z",
|
|
766
|
+
"Modified": "2024-08-16T15:15:48.877Z",
|
|
767
|
+
"Accessed": "2024-08-16T15:18:43.945Z",
|
|
768
|
+
"Mode": 33188
|
|
769
|
+
}
|
|
770
|
+
},
|
|
771
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js": {
|
|
772
|
+
"UUID": "daba0219-9f3f-422b-8619-1e000ab4a24a",
|
|
773
|
+
"Type": "URI",
|
|
774
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js",
|
|
775
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js",
|
|
776
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
777
|
+
"Name": "orator.min.js",
|
|
778
|
+
"MimeType": "application/javascript",
|
|
779
|
+
"Nature": "application",
|
|
780
|
+
"Format": "javascript",
|
|
781
|
+
"Schema": "Default",
|
|
782
|
+
"Content": false,
|
|
783
|
+
"Labels": [
|
|
784
|
+
"__LABELSET_TYPE",
|
|
785
|
+
"FILE",
|
|
786
|
+
"__LABELSET_ADDRESS",
|
|
787
|
+
"dist",
|
|
788
|
+
"__LABELSET_NAME",
|
|
789
|
+
"orator",
|
|
790
|
+
"min",
|
|
791
|
+
"__LABELSET_EXTENSION",
|
|
792
|
+
".js",
|
|
793
|
+
"__LABELSET_FILENAME",
|
|
794
|
+
"orator.min.js",
|
|
795
|
+
"__LABELSET_FULLPATH",
|
|
796
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js",
|
|
797
|
+
"__LABELSET_FORMAT",
|
|
798
|
+
"javascript",
|
|
799
|
+
"Default"
|
|
800
|
+
],
|
|
801
|
+
"FSTAT": {
|
|
802
|
+
"Size": 64383,
|
|
803
|
+
"Created": "2024-08-16T15:15:48.877Z",
|
|
804
|
+
"Modified": "2024-08-16T15:15:48.878Z",
|
|
805
|
+
"Accessed": "2024-08-16T15:18:43.945Z",
|
|
806
|
+
"Mode": 33188
|
|
807
|
+
}
|
|
808
|
+
},
|
|
809
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js.map": {
|
|
810
|
+
"UUID": "c5c022f0-d217-42ca-bb69-ea0e76e32ee3",
|
|
811
|
+
"Type": "URI",
|
|
812
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js.map",
|
|
813
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js.map",
|
|
814
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
815
|
+
"Name": "orator.min.js.map",
|
|
816
|
+
"MimeType": "application/json",
|
|
817
|
+
"Nature": "application",
|
|
818
|
+
"Format": "json",
|
|
819
|
+
"Schema": "Default",
|
|
820
|
+
"Content": false,
|
|
821
|
+
"Labels": [
|
|
822
|
+
"__LABELSET_TYPE",
|
|
823
|
+
"FILE",
|
|
824
|
+
"__LABELSET_ADDRESS",
|
|
825
|
+
"dist",
|
|
826
|
+
"__LABELSET_NAME",
|
|
827
|
+
"orator",
|
|
828
|
+
"min",
|
|
829
|
+
"js",
|
|
830
|
+
"__LABELSET_EXTENSION",
|
|
831
|
+
".map",
|
|
832
|
+
"__LABELSET_FILENAME",
|
|
833
|
+
"orator.min.js.map",
|
|
834
|
+
"__LABELSET_FULLPATH",
|
|
835
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/dist/orator.min.js.map",
|
|
836
|
+
"__LABELSET_FORMAT",
|
|
837
|
+
"json",
|
|
838
|
+
"Default"
|
|
839
|
+
],
|
|
840
|
+
"FSTAT": {
|
|
841
|
+
"Size": 390155,
|
|
842
|
+
"Created": "2024-08-16T15:15:48.878Z",
|
|
843
|
+
"Modified": "2024-08-16T15:15:48.878Z",
|
|
844
|
+
"Accessed": "2024-08-16T15:18:43.945Z",
|
|
845
|
+
"Mode": 33188
|
|
846
|
+
}
|
|
847
|
+
},
|
|
848
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/.nojekyll": {
|
|
849
|
+
"UUID": "365a58a9-9173-47c0-8240-2764fb2be88b",
|
|
850
|
+
"Type": "URI",
|
|
851
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/.nojekyll",
|
|
852
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/.nojekyll",
|
|
853
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
854
|
+
"Name": ".nojekyll",
|
|
855
|
+
"MimeType": null,
|
|
856
|
+
"Nature": "UNKNOWN",
|
|
857
|
+
"Format": "UNKNOWN",
|
|
858
|
+
"Schema": "Default",
|
|
859
|
+
"Content": false,
|
|
860
|
+
"Labels": [
|
|
861
|
+
"__LABELSET_TYPE",
|
|
862
|
+
"FILE",
|
|
863
|
+
"__LABELSET_ADDRESS",
|
|
864
|
+
"docs",
|
|
865
|
+
"__LABELSET_NAME",
|
|
866
|
+
"__LABELSET_EXTENSION",
|
|
867
|
+
"",
|
|
868
|
+
"__LABELSET_FILENAME",
|
|
869
|
+
".nojekyll",
|
|
870
|
+
"__LABELSET_FULLPATH",
|
|
871
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/.nojekyll",
|
|
872
|
+
"__LABELSET_FORMAT",
|
|
873
|
+
"UNKNOWN",
|
|
874
|
+
"Default"
|
|
875
|
+
],
|
|
876
|
+
"FSTAT": {
|
|
877
|
+
"Created": "2026-02-05T22:35:50.836Z",
|
|
878
|
+
"Modified": "2026-02-05T22:35:50.836Z",
|
|
879
|
+
"Accessed": "2026-02-05T23:58:29.813Z",
|
|
880
|
+
"Mode": 33188
|
|
881
|
+
}
|
|
882
|
+
},
|
|
883
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/README.md": {
|
|
884
|
+
"UUID": "92d7b723-d400-4118-b73d-53dba5b66c40",
|
|
885
|
+
"Type": "URI",
|
|
886
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/README.md",
|
|
887
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/README.md",
|
|
888
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
889
|
+
"Name": "README.md",
|
|
890
|
+
"MimeType": "text/markdown",
|
|
891
|
+
"Nature": "text",
|
|
892
|
+
"Format": "markdown",
|
|
893
|
+
"Schema": "Default",
|
|
894
|
+
"Content": "# Orator\n\n> An unopinionated API server abstraction for REST and IPC services\n\nOrator is a thin abstraction layer over service server implementations, providing a consistent interface for building API servers. It doesn't care whether you're running Restify, building an in-process service mesh, or doing something entirely novel with your own service server implementation. Orator provides the lifecycle, the configuration, and the conventions -- you provide the service logic.\n\n## Features\n\n- **Unopinionated Design** - Wraps any service server implementation through a consistent interface\n- **REST and IPC** - Full HTTP server support via Restify, or in-process IPC for testing and microservice composition\n- **Lifecycle Management** - Before/After hooks for initialization and service start phases\n- **Static File Serving** - Built-in static file serving with subdomain-based folder routing\n- **Fable Integration** - First-class service provider in the Fable ecosystem with logging and configuration\n- **Browser & Node.js** - Works in both environments with automatic service server selection\n\n## Quick Start\n\n```javascript\nconst libFable = require('fable');\nconst libOrator = require('orator');\nconst libOratorServiceServerRestify = require('orator-serviceserver-restify');\n\nconst _Fable = new libFable({\n\tProduct: 'MyAPIServer',\n\tProductVersion: '1.0.0',\n\tServicePort: 8080\n});\n\n// Register Orator and a service server with Fable\n_Fable.serviceManager.addServiceType('Orator', libOrator);\n_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);\n_Fable.serviceManager.instantiateServiceProvider('Orator');\n_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');\n\n// Add an API endpoint\n_Fable.Orator.serviceServer.get('/hello/:name',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ greeting: `Hello ${pRequest.params.name}!` });\n\t\treturn fNext();\n\t});\n\n// Start the service\n_Fable.Orator.startService(\n\t() =>\n\t{\n\t\tconsole.log('Server is running on port 8080');\n\t});\n```\n\n## Installation\n\n```bash\nnpm install orator\n```\n\n## How It Works\n\nOrator follows the Fable service provider pattern. You register it with a Fable instance, and it orchestrates one or more service server implementations to handle incoming requests. If you don't provide a service server, Orator will automatically set up its built-in IPC server -- which is useful for testing and in-process communication where no network traffic is needed.\n\n```\nFable (Core)\n └── Orator (Service Orchestration)\n └── Service Server (Restify, IPC, or custom)\n ├── Route Registration (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD)\n ├── Middleware Pipeline\n └── Static File Serving\n```\n\n## Configuration\n\nOrator accepts configuration through the Fable settings object:\n\n```json\n{\n\t\"Product\": \"MyAPIServer\",\n\t\"ProductVersion\": \"1.0.0\",\n\t\"ServicePort\": 8080,\n\t\"RestifyConfiguration\": {}\n}\n```\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `Product` | string | `\"Unnamed_Service\"` | Application name identifier |\n| `ProductVersion` | string | `\"0.0.1\"` | Application version string |\n| `ServicePort` | number | `8080` | Port for the service server to listen on |\n| `APIServerPort` | number | - | Legacy alias for ServicePort (automatically migrated) |\n| `RestifyConfiguration` | object | `{}` | Configuration passed to Restify server creation |\n| `ServiceServerOptions` | object | `{}` | Options passed to the auto-initialized service server |\n\n## API Reference\n\n### Lifecycle Methods\n\n| Method | Description |\n|--------|-------------|\n| `initialize(fCallback)` | Initializes Orator and its service server |\n| `startService(fCallback)` | Starts the service server listening on the configured port |\n| `stopService(fCallback)` | Stops the running service server |\n\n### Route Invocation\n\n| Method | Description |\n|--------|-------------|\n| `invoke(pMethod, pRoute, pData, fCallback)` | Programmatically invoke a registered route without HTTP |\n\n### Static Files\n\n| Method | Description |\n|--------|-------------|\n| `addStaticRoute(pFilePath, pDefaultFile, pRoute, pRouteStrip, pParams)` | Serve static files from a directory |\n\n### Legacy Methods\n\n| Method | Maps To |\n|--------|---------|\n| `startWebServer(fCallback)` | `startService(fCallback)` |\n| `stopWebServer(fCallback)` | `stopService(fCallback)` |\n| `getWebServer()` | Returns `serviceServer` (lazy-initializes if needed) |\n\n### Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `serviceServer` | object | The active service server instance |\n| `webServer` | object | Legacy alias for `serviceServer` |\n\n## Testing\n\n```bash\nnpm test\n```\n\n## Related Packages\n\n- [orator-serviceserver-base](https://github.com/stevenvelozo/orator-serviceserver-base) - Abstract base class for service servers\n- [orator-serviceserver-restify](https://github.com/stevenvelozo/orator-serviceserver-restify) - Restify service server implementation\n- [orator-http-proxy](https://github.com/stevenvelozo/orator-http-proxy) - HTTP proxy pass-through for Orator\n- [orator-static-server](https://github.com/stevenvelozo/orator-static-server) - Static file serving module\n- [fable](https://github.com/stevenvelozo/fable) - Service provider framework\n- [meadow](https://github.com/stevenvelozo/meadow) - Data access layer with automatic REST endpoints\n",
|
|
895
|
+
"Labels": [
|
|
896
|
+
"__LABELSET_TYPE",
|
|
897
|
+
"FILE",
|
|
898
|
+
"__LABELSET_ADDRESS",
|
|
899
|
+
"docs",
|
|
900
|
+
"__LABELSET_NAME",
|
|
901
|
+
"README",
|
|
902
|
+
"__LABELSET_EXTENSION",
|
|
903
|
+
".md",
|
|
904
|
+
"__LABELSET_FILENAME",
|
|
905
|
+
"README.md",
|
|
906
|
+
"__LABELSET_FULLPATH",
|
|
907
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/README.md",
|
|
908
|
+
"__LABELSET_FORMAT",
|
|
909
|
+
"markdown",
|
|
910
|
+
"Default"
|
|
911
|
+
],
|
|
912
|
+
"FSTAT": {
|
|
913
|
+
"Size": 5444,
|
|
914
|
+
"Created": "2026-02-05T22:36:11.847Z",
|
|
915
|
+
"Modified": "2026-02-05T22:36:11.847Z",
|
|
916
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
917
|
+
"Mode": 33188
|
|
918
|
+
}
|
|
919
|
+
},
|
|
920
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/_sidebar.md": {
|
|
921
|
+
"UUID": "3b023854-0a77-4d6d-a34a-d68a24de85e7",
|
|
922
|
+
"Type": "URI",
|
|
923
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/_sidebar.md",
|
|
924
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/_sidebar.md",
|
|
925
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
926
|
+
"Name": "_sidebar.md",
|
|
927
|
+
"MimeType": "text/markdown",
|
|
928
|
+
"Nature": "text",
|
|
929
|
+
"Format": "markdown",
|
|
930
|
+
"Schema": "Default",
|
|
931
|
+
"Content": "- Getting Started\n\n - [Introduction](/)\n - [Getting Started](getting-started.md)\n - [Architecture](architecture.md)\n\n- Core Concepts\n\n - [Service Servers](service-servers.md)\n - [Lifecycle Hooks](lifecycle-hooks.md)\n - [Static File Serving](static-files.md)\n\n- Service Server Implementations\n\n - [IPC Server](ipc-server.md)\n - [Restify Server](restify-server.md)\n\n- Advanced\n\n - [HTTP Proxy](http-proxy.md)\n - [Configuration Reference](configuration.md)\n",
|
|
932
|
+
"Labels": [
|
|
933
|
+
"__LABELSET_TYPE",
|
|
934
|
+
"FILE",
|
|
935
|
+
"__LABELSET_ADDRESS",
|
|
936
|
+
"docs",
|
|
937
|
+
"__LABELSET_NAME",
|
|
938
|
+
"sidebar",
|
|
939
|
+
"__LABELSET_EXTENSION",
|
|
940
|
+
".md",
|
|
941
|
+
"__LABELSET_FILENAME",
|
|
942
|
+
"_sidebar.md",
|
|
943
|
+
"__LABELSET_FULLPATH",
|
|
944
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/_sidebar.md",
|
|
945
|
+
"__LABELSET_FORMAT",
|
|
946
|
+
"markdown",
|
|
947
|
+
"Default"
|
|
948
|
+
],
|
|
949
|
+
"FSTAT": {
|
|
950
|
+
"Size": 464,
|
|
951
|
+
"Created": "2026-02-05T22:35:50.712Z",
|
|
952
|
+
"Modified": "2026-02-05T22:35:50.712Z",
|
|
953
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
954
|
+
"Mode": 33188
|
|
955
|
+
}
|
|
956
|
+
},
|
|
957
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/architecture.md": {
|
|
958
|
+
"UUID": "507ce7e3-1c4c-4999-99f5-9a8ec190e30a",
|
|
959
|
+
"Type": "URI",
|
|
960
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/architecture.md",
|
|
961
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/architecture.md",
|
|
962
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
963
|
+
"Name": "architecture.md",
|
|
964
|
+
"MimeType": "text/markdown",
|
|
965
|
+
"Nature": "text",
|
|
966
|
+
"Format": "markdown",
|
|
967
|
+
"Schema": "Default",
|
|
968
|
+
"Content": "# Architecture\n\nOrator's design separates the concerns of service lifecycle management from the specifics of any HTTP server implementation. This abstraction allows you to swap service servers, test without network overhead, and maintain consistent patterns across many microservices.\n\n## Layered Design\n\n```\n┌─────────────────────────────────────────────┐\n│ Fable │\n│ (Configuration, Logging, DI) │\n└─────────────────────┬───────────────────────┘\n │\n┌─────────────────────▼───────────────────────┐\n│ Orator │\n│ (Lifecycle, Static Files, Invocation) │\n└─────────────────────┬───────────────────────┘\n │\n┌─────────────────────▼───────────────────────┐\n│ OratorServiceServerBase │\n│ (Abstract Route & Middleware API) │\n└───────┬─────────────┬───────────────────────┘\n │ │\n┌───────▼──────┐ ┌────▼──────────────┐\n│ IPC Server │ │ Restify Server │\n│ (built-in) │ │ (network HTTP) │\n└──────────────┘ └───────────────────┘\n```\n\n### Fable Layer\n\nFable provides the foundation: dependency injection, configuration management, logging, and service wiring. Orator registers itself as a Fable service and gains access to all of these capabilities automatically.\n\n### Orator Layer\n\nOrator manages the service lifecycle (initialization, starting, stopping) and provides higher-level features like static file serving and programmatic route invocation. It delegates actual HTTP handling to whichever service server implementation is registered.\n\n### Service Server Layer\n\nService servers implement the actual HTTP verb handling. The base class (`orator-serviceserver-base`) defines the interface, and concrete implementations like `orator-serviceserver-restify` and the built-in IPC server provide the behavior.\n\n## Service Provider Pattern\n\nAll Orator modules follow the Fable service provider pattern. Services are registered with a Fable instance by type, then instantiated on demand:\n\n```javascript\n// Register the service types\n_Fable.serviceManager.addServiceType('Orator', libOrator);\n_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);\n\n// Instantiate them -- Fable handles wiring\n_Fable.serviceManager.instantiateServiceProvider('Orator');\n_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');\n\n// Access via Fable\n_Fable.Orator.startService();\n```\n\n## Auto-Initialization\n\nIf no service server is registered when Orator initializes, it will automatically create and register the built-in IPC service server. This makes it possible to use Orator for in-process route invocation without configuring a network server:\n\n```javascript\n// No OratorServiceServer registered -- IPC is used automatically\n_Fable.serviceManager.addServiceType('Orator', libOrator);\n_Fable.serviceManager.instantiateServiceProvider('Orator');\n\n_Fable.Orator.serviceServer.get('/api/data',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ value: 42 });\n\t\treturn fNext();\n\t});\n\n// Invoke the route programmatically (no network call)\n_Fable.Orator.invoke('GET', '/api/data', {},\n\t(pError, pResponseData) =>\n\t{\n\t\tconsole.log(pResponseData); // { value: 42 }\n\t});\n```\n\n## Template Method Pattern\n\nThe service server base class uses a template method pattern for route registration. The base class validates inputs, and derived classes implement the `do*` methods with actual behavior:\n\n```\nBase: get(pRoute, ...) → validates pRoute → calls doGet(pRoute, ...)\n └── Restify: doGet(pRoute, ...) → this.server.get(pRoute, ...)\n └── IPC: doGet(pRoute, ...) → this.addRouteProcessor('GET', pRoute, ...)\n```\n\nThis pattern allows derived classes to focus on implementation without duplicating validation logic.\n",
|
|
969
|
+
"Labels": [
|
|
970
|
+
"__LABELSET_TYPE",
|
|
971
|
+
"FILE",
|
|
972
|
+
"__LABELSET_ADDRESS",
|
|
973
|
+
"docs",
|
|
974
|
+
"__LABELSET_NAME",
|
|
975
|
+
"architecture",
|
|
976
|
+
"__LABELSET_EXTENSION",
|
|
977
|
+
".md",
|
|
978
|
+
"__LABELSET_FILENAME",
|
|
979
|
+
"architecture.md",
|
|
980
|
+
"__LABELSET_FULLPATH",
|
|
981
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/architecture.md",
|
|
982
|
+
"__LABELSET_FORMAT",
|
|
983
|
+
"markdown",
|
|
984
|
+
"Default"
|
|
985
|
+
],
|
|
986
|
+
"FSTAT": {
|
|
987
|
+
"Size": 4609,
|
|
988
|
+
"Created": "2026-02-05T22:36:42.923Z",
|
|
989
|
+
"Modified": "2026-02-05T22:36:42.923Z",
|
|
990
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
991
|
+
"Mode": 33188
|
|
992
|
+
}
|
|
993
|
+
},
|
|
994
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/configuration.md": {
|
|
995
|
+
"UUID": "a2621d05-175c-4ec7-b74f-1897d63fa56b",
|
|
996
|
+
"Type": "URI",
|
|
997
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/configuration.md",
|
|
998
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/configuration.md",
|
|
999
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1000
|
+
"Name": "configuration.md",
|
|
1001
|
+
"MimeType": "text/markdown",
|
|
1002
|
+
"Nature": "text",
|
|
1003
|
+
"Format": "markdown",
|
|
1004
|
+
"Schema": "Default",
|
|
1005
|
+
"Content": "# Configuration Reference\n\nOrator is configured through the Fable settings object. Settings can be provided directly, loaded from a configuration file, or a combination of both.\n\n## Orator Settings\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `Product` | string | `\"Unnamed_Service\"` | Application name identifier |\n| `ProductVersion` | string | `\"0.0.1\"` | Application version string |\n| `ServicePort` | number | `8080` | Port for the service server to listen on |\n| `APIServerPort` | number | - | Legacy alias for `ServicePort` (automatically migrated) |\n| `ServiceServerOptions` | object | `{}` | Options passed to the auto-initialized service server |\n\n## Restify Settings\n\nWhen using the Restify service server:\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `RestifyConfiguration` | object | `{}` | Configuration passed to `restify.createServer()` |\n| `RestifyConfiguration.maxParamLength` | number | `Number.MAX_SAFE_INTEGER` | Maximum URL parameter length |\n\n## HTTP Proxy Settings\n\nWhen using the HTTP proxy module:\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `OratorHTTPProxyDestinationURL` | string | `\"http://127.0.0.1/\"` | URL to proxy requests to |\n| `OratorHTTPProxyRequestPrefixList` | array | `[\"/1.0/*\"]` | Route prefixes to proxy |\n| `OratorHTTPProxyLogLevel` | number | `0` | Proxy logging verbosity |\n\n## Fable Settings\n\nThese Fable settings are commonly used with Orator:\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `LogStreams` | array | `[{ level: \"info\" }]` | Log output destinations |\n| `LogNoisiness` | number | `0` | Controls Orator's internal trace logging |\n| `UUID.DataCenter` | number | `0` | Data center ID for UUID generation |\n| `UUID.Worker` | number | `0` | Worker ID for UUID generation |\n\n## Example Configuration File\n\n```json\n{\n\t\"Product\": \"MyAPIServer\",\n\t\"ProductVersion\": \"2.1.0\",\n\t\"ServicePort\": 8080,\n\n\t\"RestifyConfiguration\": {\n\t\t\"strictNext\": true\n\t},\n\n\t\"UUID\": {\n\t\t\"DataCenter\": 0,\n\t\t\"Worker\": 1\n\t},\n\n\t\"LogStreams\": [\n\t\t{\n\t\t\t\"level\": \"info\",\n\t\t\t\"path\": \"./server.log\"\n\t\t},\n\t\t{\n\t\t\t\"level\": \"trace\",\n\t\t\t\"streamtype\": \"process.stdout\"\n\t\t}\n\t]\n}\n```\n\n## Loading Configuration\n\n```javascript\n// Direct configuration\nconst _Fable = new libFable({\n\tProduct: 'MyAPIServer',\n\tServicePort: 8080\n});\n\n// From a JSON file\nconst _Fable = new libFable({\n\tConfigFile: __dirname + '/config.json'\n});\n\n// Combined (direct settings override file settings)\nconst _Fable = new libFable({\n\tConfigFile: __dirname + '/config.json',\n\tServicePort: 9090 // Overrides whatever is in config.json\n});\n```\n",
|
|
1006
|
+
"Labels": [
|
|
1007
|
+
"__LABELSET_TYPE",
|
|
1008
|
+
"FILE",
|
|
1009
|
+
"__LABELSET_ADDRESS",
|
|
1010
|
+
"docs",
|
|
1011
|
+
"__LABELSET_NAME",
|
|
1012
|
+
"configuration",
|
|
1013
|
+
"__LABELSET_EXTENSION",
|
|
1014
|
+
".md",
|
|
1015
|
+
"__LABELSET_FILENAME",
|
|
1016
|
+
"configuration.md",
|
|
1017
|
+
"__LABELSET_FULLPATH",
|
|
1018
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/configuration.md",
|
|
1019
|
+
"__LABELSET_FORMAT",
|
|
1020
|
+
"markdown",
|
|
1021
|
+
"Default"
|
|
1022
|
+
],
|
|
1023
|
+
"FSTAT": {
|
|
1024
|
+
"Size": 2700,
|
|
1025
|
+
"Created": "2026-02-05T22:38:11.577Z",
|
|
1026
|
+
"Modified": "2026-02-05T22:38:11.577Z",
|
|
1027
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
1028
|
+
"Mode": 33188
|
|
1029
|
+
}
|
|
1030
|
+
},
|
|
1031
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/cover.md": {
|
|
1032
|
+
"UUID": "47b15c0e-57fc-4949-9182-adf5f0f5c397",
|
|
1033
|
+
"Type": "URI",
|
|
1034
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/cover.md",
|
|
1035
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/cover.md",
|
|
1036
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1037
|
+
"Name": "cover.md",
|
|
1038
|
+
"MimeType": "text/markdown",
|
|
1039
|
+
"Nature": "text",
|
|
1040
|
+
"Format": "markdown",
|
|
1041
|
+
"Schema": "Default",
|
|
1042
|
+
"Content": "# Orator <small>5</small>\n\n> An unopinionated API server abstraction for REST and IPC services\n\n- Consistent interface over any service server implementation\n- Full REST support via Restify with in-process IPC for testing\n- Built-in static file serving with subdomain routing\n- First-class Fable service provider with lifecycle management\n\n[GitHub](https://github.com/stevenvelozo/orator)\n[Get Started](#orator)\n",
|
|
1043
|
+
"Labels": [
|
|
1044
|
+
"__LABELSET_TYPE",
|
|
1045
|
+
"FILE",
|
|
1046
|
+
"__LABELSET_ADDRESS",
|
|
1047
|
+
"docs",
|
|
1048
|
+
"__LABELSET_NAME",
|
|
1049
|
+
"cover",
|
|
1050
|
+
"__LABELSET_EXTENSION",
|
|
1051
|
+
".md",
|
|
1052
|
+
"__LABELSET_FILENAME",
|
|
1053
|
+
"cover.md",
|
|
1054
|
+
"__LABELSET_FULLPATH",
|
|
1055
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/cover.md",
|
|
1056
|
+
"__LABELSET_FORMAT",
|
|
1057
|
+
"markdown",
|
|
1058
|
+
"Default"
|
|
1059
|
+
],
|
|
1060
|
+
"FSTAT": {
|
|
1061
|
+
"Size": 412,
|
|
1062
|
+
"Created": "2026-02-05T22:35:47.733Z",
|
|
1063
|
+
"Modified": "2026-02-05T22:35:47.733Z",
|
|
1064
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
1065
|
+
"Mode": 33188
|
|
1066
|
+
}
|
|
1067
|
+
},
|
|
1068
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/getting-started.md": {
|
|
1069
|
+
"UUID": "85e86bb0-a0f0-44d0-bd62-b39747217e8d",
|
|
1070
|
+
"Type": "URI",
|
|
1071
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/getting-started.md",
|
|
1072
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/getting-started.md",
|
|
1073
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1074
|
+
"Name": "getting-started.md",
|
|
1075
|
+
"MimeType": "text/markdown",
|
|
1076
|
+
"Nature": "text",
|
|
1077
|
+
"Format": "markdown",
|
|
1078
|
+
"Schema": "Default",
|
|
1079
|
+
"Content": "# Getting Started\n\nThis guide walks through setting up an Orator-based API server from scratch.\n\n## Installation\n\nCreate a new Node.js project and install the dependencies:\n\n```bash\nmkdir my-api-server && cd my-api-server\nnpm init -y\nnpm install fable orator orator-serviceserver-restify\n```\n\n## Basic Server\n\nThe simplest possible Orator server:\n\n```javascript\nconst libFable = require('fable');\nconst libOrator = require('orator');\nconst libOratorServiceServerRestify = require('orator-serviceserver-restify');\n\n// 1. Create a Fable instance with your service configuration\nconst _Fable = new libFable({\n\tProduct: 'MyAPIServer',\n\tProductVersion: '1.0.0',\n\tServicePort: 8080\n});\n\n// 2. Register Orator and a service server\n_Fable.serviceManager.addServiceType('Orator', libOrator);\n_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);\n_Fable.serviceManager.instantiateServiceProvider('Orator');\n_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');\n\n// 3. Define your API endpoints\n_Fable.Orator.serviceServer.get('/api/status',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ status: 'ok', timestamp: new Date().toISOString() });\n\t\treturn fNext();\n\t});\n\n// 4. Start the server\n_Fable.Orator.startService(\n\t() =>\n\t{\n\t\t_Fable.log.info('API server is ready');\n\t});\n```\n\nRun it with `node server.js` and visit `http://localhost:8080/api/status` in your browser.\n\n## Adding Routes\n\nOrator's service server exposes methods for all standard HTTP verbs. Each handler receives `pRequest`, `pResponse`, and `fNext` -- the standard Restify handler signature.\n\n```javascript\n// GET with URL parameters\n_Fable.Orator.serviceServer.get('/api/user/:id',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tlet tmpUserID = pRequest.params.id;\n\t\tpResponse.send({ id: tmpUserID, name: 'Example User' });\n\t\treturn fNext();\n\t});\n\n// POST with body parsing\n_Fable.Orator.serviceServer.postWithBodyParser('/api/user',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tlet tmpNewUser = pRequest.body;\n\t\t_Fable.log.info(`Creating user: ${tmpNewUser.name}`);\n\t\tpResponse.send({ created: true, user: tmpNewUser });\n\t\treturn fNext();\n\t});\n\n// PUT, DELETE, PATCH follow the same pattern\n_Fable.Orator.serviceServer.del('/api/user/:id',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ deleted: true, id: pRequest.params.id });\n\t\treturn fNext();\n\t});\n```\n\n## Using Middleware\n\nRegister middleware that runs before all route handlers:\n\n```javascript\n// Add a middleware function\n_Fable.Orator.serviceServer.use(\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\t_Fable.log.trace(`${pRequest.method} ${pRequest.url}`);\n\t\treturn fNext();\n\t});\n```\n\n## Configuration from File\n\nFable supports loading configuration from a JSON file, which means your Orator server configuration can live outside your code:\n\n```json\n{\n\t\"Product\": \"MyAPIServer\",\n\t\"ProductVersion\": \"1.0.0\",\n\t\"ServicePort\": 8080,\n\t\"LogStreams\": [\n\t\t{\n\t\t\t\"level\": \"info\",\n\t\t\t\"path\": \"./server.log\"\n\t\t},\n\t\t{\n\t\t\t\"level\": \"trace\",\n\t\t\t\"streamtype\": \"process.stdout\"\n\t\t}\n\t]\n}\n```\n\n```javascript\nconst _Fable = new libFable({ ConfigFile: __dirname + '/config.json' });\n```\n\n## Next Steps\n\n- [Architecture](architecture.md) - Understand the service server abstraction\n- [Lifecycle Hooks](lifecycle-hooks.md) - Customize initialization and startup behavior\n- [Static File Serving](static-files.md) - Serve files from disk\n- [IPC Server](ipc-server.md) - Use Orator without a network server\n",
|
|
1080
|
+
"Labels": [
|
|
1081
|
+
"__LABELSET_TYPE",
|
|
1082
|
+
"FILE",
|
|
1083
|
+
"__LABELSET_ADDRESS",
|
|
1084
|
+
"docs",
|
|
1085
|
+
"__LABELSET_NAME",
|
|
1086
|
+
"getting",
|
|
1087
|
+
"started",
|
|
1088
|
+
"__LABELSET_EXTENSION",
|
|
1089
|
+
".md",
|
|
1090
|
+
"__LABELSET_FILENAME",
|
|
1091
|
+
"getting-started.md",
|
|
1092
|
+
"__LABELSET_FULLPATH",
|
|
1093
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/getting-started.md",
|
|
1094
|
+
"__LABELSET_FORMAT",
|
|
1095
|
+
"markdown",
|
|
1096
|
+
"Default"
|
|
1097
|
+
],
|
|
1098
|
+
"FSTAT": {
|
|
1099
|
+
"Size": 3446,
|
|
1100
|
+
"Created": "2026-02-05T22:36:25.534Z",
|
|
1101
|
+
"Modified": "2026-02-05T22:36:25.534Z",
|
|
1102
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
1103
|
+
"Mode": 33188
|
|
1104
|
+
}
|
|
1105
|
+
},
|
|
1106
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/http-proxy.md": {
|
|
1107
|
+
"UUID": "ab287865-9e83-44f2-93f6-6469f9f50727",
|
|
1108
|
+
"Type": "URI",
|
|
1109
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/http-proxy.md",
|
|
1110
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/http-proxy.md",
|
|
1111
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1112
|
+
"Name": "http-proxy.md",
|
|
1113
|
+
"MimeType": "text/markdown",
|
|
1114
|
+
"Nature": "text",
|
|
1115
|
+
"Format": "markdown",
|
|
1116
|
+
"Schema": "Default",
|
|
1117
|
+
"Content": "# HTTP Proxy\n\nThe `orator-http-proxy` module provides HTTP proxy pass-through for Orator. It forwards incoming requests matching specified route prefixes to a destination URL, making it easy to proxy API calls to backend services.\n\n## Setup\n\n```bash\nnpm install orator-http-proxy\n```\n\n```javascript\nconst libOratorHTTPProxy = require('orator-http-proxy');\n\n_Fable.serviceManager.addServiceType('OratorHTTPProxy', libOratorHTTPProxy);\n_Fable.serviceManager.instantiateServiceProvider('OratorHTTPProxy',\n\t{\n\t\tDestinationURL: 'http://backend-api:3000/',\n\t\tRequestPrefixList: ['/api/v1/*']\n\t});\n\n// After Orator is initialized, connect the proxy routes\n_Fable.OratorHTTPProxy.connectProxyRoutes();\n```\n\n## Configuration\n\n| Setting | Type | Default | Description |\n|---------|------|---------|-------------|\n| `DestinationURL` | string | `\"http://127.0.0.1/\"` | URL to proxy requests to |\n| `RequestPrefixList` | array | `[\"/1.0/*\"]` | Route prefixes to intercept and proxy |\n| `LogLevel` | number | `0` | Logging verbosity (higher = more output) |\n| `httpProxyOptions` | object | `{}` | Additional options passed to `http-proxy` |\n\nConfiguration can also be set via Fable settings with the `OratorHTTPProxy` prefix:\n- `OratorHTTPProxyDestinationURL`\n- `OratorHTTPProxyRequestPrefixList`\n- `OratorHTTPProxyLogLevel`\n\n## How It Works\n\nFor each prefix in `RequestPrefixList`, the proxy registers GET, PUT, POST, and DELETE handlers on the Orator service server. When a matching request arrives, it is forwarded to the `DestinationURL` using the `http-proxy` library.\n\n## Related\n\n- [orator-http-proxy documentation](https://github.com/stevenvelozo/orator-http-proxy)\n",
|
|
1118
|
+
"Labels": [
|
|
1119
|
+
"__LABELSET_TYPE",
|
|
1120
|
+
"FILE",
|
|
1121
|
+
"__LABELSET_ADDRESS",
|
|
1122
|
+
"docs",
|
|
1123
|
+
"__LABELSET_NAME",
|
|
1124
|
+
"http",
|
|
1125
|
+
"proxy",
|
|
1126
|
+
"__LABELSET_EXTENSION",
|
|
1127
|
+
".md",
|
|
1128
|
+
"__LABELSET_FILENAME",
|
|
1129
|
+
"http-proxy.md",
|
|
1130
|
+
"__LABELSET_FULLPATH",
|
|
1131
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/http-proxy.md",
|
|
1132
|
+
"__LABELSET_FORMAT",
|
|
1133
|
+
"markdown",
|
|
1134
|
+
"Default"
|
|
1135
|
+
],
|
|
1136
|
+
"FSTAT": {
|
|
1137
|
+
"Size": 1660,
|
|
1138
|
+
"Created": "2026-02-05T22:38:00.355Z",
|
|
1139
|
+
"Modified": "2026-02-05T22:38:00.355Z",
|
|
1140
|
+
"Accessed": "2026-02-05T22:59:25.646Z",
|
|
1141
|
+
"Mode": 33188
|
|
1142
|
+
}
|
|
1143
|
+
},
|
|
1144
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/index.html": {
|
|
1145
|
+
"UUID": "02bfdca0-efef-4b47-bb19-574a8a4f73b1",
|
|
1146
|
+
"Type": "URI",
|
|
1147
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/index.html",
|
|
1148
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/index.html",
|
|
1149
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1150
|
+
"Name": "index.html",
|
|
1151
|
+
"MimeType": "text/html",
|
|
1152
|
+
"Nature": "text",
|
|
1153
|
+
"Format": "html",
|
|
1154
|
+
"Schema": "Default",
|
|
1155
|
+
"Content": false,
|
|
1156
|
+
"Labels": [
|
|
1157
|
+
"__LABELSET_TYPE",
|
|
1158
|
+
"FILE",
|
|
1159
|
+
"__LABELSET_ADDRESS",
|
|
1160
|
+
"docs",
|
|
1161
|
+
"__LABELSET_NAME",
|
|
1162
|
+
"index",
|
|
1163
|
+
"__LABELSET_EXTENSION",
|
|
1164
|
+
".html",
|
|
1165
|
+
"__LABELSET_FILENAME",
|
|
1166
|
+
"index.html",
|
|
1167
|
+
"__LABELSET_FULLPATH",
|
|
1168
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/index.html",
|
|
1169
|
+
"__LABELSET_FORMAT",
|
|
1170
|
+
"html",
|
|
1171
|
+
"Default"
|
|
1172
|
+
],
|
|
1173
|
+
"FSTAT": {
|
|
1174
|
+
"Size": 1703,
|
|
1175
|
+
"Created": "2026-02-15T00:06:23.781Z",
|
|
1176
|
+
"Modified": "2026-02-15T00:06:23.781Z",
|
|
1177
|
+
"Accessed": "2026-02-15T00:27:09.333Z",
|
|
1178
|
+
"Mode": 33188
|
|
1179
|
+
}
|
|
1180
|
+
},
|
|
1181
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/ipc-server.md": {
|
|
1182
|
+
"UUID": "5ddd3df9-b43a-40b8-9453-9d6473fd622a",
|
|
1183
|
+
"Type": "URI",
|
|
1184
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/ipc-server.md",
|
|
1185
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/ipc-server.md",
|
|
1186
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1187
|
+
"Name": "ipc-server.md",
|
|
1188
|
+
"MimeType": "text/markdown",
|
|
1189
|
+
"Nature": "text",
|
|
1190
|
+
"Format": "markdown",
|
|
1191
|
+
"Schema": "Default",
|
|
1192
|
+
"Content": "# IPC Server\n\nOrator includes a built-in IPC (Inter-Process Communication) service server that handles route invocation entirely in-process, without any network traffic. This is the default service server when no external implementation (like Restify) is registered.\n\n## When to Use IPC\n\n- **Unit Testing** - Test your route handlers without starting an HTTP server\n- **Microservice Composition** - Call routes programmatically within the same process\n- **Browser Environments** - Orator's browser build uses IPC by default since there's no server to listen on\n\n## Automatic Setup\n\nIf you don't register an `OratorServiceServer` with Fable, Orator creates an IPC server automatically during initialization:\n\n```javascript\nconst libFable = require('fable');\nconst libOrator = require('orator');\n\nconst _Fable = new libFable({ Product: 'MyService' });\n_Fable.serviceManager.addServiceType('Orator', libOrator);\n_Fable.serviceManager.instantiateServiceProvider('Orator');\n\n// serviceServer is now an IPC server\n_Fable.Orator.initialize(\n\t() =>\n\t{\n\t\tconsole.log(_Fable.Orator.serviceServer.ServiceServerType); // \"IPC\"\n\t});\n```\n\n## Programmatic Invocation\n\nThe key feature of the IPC server is `invoke()`, which calls registered routes programmatically:\n\n```javascript\n// Register a route\n_Fable.Orator.serviceServer.get('/api/user/:id',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ id: pRequest.params.id, name: 'Example User' });\n\t\treturn fNext();\n\t});\n\n// Invoke it without HTTP\n_Fable.Orator.invoke('GET', '/api/user/42', {},\n\t(pError, pResponseData) =>\n\t{\n\t\tconsole.log(pResponseData); // { id: '42', name: 'Example User' }\n\t});\n```\n\n## Request and Response Objects\n\nWhen invoking routes via IPC, the server creates synthesized request and response objects:\n\n**Request Object:**\n- `method` - The HTTP method string\n- `url` - The route path\n- `guid` - A unique identifier for the request\n- `params` - Parsed URL parameters\n\n**Response Object (Synthesized):**\n- `send(pData)` - Accumulates response data\n- `responseData` - The aggregated response after all handlers complete\n\n## Pre and Post Behavior Functions\n\nThe IPC server supports middleware through pre-behavior and post-behavior functions:\n\n```javascript\nconst tmpServiceServer = _Fable.Orator.serviceServer;\n\n// Runs before every route handler\ntmpServiceServer.addPreBehaviorFunction(\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpRequest.startTime = Date.now();\n\t\treturn fNext();\n\t});\n\n// Runs after every route handler\ntmpServiceServer.addPostBehaviorFunction(\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tlet tmpDuration = Date.now() - pRequest.startTime;\n\t\tconsole.log(`Request took ${tmpDuration}ms`);\n\t\treturn fNext();\n\t});\n```\n\nThe `use()` method is an alias for `addPreBehaviorFunction()`.\n\n## Execution Flow\n\nWhen a route is invoked via IPC, the execution follows this sequence:\n\n```\ninvoke(method, route, data)\n ↓\nRouter matches route (find-my-way)\n ↓\nExecute pre-behavior functions (sequential)\n ↓\nExecute route handler functions (sequential)\n ↓\nExecute post-behavior functions (sequential)\n ↓\nCallback with aggregated response data\n```\n\nAll stages are executed sequentially using the Fable Anticipate service for asynchronous flow control.\n\n## Routing\n\nThe IPC server uses [find-my-way](https://github.com/delvedor/find-my-way) for route matching, which supports parametric and wildcard routes:\n\n```javascript\n// Parametric route\ntmpServiceServer.get('/user/:id', handler);\n\n// Wildcard route\ntmpServiceServer.get('/files/*', handler);\n```\n",
|
|
1193
|
+
"Labels": [
|
|
1194
|
+
"__LABELSET_TYPE",
|
|
1195
|
+
"FILE",
|
|
1196
|
+
"__LABELSET_ADDRESS",
|
|
1197
|
+
"docs",
|
|
1198
|
+
"__LABELSET_NAME",
|
|
1199
|
+
"ipc",
|
|
1200
|
+
"server",
|
|
1201
|
+
"__LABELSET_EXTENSION",
|
|
1202
|
+
".md",
|
|
1203
|
+
"__LABELSET_FILENAME",
|
|
1204
|
+
"ipc-server.md",
|
|
1205
|
+
"__LABELSET_FULLPATH",
|
|
1206
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/ipc-server.md",
|
|
1207
|
+
"__LABELSET_FORMAT",
|
|
1208
|
+
"markdown",
|
|
1209
|
+
"Default"
|
|
1210
|
+
],
|
|
1211
|
+
"FSTAT": {
|
|
1212
|
+
"Size": 3530,
|
|
1213
|
+
"Created": "2026-02-05T22:37:39.316Z",
|
|
1214
|
+
"Modified": "2026-02-05T22:37:39.316Z",
|
|
1215
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1216
|
+
"Mode": 33188
|
|
1217
|
+
}
|
|
1218
|
+
},
|
|
1219
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/lifecycle-hooks.md": {
|
|
1220
|
+
"UUID": "c6ef499f-5d85-419a-a6dc-0413057594c0",
|
|
1221
|
+
"Type": "URI",
|
|
1222
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/lifecycle-hooks.md",
|
|
1223
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/lifecycle-hooks.md",
|
|
1224
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1225
|
+
"Name": "lifecycle-hooks.md",
|
|
1226
|
+
"MimeType": "text/markdown",
|
|
1227
|
+
"Nature": "text",
|
|
1228
|
+
"Format": "markdown",
|
|
1229
|
+
"Schema": "Default",
|
|
1230
|
+
"Content": "# Lifecycle Hooks\n\nOrator provides lifecycle hooks that allow you to customize behavior at specific points during initialization and service startup. This is useful for setting up middleware, connecting to databases, or performing other setup tasks that need to happen at specific times.\n\n## Initialization Lifecycle\n\nWhen `initialize()` is called, Orator executes these hooks in order:\n\n```\nonBeforeInitialize() / onBeforeInitializeAsync(fNext)\n ↓\nonInitialize() / onInitializeAsync(fNext)\n ↓\nonAfterInitialize() / onAfterInitializeAsync(fNext)\n```\n\nThe `onBeforeInitializeAsync` step is where the service server is set up. If no `OratorServiceServer` is registered with Fable, the built-in IPC server is created automatically at this point.\n\n## Service Start Lifecycle\n\nWhen `startService()` is called, Orator executes these hooks in order:\n\n```\n[initialize() — if not already initialized]\n ↓\nonBeforeStartService(fNext)\n ↓\nonStartService(fNext) — calls serviceServer.listen()\n ↓\nonAfterStartService(fNext)\n```\n\n## Overriding Hooks\n\nTo customize the lifecycle, extend the Orator class and override any of the hook methods:\n\n```javascript\nconst libOrator = require('orator');\n\nclass MyOrator extends libOrator\n{\n\tonBeforeInitializeAsync(fNext)\n\t{\n\t\t// Call super to set up the service server\n\t\tsuper.onBeforeInitializeAsync(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (pError) return fNext(pError);\n\n\t\t\t\t// Now add your custom setup\n\t\t\t\tthis.log.info('Setting up custom middleware...');\n\t\t\t\tthis.serviceServer.use(\n\t\t\t\t\t(pRequest, pResponse, fNext) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tpRequest.customTimestamp = Date.now();\n\t\t\t\t\t\treturn fNext();\n\t\t\t\t\t});\n\n\t\t\t\treturn fNext();\n\t\t\t});\n\t}\n\n\tonAfterStartService(fNext)\n\t{\n\t\tthis.log.info('Server started, performing post-startup tasks...');\n\t\treturn fNext();\n\t}\n}\n```\n\n## Sync and Async Hooks\n\nEach lifecycle phase has both a synchronous and asynchronous variant. The synchronous version is called from within the async version by default:\n\n```javascript\n// Synchronous hook (for simple logging, etc.)\nonBeforeInitialize()\n{\n\tthis.log.trace('About to initialize...');\n}\n\n// Asynchronous hook (for I/O operations)\nonBeforeInitializeAsync(fNext)\n{\n\tthis.onBeforeInitialize();\n\t// ... async setup ...\n\treturn fNext();\n}\n```\n\nOverride the async version when you need to perform asynchronous operations. Override the sync version for simple, non-blocking tasks.\n\n## Auto-Initialization\n\nIf `startService()` is called before `initialize()`, Orator will automatically run initialization first. You don't need to manually call `initialize()` unless you need to set up routes before starting the server.\n",
|
|
1231
|
+
"Labels": [
|
|
1232
|
+
"__LABELSET_TYPE",
|
|
1233
|
+
"FILE",
|
|
1234
|
+
"__LABELSET_ADDRESS",
|
|
1235
|
+
"docs",
|
|
1236
|
+
"__LABELSET_NAME",
|
|
1237
|
+
"lifecycle",
|
|
1238
|
+
"hooks",
|
|
1239
|
+
"__LABELSET_EXTENSION",
|
|
1240
|
+
".md",
|
|
1241
|
+
"__LABELSET_FILENAME",
|
|
1242
|
+
"lifecycle-hooks.md",
|
|
1243
|
+
"__LABELSET_FULLPATH",
|
|
1244
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/lifecycle-hooks.md",
|
|
1245
|
+
"__LABELSET_FORMAT",
|
|
1246
|
+
"markdown",
|
|
1247
|
+
"Default"
|
|
1248
|
+
],
|
|
1249
|
+
"FSTAT": {
|
|
1250
|
+
"Size": 2635,
|
|
1251
|
+
"Created": "2026-02-05T22:37:09.771Z",
|
|
1252
|
+
"Modified": "2026-02-05T22:37:09.772Z",
|
|
1253
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1254
|
+
"Mode": 33188
|
|
1255
|
+
}
|
|
1256
|
+
},
|
|
1257
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/restify-server.md": {
|
|
1258
|
+
"UUID": "3023f8b4-40a2-4b28-af00-d662a7c9f0c8",
|
|
1259
|
+
"Type": "URI",
|
|
1260
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/restify-server.md",
|
|
1261
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/restify-server.md",
|
|
1262
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1263
|
+
"Name": "restify-server.md",
|
|
1264
|
+
"MimeType": "text/markdown",
|
|
1265
|
+
"Nature": "text",
|
|
1266
|
+
"Format": "markdown",
|
|
1267
|
+
"Schema": "Default",
|
|
1268
|
+
"Content": "# Restify Server\n\nThe Restify service server (`orator-serviceserver-restify`) is the production HTTP server implementation for Orator. It wraps [Restify](https://restify.com/), providing a full-featured HTTP API server with body parsing, middleware, and all standard HTTP verbs.\n\n## Setup\n\n```bash\nnpm install orator-serviceserver-restify\n```\n\n```javascript\nconst libOratorServiceServerRestify = require('orator-serviceserver-restify');\n\n_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);\n_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');\n```\n\n## Restify Configuration\n\nPass Restify-specific options through the `RestifyConfiguration` setting:\n\n```javascript\nconst _Fable = new libFable({\n\tProduct: 'MyAPIServer',\n\tServicePort: 8080,\n\tRestifyConfiguration: {\n\t\tstrictNext: true\n\t}\n});\n```\n\nThe default Restify configuration sets `maxParamLength` to `Number.MAX_SAFE_INTEGER` to avoid truncating long URL parameters.\n\n## Body Parsing\n\nThe Restify server uses Restify's built-in body parser plugin. Use the `WithBodyParser` convenience methods to automatically parse request bodies:\n\n```javascript\n_Fable.Orator.serviceServer.postWithBodyParser('/api/items',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\t// pRequest.body contains the parsed request body\n\t\tlet tmpNewItem = pRequest.body;\n\t\tpResponse.send({ created: true, item: tmpNewItem });\n\t\treturn fNext();\n\t});\n```\n\n## Pre-Route Middleware\n\nRestify distinguishes between `use` middleware (runs after routing) and `pre` middleware (runs before routing). The Restify service server exposes both:\n\n```javascript\nconst tmpServiceServer = _Fable.Orator.serviceServer;\n\n// Runs after routing (standard middleware)\ntmpServiceServer.use(\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\treturn fNext();\n\t});\n\n// Runs before routing (pre-middleware)\ntmpServiceServer.pre(\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\treturn fNext();\n\t});\n```\n\n## Accessing the Raw Restify Server\n\nThe underlying Restify server instance is available at `serviceServer.server` if you need direct access to Restify-specific features:\n\n```javascript\nconst tmpRestifyServer = _Fable.Orator.serviceServer.server;\n```\n\n## Related\n\n- [orator-serviceserver-restify documentation](https://github.com/stevenvelozo/orator-serviceserver-restify)\n- [Restify documentation](https://restify.com/)\n",
|
|
1269
|
+
"Labels": [
|
|
1270
|
+
"__LABELSET_TYPE",
|
|
1271
|
+
"FILE",
|
|
1272
|
+
"__LABELSET_ADDRESS",
|
|
1273
|
+
"docs",
|
|
1274
|
+
"__LABELSET_NAME",
|
|
1275
|
+
"restify",
|
|
1276
|
+
"server",
|
|
1277
|
+
"__LABELSET_EXTENSION",
|
|
1278
|
+
".md",
|
|
1279
|
+
"__LABELSET_FILENAME",
|
|
1280
|
+
"restify-server.md",
|
|
1281
|
+
"__LABELSET_FULLPATH",
|
|
1282
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/restify-server.md",
|
|
1283
|
+
"__LABELSET_FORMAT",
|
|
1284
|
+
"markdown",
|
|
1285
|
+
"Default"
|
|
1286
|
+
],
|
|
1287
|
+
"FSTAT": {
|
|
1288
|
+
"Size": 2347,
|
|
1289
|
+
"Created": "2026-02-05T22:37:52.451Z",
|
|
1290
|
+
"Modified": "2026-02-05T22:37:52.451Z",
|
|
1291
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1292
|
+
"Mode": 33188
|
|
1293
|
+
}
|
|
1294
|
+
},
|
|
1295
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/service-servers.md": {
|
|
1296
|
+
"UUID": "b89f3768-811b-421d-b7a5-7b2fd6dc81f8",
|
|
1297
|
+
"Type": "URI",
|
|
1298
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/service-servers.md",
|
|
1299
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/service-servers.md",
|
|
1300
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1301
|
+
"Name": "service-servers.md",
|
|
1302
|
+
"MimeType": "text/markdown",
|
|
1303
|
+
"Nature": "text",
|
|
1304
|
+
"Format": "markdown",
|
|
1305
|
+
"Schema": "Default",
|
|
1306
|
+
"Content": "# Service Servers\n\nA service server is the component that actually handles HTTP requests (or their in-process equivalent). Orator doesn't implement HTTP handling directly -- it delegates to a service server implementation that conforms to the `orator-serviceserver-base` interface.\n\n## Available Implementations\n\n| Implementation | Package | Transport | Use Case |\n|---------------|---------|-----------|----------|\n| **Restify** | `orator-serviceserver-restify` | HTTP/HTTPS | Production API servers |\n| **IPC** | Built into `orator` | In-process | Testing, microservice composition |\n\n## Registering a Service Server\n\nService servers are registered with Fable before Orator initializes:\n\n```javascript\nconst libOratorServiceServerRestify = require('orator-serviceserver-restify');\n\n_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);\n_Fable.serviceManager.instantiateServiceProvider('OratorServiceServer');\n```\n\nThe key is the service type name `OratorServiceServer`. Orator looks for this specific name when it initializes. If it finds one registered, it uses it. If not, it falls back to the built-in IPC server.\n\n## Route Registration\n\nAll service servers share the same route registration API:\n\n```javascript\nconst tmpServiceServer = _Fable.Orator.serviceServer;\n\n// Standard HTTP verbs\ntmpServiceServer.get('/path', handler);\ntmpServiceServer.post('/path', handler);\ntmpServiceServer.put('/path', handler);\ntmpServiceServer.del('/path', handler);\ntmpServiceServer.patch('/path', handler);\ntmpServiceServer.opts('/path', handler);\ntmpServiceServer.head('/path', handler);\n\n// With automatic body parsing\ntmpServiceServer.postWithBodyParser('/path', handler);\ntmpServiceServer.putWithBodyParser('/path', handler);\ntmpServiceServer.delWithBodyParser('/path', handler);\ntmpServiceServer.patchWithBodyParser('/path', handler);\n```\n\n## Handler Signature\n\nRoute handlers follow the standard `(pRequest, pResponse, fNext)` pattern:\n\n```javascript\ntmpServiceServer.get('/api/items/:id',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tlet tmpItemID = pRequest.params.id;\n\t\tpResponse.send({ id: tmpItemID });\n\t\treturn fNext();\n\t});\n```\n\n## Middleware\n\nRegister middleware that runs before all route handlers:\n\n```javascript\ntmpServiceServer.use(\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\t// Runs before every request\n\t\treturn fNext();\n\t});\n```\n\n## Service Server Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `ServiceServerType` | string | Identifier for the implementation (e.g., `\"Restify\"`, `\"IPC\"`) |\n| `Name` | string | Server name (from `fable.settings.Product`) |\n| `URL` | string | Server URL or identifier |\n| `Port` | number | Listening port |\n| `Active` | boolean | Whether the server is currently listening |\n\n## Building Custom Service Servers\n\nYou can create your own service server implementation by extending `orator-serviceserver-base`. See the [orator-serviceserver-base documentation](https://github.com/stevenvelozo/orator-serviceserver-base) for the interface contract.\n",
|
|
1307
|
+
"Labels": [
|
|
1308
|
+
"__LABELSET_TYPE",
|
|
1309
|
+
"FILE",
|
|
1310
|
+
"__LABELSET_ADDRESS",
|
|
1311
|
+
"docs",
|
|
1312
|
+
"__LABELSET_NAME",
|
|
1313
|
+
"service",
|
|
1314
|
+
"servers",
|
|
1315
|
+
"__LABELSET_EXTENSION",
|
|
1316
|
+
".md",
|
|
1317
|
+
"__LABELSET_FILENAME",
|
|
1318
|
+
"service-servers.md",
|
|
1319
|
+
"__LABELSET_FULLPATH",
|
|
1320
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/service-servers.md",
|
|
1321
|
+
"__LABELSET_FORMAT",
|
|
1322
|
+
"markdown",
|
|
1323
|
+
"Default"
|
|
1324
|
+
],
|
|
1325
|
+
"FSTAT": {
|
|
1326
|
+
"Size": 3050,
|
|
1327
|
+
"Created": "2026-02-05T22:36:57.093Z",
|
|
1328
|
+
"Modified": "2026-02-05T22:36:57.093Z",
|
|
1329
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1330
|
+
"Mode": 33188
|
|
1331
|
+
}
|
|
1332
|
+
},
|
|
1333
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/static-files.md": {
|
|
1334
|
+
"UUID": "f62d14a5-7394-4beb-848f-fb59168396b1",
|
|
1335
|
+
"Type": "URI",
|
|
1336
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/static-files.md",
|
|
1337
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/static-files.md",
|
|
1338
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/docs",
|
|
1339
|
+
"Name": "static-files.md",
|
|
1340
|
+
"MimeType": "text/markdown",
|
|
1341
|
+
"Nature": "text",
|
|
1342
|
+
"Format": "markdown",
|
|
1343
|
+
"Schema": "Default",
|
|
1344
|
+
"Content": "# Static File Serving\n\nOrator includes built-in static file serving through the `addStaticRoute` method. This serves files from a local directory over HTTP, with support for subdomain-based folder routing and MIME type detection.\n\n## Basic Usage\n\n```javascript\n// Serve files from ./public, defaulting to index.html\n_Fable.Orator.addStaticRoute('./public/');\n```\n\nThis maps all incoming requests to files in the `./public/` directory. A request to `/styles.css` would serve `./public/styles.css`.\n\n## Parameters\n\n```javascript\n_Fable.Orator.addStaticRoute(pFilePath, pDefaultFile, pRoute, pRouteStrip, pParams);\n```\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `pFilePath` | string | *required* | Path to the directory to serve files from |\n| `pDefaultFile` | string | `\"index.html\"` | Default file when no specific file is requested |\n| `pRoute` | string | `\"/*\"` | Route pattern to match for static file requests |\n| `pRouteStrip` | string | `\"/\"` | Prefix to strip from URL paths before looking up files |\n| `pParams` | object | `{}` | Additional options passed to the `serve-static` library |\n\n## Route Stripping\n\nThe `pRouteStrip` parameter removes a prefix from the URL before mapping it to the filesystem. This is useful when your static files are served under a subpath:\n\n```javascript\n// Serve /app/styles.css from ./dist/styles.css\n_Fable.Orator.addStaticRoute('./dist/', 'index.html', '/app/*', '/app/');\n```\n\n## Subdomain Magic Hosting\n\nOrator has a built-in feature for subdomain-based folder routing. When a request comes in with a subdomain prefix, Orator checks if a matching subfolder exists in the serve directory. If it does, files are served from that subfolder instead.\n\nFor example, with a serve path of `./sites/`:\n\n- A request to `http://clienta.example.com/page.html` would check for `./sites/clienta/page.html`\n- If `./sites/clienta/` exists, it serves from there\n- If not, it falls back to `./sites/page.html`\n\nThis enables a simple multi-tenant static hosting setup without any additional configuration.\n\n## MIME Type Detection\n\nOrator automatically sets the `Content-Type` header based on the file extension. It uses the `mime` library for detection and falls back to `application/octet-stream` for unknown types.\n\n## Example: Single Page Application\n\nA common pattern is serving a single page application where all routes should fall back to `index.html`:\n\n```javascript\n// Serve the SPA from ./dist, all routes map to index.html\n_Fable.Orator.addStaticRoute('./dist/', 'index.html', '/*');\n```\n\n## Example: API Server with Static Frontend\n\n```javascript\n// Set up API routes first\n_Fable.Orator.serviceServer.get('/api/data',\n\t(pRequest, pResponse, fNext) =>\n\t{\n\t\tpResponse.send({ value: 42 });\n\t\treturn fNext();\n\t});\n\n// Then serve static files for everything else\n_Fable.Orator.addStaticRoute('./public/', 'index.html', '/*');\n```\n",
|
|
1345
|
+
"Labels": [
|
|
1346
|
+
"__LABELSET_TYPE",
|
|
1347
|
+
"FILE",
|
|
1348
|
+
"__LABELSET_ADDRESS",
|
|
1349
|
+
"docs",
|
|
1350
|
+
"__LABELSET_NAME",
|
|
1351
|
+
"static",
|
|
1352
|
+
"files",
|
|
1353
|
+
"__LABELSET_EXTENSION",
|
|
1354
|
+
".md",
|
|
1355
|
+
"__LABELSET_FILENAME",
|
|
1356
|
+
"static-files.md",
|
|
1357
|
+
"__LABELSET_FULLPATH",
|
|
1358
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/docs/static-files.md",
|
|
1359
|
+
"__LABELSET_FORMAT",
|
|
1360
|
+
"markdown",
|
|
1361
|
+
"Default"
|
|
1362
|
+
],
|
|
1363
|
+
"FSTAT": {
|
|
1364
|
+
"Size": 2912,
|
|
1365
|
+
"Created": "2026-02-05T22:37:23.313Z",
|
|
1366
|
+
"Modified": "2026-02-05T22:37:23.313Z",
|
|
1367
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1368
|
+
"Mode": 33188
|
|
1369
|
+
}
|
|
1370
|
+
},
|
|
1371
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/gulpfile.js": {
|
|
1372
|
+
"UUID": "392127e5-3e99-4089-864b-e0bd0a97387b",
|
|
1373
|
+
"Type": "URI",
|
|
1374
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/gulpfile.js",
|
|
1375
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/gulpfile.js",
|
|
1376
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
1377
|
+
"Name": "gulpfile.js",
|
|
1378
|
+
"MimeType": "application/javascript",
|
|
1379
|
+
"Nature": "application",
|
|
1380
|
+
"Format": "javascript",
|
|
1381
|
+
"Schema": "Default",
|
|
1382
|
+
"Content": false,
|
|
1383
|
+
"Labels": [
|
|
1384
|
+
"__LABELSET_TYPE",
|
|
1385
|
+
"FILE",
|
|
1386
|
+
"__LABELSET_ADDRESS",
|
|
1387
|
+
"__LABELSET_NAME",
|
|
1388
|
+
"gulpfile",
|
|
1389
|
+
"__LABELSET_EXTENSION",
|
|
1390
|
+
".js",
|
|
1391
|
+
"__LABELSET_FILENAME",
|
|
1392
|
+
"gulpfile.js",
|
|
1393
|
+
"__LABELSET_FULLPATH",
|
|
1394
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/gulpfile.js",
|
|
1395
|
+
"__LABELSET_FORMAT",
|
|
1396
|
+
"javascript",
|
|
1397
|
+
"Default"
|
|
1398
|
+
],
|
|
1399
|
+
"FSTAT": {
|
|
1400
|
+
"Size": 2563,
|
|
1401
|
+
"Created": "2024-08-16T15:15:48.879Z",
|
|
1402
|
+
"Modified": "2024-08-16T15:15:48.879Z",
|
|
1403
|
+
"Accessed": "2024-08-16T15:15:49.015Z",
|
|
1404
|
+
"Mode": 33188
|
|
1405
|
+
}
|
|
1406
|
+
},
|
|
1407
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package-lock.json": {
|
|
1408
|
+
"UUID": "8b965397-8b44-47cd-9889-b1c2bc1a23a7",
|
|
1409
|
+
"Type": "URI",
|
|
1410
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package-lock.json",
|
|
1411
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package-lock.json",
|
|
1412
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
1413
|
+
"Name": "package-lock.json",
|
|
1414
|
+
"MimeType": "application/json",
|
|
1415
|
+
"Nature": "application",
|
|
1416
|
+
"Format": "json",
|
|
1417
|
+
"Schema": "Default",
|
|
1418
|
+
"Content": false,
|
|
1419
|
+
"Labels": [
|
|
1420
|
+
"__LABELSET_TYPE",
|
|
1421
|
+
"FILE",
|
|
1422
|
+
"__LABELSET_ADDRESS",
|
|
1423
|
+
"__LABELSET_NAME",
|
|
1424
|
+
"package",
|
|
1425
|
+
"lock",
|
|
1426
|
+
"__LABELSET_EXTENSION",
|
|
1427
|
+
".json",
|
|
1428
|
+
"__LABELSET_FILENAME",
|
|
1429
|
+
"package-lock.json",
|
|
1430
|
+
"__LABELSET_FULLPATH",
|
|
1431
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package-lock.json",
|
|
1432
|
+
"__LABELSET_FORMAT",
|
|
1433
|
+
"json",
|
|
1434
|
+
"Default"
|
|
1435
|
+
],
|
|
1436
|
+
"FSTAT": {
|
|
1437
|
+
"Size": 1024619,
|
|
1438
|
+
"Created": "2024-04-15T19:49:16.314Z",
|
|
1439
|
+
"Modified": "2026-02-16T05:10:07.784Z",
|
|
1440
|
+
"Accessed": "2026-02-05T22:50:07.402Z",
|
|
1441
|
+
"Mode": 33188
|
|
1442
|
+
}
|
|
1443
|
+
},
|
|
1444
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package.json": {
|
|
1445
|
+
"UUID": "6412695b-89a6-4bd8-ad01-78095438d18b",
|
|
1446
|
+
"Type": "URI",
|
|
1447
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package.json",
|
|
1448
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package.json",
|
|
1449
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
1450
|
+
"Name": "package.json",
|
|
1451
|
+
"MimeType": "application/json",
|
|
1452
|
+
"Nature": "application",
|
|
1453
|
+
"Format": "json",
|
|
1454
|
+
"Schema": "PackageDotJSON",
|
|
1455
|
+
"Content": {
|
|
1456
|
+
"name": "orator",
|
|
1457
|
+
"version": "6.0.0",
|
|
1458
|
+
"description": "Unopinionated API http server abstraction - REST or IPC",
|
|
1459
|
+
"main": "source/Orator.js",
|
|
1460
|
+
"scripts": {
|
|
1461
|
+
"start": "node source/Orator.js",
|
|
1462
|
+
"coverage": "npx nyc --reporter=lcov --reporter=text-lcov ./node_modules/mocha/bin/_mocha -- -u tdd -R spec",
|
|
1463
|
+
"test": "npx mocha -u tdd -R spec",
|
|
1464
|
+
"build": "npx quack build",
|
|
1465
|
+
"docker-dev-build-image": "docker build ./ -f Dockerfile_LUXURYCode -t retold/orator:local",
|
|
1466
|
+
"docker-dev-run": "docker run -it -d --name orator-dev -p 15277:8080 -p 34566:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/orator\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" orator-image:local",
|
|
1467
|
+
"tests": "npx mocha -u tdd --exit -R spec --grep",
|
|
1468
|
+
"docker-dev-build": "docker build ./ -f Dockerfile_LUXURYCode -t orator-image:local",
|
|
1469
|
+
"docker-dev-shell": "docker exec -it orator-dev /bin/bash"
|
|
1470
|
+
},
|
|
1471
|
+
"browser": {
|
|
1472
|
+
"./source/Orator-Default-ServiceServer.js": "./source/Orator-Default-ServiceServer-Web.js"
|
|
1473
|
+
},
|
|
1474
|
+
"repository": {
|
|
1475
|
+
"type": "git",
|
|
1476
|
+
"url": "https://github.com/stevenvelozo/orator.git"
|
|
1477
|
+
},
|
|
1478
|
+
"keywords": [
|
|
1479
|
+
"rest",
|
|
1480
|
+
"api",
|
|
1481
|
+
"logging"
|
|
1482
|
+
],
|
|
1483
|
+
"author": "Steven Velozo <steven@velozo.com> (http://velozo.com/)",
|
|
1484
|
+
"license": "MIT",
|
|
1485
|
+
"bugs": {
|
|
1486
|
+
"url": "https://github.com/stevenvelozo/orator/issues"
|
|
1487
|
+
},
|
|
1488
|
+
"mocha": {
|
|
1489
|
+
"diff": true,
|
|
1490
|
+
"extension": [
|
|
1491
|
+
"js"
|
|
1492
|
+
],
|
|
1493
|
+
"package": "./package.json",
|
|
1494
|
+
"reporter": "spec",
|
|
1495
|
+
"slow": "75",
|
|
1496
|
+
"timeout": "5000",
|
|
1497
|
+
"ui": "tdd",
|
|
1498
|
+
"watch-files": [
|
|
1499
|
+
"source/**/*.js",
|
|
1500
|
+
"test/**/*.js"
|
|
1501
|
+
],
|
|
1502
|
+
"watch-ignore": [
|
|
1503
|
+
"lib/vendor"
|
|
1504
|
+
]
|
|
1505
|
+
},
|
|
1506
|
+
"homepage": "https://github.com/stevenvelozo/orator",
|
|
1507
|
+
"devDependencies": {
|
|
1508
|
+
"fable": "^3.1.53",
|
|
1509
|
+
"quackage": "^1.0.48"
|
|
1510
|
+
},
|
|
1511
|
+
"dependencies": {
|
|
1512
|
+
"fable-serviceproviderbase": "^3.0.17",
|
|
1513
|
+
"find-my-way": "^9.1.0",
|
|
1514
|
+
"orator-serviceserver-base": "^1.0.2",
|
|
1515
|
+
"orator-static-server": "^2.0.0"
|
|
1516
|
+
}
|
|
1517
|
+
},
|
|
1518
|
+
"Labels": [
|
|
1519
|
+
"__LABELSET_TYPE",
|
|
1520
|
+
"FILE",
|
|
1521
|
+
"__LABELSET_ADDRESS",
|
|
1522
|
+
"__LABELSET_NAME",
|
|
1523
|
+
"package",
|
|
1524
|
+
"__LABELSET_EXTENSION",
|
|
1525
|
+
".json",
|
|
1526
|
+
"__LABELSET_FILENAME",
|
|
1527
|
+
"package.json",
|
|
1528
|
+
"__LABELSET_FULLPATH",
|
|
1529
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/package.json",
|
|
1530
|
+
"__LABELSET_FORMAT",
|
|
1531
|
+
"json",
|
|
1532
|
+
"PackageDotJSON"
|
|
1533
|
+
],
|
|
1534
|
+
"FSTAT": {
|
|
1535
|
+
"Size": 2193,
|
|
1536
|
+
"Created": "2026-02-16T05:11:14.214Z",
|
|
1537
|
+
"Modified": "2026-02-16T05:11:14.214Z",
|
|
1538
|
+
"Accessed": "2026-02-16T05:11:25.259Z",
|
|
1539
|
+
"Mode": 33188
|
|
1540
|
+
}
|
|
1541
|
+
},
|
|
1542
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Browser-Shim.js": {
|
|
1543
|
+
"UUID": "4c22685e-971b-4a49-aca5-4b6d080c2685",
|
|
1544
|
+
"Type": "URI",
|
|
1545
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Browser-Shim.js",
|
|
1546
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Browser-Shim.js",
|
|
1547
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1548
|
+
"Name": "Orator-Browser-Shim.js",
|
|
1549
|
+
"MimeType": "application/javascript",
|
|
1550
|
+
"Nature": "application",
|
|
1551
|
+
"Format": "javascript",
|
|
1552
|
+
"Schema": "Default",
|
|
1553
|
+
"Content": false,
|
|
1554
|
+
"Labels": [
|
|
1555
|
+
"__LABELSET_TYPE",
|
|
1556
|
+
"FILE",
|
|
1557
|
+
"__LABELSET_ADDRESS",
|
|
1558
|
+
"source",
|
|
1559
|
+
"__LABELSET_NAME",
|
|
1560
|
+
"Orator",
|
|
1561
|
+
"Browser",
|
|
1562
|
+
"Shim",
|
|
1563
|
+
"__LABELSET_EXTENSION",
|
|
1564
|
+
".js",
|
|
1565
|
+
"__LABELSET_FILENAME",
|
|
1566
|
+
"Orator-Browser-Shim.js",
|
|
1567
|
+
"__LABELSET_FULLPATH",
|
|
1568
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Browser-Shim.js",
|
|
1569
|
+
"__LABELSET_FORMAT",
|
|
1570
|
+
"javascript",
|
|
1571
|
+
"Default"
|
|
1572
|
+
],
|
|
1573
|
+
"FSTAT": {
|
|
1574
|
+
"Size": 342,
|
|
1575
|
+
"Created": "2024-08-16T15:15:48.880Z",
|
|
1576
|
+
"Modified": "2024-08-16T15:15:48.880Z",
|
|
1577
|
+
"Accessed": "2024-08-16T15:15:49.448Z",
|
|
1578
|
+
"Mode": 33188
|
|
1579
|
+
}
|
|
1580
|
+
},
|
|
1581
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-Configuration.js": {
|
|
1582
|
+
"UUID": "be8057fe-b439-4849-9f44-3263ea011d6c",
|
|
1583
|
+
"Type": "URI",
|
|
1584
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-Configuration.js",
|
|
1585
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-Configuration.js",
|
|
1586
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1587
|
+
"Name": "Orator-Default-Configuration.js",
|
|
1588
|
+
"MimeType": "application/javascript",
|
|
1589
|
+
"Nature": "application",
|
|
1590
|
+
"Format": "javascript",
|
|
1591
|
+
"Schema": "Default",
|
|
1592
|
+
"Content": false,
|
|
1593
|
+
"Labels": [
|
|
1594
|
+
"__LABELSET_TYPE",
|
|
1595
|
+
"FILE",
|
|
1596
|
+
"__LABELSET_ADDRESS",
|
|
1597
|
+
"source",
|
|
1598
|
+
"__LABELSET_NAME",
|
|
1599
|
+
"Orator",
|
|
1600
|
+
"Default",
|
|
1601
|
+
"Configuration",
|
|
1602
|
+
"__LABELSET_EXTENSION",
|
|
1603
|
+
".js",
|
|
1604
|
+
"__LABELSET_FILENAME",
|
|
1605
|
+
"Orator-Default-Configuration.js",
|
|
1606
|
+
"__LABELSET_FULLPATH",
|
|
1607
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-Configuration.js",
|
|
1608
|
+
"__LABELSET_FORMAT",
|
|
1609
|
+
"javascript",
|
|
1610
|
+
"Default"
|
|
1611
|
+
],
|
|
1612
|
+
"FSTAT": {
|
|
1613
|
+
"Size": 179,
|
|
1614
|
+
"Created": "2024-08-16T15:15:48.880Z",
|
|
1615
|
+
"Modified": "2024-08-16T15:15:48.880Z",
|
|
1616
|
+
"Accessed": "2024-08-16T15:15:49.445Z",
|
|
1617
|
+
"Mode": 33188
|
|
1618
|
+
}
|
|
1619
|
+
},
|
|
1620
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer-Web.js": {
|
|
1621
|
+
"UUID": "2582e470-6cf7-4379-85f5-ec42613b6a21",
|
|
1622
|
+
"Type": "URI",
|
|
1623
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer-Web.js",
|
|
1624
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer-Web.js",
|
|
1625
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1626
|
+
"Name": "Orator-Default-ServiceServer-Web.js",
|
|
1627
|
+
"MimeType": "application/javascript",
|
|
1628
|
+
"Nature": "application",
|
|
1629
|
+
"Format": "javascript",
|
|
1630
|
+
"Schema": "Default",
|
|
1631
|
+
"Content": false,
|
|
1632
|
+
"Labels": [
|
|
1633
|
+
"__LABELSET_TYPE",
|
|
1634
|
+
"FILE",
|
|
1635
|
+
"__LABELSET_ADDRESS",
|
|
1636
|
+
"source",
|
|
1637
|
+
"__LABELSET_NAME",
|
|
1638
|
+
"Orator",
|
|
1639
|
+
"Default",
|
|
1640
|
+
"ServiceServer",
|
|
1641
|
+
"Web",
|
|
1642
|
+
"__LABELSET_EXTENSION",
|
|
1643
|
+
".js",
|
|
1644
|
+
"__LABELSET_FILENAME",
|
|
1645
|
+
"Orator-Default-ServiceServer-Web.js",
|
|
1646
|
+
"__LABELSET_FULLPATH",
|
|
1647
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer-Web.js",
|
|
1648
|
+
"__LABELSET_FORMAT",
|
|
1649
|
+
"javascript",
|
|
1650
|
+
"Default"
|
|
1651
|
+
],
|
|
1652
|
+
"FSTAT": {
|
|
1653
|
+
"Size": 89,
|
|
1654
|
+
"Created": "2024-08-16T15:15:48.881Z",
|
|
1655
|
+
"Modified": "2024-08-16T15:15:48.881Z",
|
|
1656
|
+
"Accessed": "2024-08-16T15:15:50.768Z",
|
|
1657
|
+
"Mode": 33188
|
|
1658
|
+
}
|
|
1659
|
+
},
|
|
1660
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer.js": {
|
|
1661
|
+
"UUID": "bfb10ca4-c0c3-4c38-9759-e9b2ebcb0610",
|
|
1662
|
+
"Type": "URI",
|
|
1663
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer.js",
|
|
1664
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer.js",
|
|
1665
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1666
|
+
"Name": "Orator-Default-ServiceServer.js",
|
|
1667
|
+
"MimeType": "application/javascript",
|
|
1668
|
+
"Nature": "application",
|
|
1669
|
+
"Format": "javascript",
|
|
1670
|
+
"Schema": "Default",
|
|
1671
|
+
"Content": false,
|
|
1672
|
+
"Labels": [
|
|
1673
|
+
"__LABELSET_TYPE",
|
|
1674
|
+
"FILE",
|
|
1675
|
+
"__LABELSET_ADDRESS",
|
|
1676
|
+
"source",
|
|
1677
|
+
"__LABELSET_NAME",
|
|
1678
|
+
"Orator",
|
|
1679
|
+
"Default",
|
|
1680
|
+
"ServiceServer",
|
|
1681
|
+
"__LABELSET_EXTENSION",
|
|
1682
|
+
".js",
|
|
1683
|
+
"__LABELSET_FILENAME",
|
|
1684
|
+
"Orator-Default-ServiceServer.js",
|
|
1685
|
+
"__LABELSET_FULLPATH",
|
|
1686
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-Default-ServiceServer.js",
|
|
1687
|
+
"__LABELSET_FORMAT",
|
|
1688
|
+
"javascript",
|
|
1689
|
+
"Default"
|
|
1690
|
+
],
|
|
1691
|
+
"FSTAT": {
|
|
1692
|
+
"Size": 89,
|
|
1693
|
+
"Created": "2024-08-16T15:15:48.881Z",
|
|
1694
|
+
"Modified": "2024-08-16T15:15:48.881Z",
|
|
1695
|
+
"Accessed": "2024-08-16T15:15:50.766Z",
|
|
1696
|
+
"Mode": 33188
|
|
1697
|
+
}
|
|
1698
|
+
},
|
|
1699
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC-SynthesizedResponse.js": {
|
|
1700
|
+
"UUID": "440f1dc5-65ca-46cc-8a58-0d8b981985dc",
|
|
1701
|
+
"Type": "URI",
|
|
1702
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC-SynthesizedResponse.js",
|
|
1703
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC-SynthesizedResponse.js",
|
|
1704
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1705
|
+
"Name": "Orator-ServiceServer-IPC-SynthesizedResponse.js",
|
|
1706
|
+
"MimeType": "application/javascript",
|
|
1707
|
+
"Nature": "application",
|
|
1708
|
+
"Format": "javascript",
|
|
1709
|
+
"Schema": "Default",
|
|
1710
|
+
"Content": false,
|
|
1711
|
+
"Labels": [
|
|
1712
|
+
"__LABELSET_TYPE",
|
|
1713
|
+
"FILE",
|
|
1714
|
+
"__LABELSET_ADDRESS",
|
|
1715
|
+
"source",
|
|
1716
|
+
"__LABELSET_NAME",
|
|
1717
|
+
"Orator",
|
|
1718
|
+
"ServiceServer",
|
|
1719
|
+
"IPC",
|
|
1720
|
+
"SynthesizedResponse",
|
|
1721
|
+
"__LABELSET_EXTENSION",
|
|
1722
|
+
".js",
|
|
1723
|
+
"__LABELSET_FILENAME",
|
|
1724
|
+
"Orator-ServiceServer-IPC-SynthesizedResponse.js",
|
|
1725
|
+
"__LABELSET_FULLPATH",
|
|
1726
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC-SynthesizedResponse.js",
|
|
1727
|
+
"__LABELSET_FORMAT",
|
|
1728
|
+
"javascript",
|
|
1729
|
+
"Default"
|
|
1730
|
+
],
|
|
1731
|
+
"FSTAT": {
|
|
1732
|
+
"Size": 1948,
|
|
1733
|
+
"Created": "2024-08-16T15:15:48.881Z",
|
|
1734
|
+
"Modified": "2024-08-16T17:17:47.263Z",
|
|
1735
|
+
"Accessed": "2024-08-16T19:44:30.568Z",
|
|
1736
|
+
"Mode": 33188
|
|
1737
|
+
}
|
|
1738
|
+
},
|
|
1739
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC.js": {
|
|
1740
|
+
"UUID": "6f7c4851-4541-4b5a-b5a7-c6a5121db953",
|
|
1741
|
+
"Type": "URI",
|
|
1742
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC.js",
|
|
1743
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC.js",
|
|
1744
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1745
|
+
"Name": "Orator-ServiceServer-IPC.js",
|
|
1746
|
+
"MimeType": "application/javascript",
|
|
1747
|
+
"Nature": "application",
|
|
1748
|
+
"Format": "javascript",
|
|
1749
|
+
"Schema": "Default",
|
|
1750
|
+
"Content": false,
|
|
1751
|
+
"Labels": [
|
|
1752
|
+
"__LABELSET_TYPE",
|
|
1753
|
+
"FILE",
|
|
1754
|
+
"__LABELSET_ADDRESS",
|
|
1755
|
+
"source",
|
|
1756
|
+
"__LABELSET_NAME",
|
|
1757
|
+
"Orator",
|
|
1758
|
+
"ServiceServer",
|
|
1759
|
+
"IPC",
|
|
1760
|
+
"__LABELSET_EXTENSION",
|
|
1761
|
+
".js",
|
|
1762
|
+
"__LABELSET_FILENAME",
|
|
1763
|
+
"Orator-ServiceServer-IPC.js",
|
|
1764
|
+
"__LABELSET_FULLPATH",
|
|
1765
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator-ServiceServer-IPC.js",
|
|
1766
|
+
"__LABELSET_FORMAT",
|
|
1767
|
+
"javascript",
|
|
1768
|
+
"Default"
|
|
1769
|
+
],
|
|
1770
|
+
"FSTAT": {
|
|
1771
|
+
"Size": 10476,
|
|
1772
|
+
"Created": "2024-08-16T15:15:48.881Z",
|
|
1773
|
+
"Modified": "2024-08-16T17:05:04.754Z",
|
|
1774
|
+
"Accessed": "2024-08-16T19:44:30.568Z",
|
|
1775
|
+
"Mode": 33188
|
|
1776
|
+
}
|
|
1777
|
+
},
|
|
1778
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator.js": {
|
|
1779
|
+
"UUID": "ab69ad9d-48b5-4168-8788-556742b96eae",
|
|
1780
|
+
"Type": "URI",
|
|
1781
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator.js",
|
|
1782
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator.js",
|
|
1783
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/source",
|
|
1784
|
+
"Name": "Orator.js",
|
|
1785
|
+
"MimeType": "application/javascript",
|
|
1786
|
+
"Nature": "application",
|
|
1787
|
+
"Format": "javascript",
|
|
1788
|
+
"Schema": "Default",
|
|
1789
|
+
"Content": false,
|
|
1790
|
+
"Labels": [
|
|
1791
|
+
"__LABELSET_TYPE",
|
|
1792
|
+
"FILE",
|
|
1793
|
+
"__LABELSET_ADDRESS",
|
|
1794
|
+
"source",
|
|
1795
|
+
"__LABELSET_NAME",
|
|
1796
|
+
"Orator",
|
|
1797
|
+
"__LABELSET_EXTENSION",
|
|
1798
|
+
".js",
|
|
1799
|
+
"__LABELSET_FILENAME",
|
|
1800
|
+
"Orator.js",
|
|
1801
|
+
"__LABELSET_FULLPATH",
|
|
1802
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/source/Orator.js",
|
|
1803
|
+
"__LABELSET_FORMAT",
|
|
1804
|
+
"javascript",
|
|
1805
|
+
"Default"
|
|
1806
|
+
],
|
|
1807
|
+
"FSTAT": {
|
|
1808
|
+
"Size": 13826,
|
|
1809
|
+
"Created": "2026-02-16T05:04:12.530Z",
|
|
1810
|
+
"Modified": "2026-02-16T05:04:12.530Z",
|
|
1811
|
+
"Accessed": "2026-02-16T05:06:58.232Z",
|
|
1812
|
+
"Mode": 33188
|
|
1813
|
+
}
|
|
1814
|
+
},
|
|
1815
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_basic_tests.js": {
|
|
1816
|
+
"UUID": "ac4b6ede-eab4-4e8d-b61d-577ae7c0b55f",
|
|
1817
|
+
"Type": "URI",
|
|
1818
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_basic_tests.js",
|
|
1819
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_basic_tests.js",
|
|
1820
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test",
|
|
1821
|
+
"Name": "Orator_basic_tests.js",
|
|
1822
|
+
"MimeType": "application/javascript",
|
|
1823
|
+
"Nature": "application",
|
|
1824
|
+
"Format": "javascript",
|
|
1825
|
+
"Schema": "Default",
|
|
1826
|
+
"Content": false,
|
|
1827
|
+
"Labels": [
|
|
1828
|
+
"__LABELSET_TYPE",
|
|
1829
|
+
"FILE",
|
|
1830
|
+
"__LABELSET_ADDRESS",
|
|
1831
|
+
"test",
|
|
1832
|
+
"__LABELSET_NAME",
|
|
1833
|
+
"Orator",
|
|
1834
|
+
"basic",
|
|
1835
|
+
"tests",
|
|
1836
|
+
"__LABELSET_EXTENSION",
|
|
1837
|
+
".js",
|
|
1838
|
+
"__LABELSET_FILENAME",
|
|
1839
|
+
"Orator_basic_tests.js",
|
|
1840
|
+
"__LABELSET_FULLPATH",
|
|
1841
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_basic_tests.js",
|
|
1842
|
+
"__LABELSET_FORMAT",
|
|
1843
|
+
"javascript",
|
|
1844
|
+
"Default"
|
|
1845
|
+
],
|
|
1846
|
+
"FSTAT": {
|
|
1847
|
+
"Size": 7695,
|
|
1848
|
+
"Created": "2024-08-16T15:15:48.882Z",
|
|
1849
|
+
"Modified": "2024-08-16T15:15:48.882Z",
|
|
1850
|
+
"Accessed": "2024-08-16T15:15:50.787Z",
|
|
1851
|
+
"Mode": 33188
|
|
1852
|
+
}
|
|
1853
|
+
},
|
|
1854
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_complex_routes_tests.js": {
|
|
1855
|
+
"UUID": "b2f0bd6c-1c0e-42c7-a89e-9ebbc4a40f09",
|
|
1856
|
+
"Type": "URI",
|
|
1857
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_complex_routes_tests.js",
|
|
1858
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_complex_routes_tests.js",
|
|
1859
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test",
|
|
1860
|
+
"Name": "Orator_complex_routes_tests.js",
|
|
1861
|
+
"MimeType": "application/javascript",
|
|
1862
|
+
"Nature": "application",
|
|
1863
|
+
"Format": "javascript",
|
|
1864
|
+
"Schema": "Default",
|
|
1865
|
+
"Content": false,
|
|
1866
|
+
"Labels": [
|
|
1867
|
+
"__LABELSET_TYPE",
|
|
1868
|
+
"FILE",
|
|
1869
|
+
"__LABELSET_ADDRESS",
|
|
1870
|
+
"test",
|
|
1871
|
+
"__LABELSET_NAME",
|
|
1872
|
+
"Orator",
|
|
1873
|
+
"complex",
|
|
1874
|
+
"routes",
|
|
1875
|
+
"tests",
|
|
1876
|
+
"__LABELSET_EXTENSION",
|
|
1877
|
+
".js",
|
|
1878
|
+
"__LABELSET_FILENAME",
|
|
1879
|
+
"Orator_complex_routes_tests.js",
|
|
1880
|
+
"__LABELSET_FULLPATH",
|
|
1881
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_complex_routes_tests.js",
|
|
1882
|
+
"__LABELSET_FORMAT",
|
|
1883
|
+
"javascript",
|
|
1884
|
+
"Default"
|
|
1885
|
+
],
|
|
1886
|
+
"FSTAT": {
|
|
1887
|
+
"Size": 28946,
|
|
1888
|
+
"Created": "2026-02-05T22:52:14.716Z",
|
|
1889
|
+
"Modified": "2026-02-05T22:52:14.716Z",
|
|
1890
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1891
|
+
"Mode": 33188
|
|
1892
|
+
}
|
|
1893
|
+
},
|
|
1894
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_static_serving_tests.js": {
|
|
1895
|
+
"UUID": "5538bb1c-506e-4845-8c05-d0b4f1403948",
|
|
1896
|
+
"Type": "URI",
|
|
1897
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_static_serving_tests.js",
|
|
1898
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_static_serving_tests.js",
|
|
1899
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test",
|
|
1900
|
+
"Name": "Orator_static_serving_tests.js",
|
|
1901
|
+
"MimeType": "application/javascript",
|
|
1902
|
+
"Nature": "application",
|
|
1903
|
+
"Format": "javascript",
|
|
1904
|
+
"Schema": "Default",
|
|
1905
|
+
"Content": false,
|
|
1906
|
+
"Labels": [
|
|
1907
|
+
"__LABELSET_TYPE",
|
|
1908
|
+
"FILE",
|
|
1909
|
+
"__LABELSET_ADDRESS",
|
|
1910
|
+
"test",
|
|
1911
|
+
"__LABELSET_NAME",
|
|
1912
|
+
"Orator",
|
|
1913
|
+
"static",
|
|
1914
|
+
"serving",
|
|
1915
|
+
"tests",
|
|
1916
|
+
"__LABELSET_EXTENSION",
|
|
1917
|
+
".js",
|
|
1918
|
+
"__LABELSET_FILENAME",
|
|
1919
|
+
"Orator_static_serving_tests.js",
|
|
1920
|
+
"__LABELSET_FULLPATH",
|
|
1921
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/Orator_static_serving_tests.js",
|
|
1922
|
+
"__LABELSET_FORMAT",
|
|
1923
|
+
"javascript",
|
|
1924
|
+
"Default"
|
|
1925
|
+
],
|
|
1926
|
+
"FSTAT": {
|
|
1927
|
+
"Size": 45253,
|
|
1928
|
+
"Created": "2026-02-16T05:02:16.393Z",
|
|
1929
|
+
"Modified": "2026-02-16T05:02:16.394Z",
|
|
1930
|
+
"Accessed": "2026-02-16T05:06:58.233Z",
|
|
1931
|
+
"Mode": 33188
|
|
1932
|
+
}
|
|
1933
|
+
},
|
|
1934
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/about.html": {
|
|
1935
|
+
"UUID": "7a90cbf7-5817-4d12-aaa5-6a59fbaeaa44",
|
|
1936
|
+
"Type": "URI",
|
|
1937
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/about.html",
|
|
1938
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/about.html",
|
|
1939
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content",
|
|
1940
|
+
"Name": "about.html",
|
|
1941
|
+
"MimeType": "text/html",
|
|
1942
|
+
"Nature": "text",
|
|
1943
|
+
"Format": "html",
|
|
1944
|
+
"Schema": "Default",
|
|
1945
|
+
"Content": false,
|
|
1946
|
+
"Labels": [
|
|
1947
|
+
"__LABELSET_TYPE",
|
|
1948
|
+
"FILE",
|
|
1949
|
+
"__LABELSET_ADDRESS",
|
|
1950
|
+
"test",
|
|
1951
|
+
"static_content",
|
|
1952
|
+
"__LABELSET_NAME",
|
|
1953
|
+
"about",
|
|
1954
|
+
"__LABELSET_EXTENSION",
|
|
1955
|
+
".html",
|
|
1956
|
+
"__LABELSET_FILENAME",
|
|
1957
|
+
"about.html",
|
|
1958
|
+
"__LABELSET_FULLPATH",
|
|
1959
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/about.html",
|
|
1960
|
+
"__LABELSET_FORMAT",
|
|
1961
|
+
"html",
|
|
1962
|
+
"Default"
|
|
1963
|
+
],
|
|
1964
|
+
"FSTAT": {
|
|
1965
|
+
"Size": 78,
|
|
1966
|
+
"Created": "2026-02-05T22:50:06.931Z",
|
|
1967
|
+
"Modified": "2026-02-05T22:50:06.931Z",
|
|
1968
|
+
"Accessed": "2026-02-05T22:59:25.647Z",
|
|
1969
|
+
"Mode": 33188
|
|
1970
|
+
}
|
|
1971
|
+
},
|
|
1972
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/data.json": {
|
|
1973
|
+
"UUID": "3ac66ca9-e8ac-480b-8b17-5affed8f7ee6",
|
|
1974
|
+
"Type": "URI",
|
|
1975
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/data.json",
|
|
1976
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/data.json",
|
|
1977
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content",
|
|
1978
|
+
"Name": "data.json",
|
|
1979
|
+
"MimeType": "application/json",
|
|
1980
|
+
"Nature": "application",
|
|
1981
|
+
"Format": "json",
|
|
1982
|
+
"Schema": "Default",
|
|
1983
|
+
"Content": false,
|
|
1984
|
+
"Labels": [
|
|
1985
|
+
"__LABELSET_TYPE",
|
|
1986
|
+
"FILE",
|
|
1987
|
+
"__LABELSET_ADDRESS",
|
|
1988
|
+
"test",
|
|
1989
|
+
"static_content",
|
|
1990
|
+
"__LABELSET_NAME",
|
|
1991
|
+
"data",
|
|
1992
|
+
"__LABELSET_EXTENSION",
|
|
1993
|
+
".json",
|
|
1994
|
+
"__LABELSET_FILENAME",
|
|
1995
|
+
"data.json",
|
|
1996
|
+
"__LABELSET_FULLPATH",
|
|
1997
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/data.json",
|
|
1998
|
+
"__LABELSET_FORMAT",
|
|
1999
|
+
"json",
|
|
2000
|
+
"Default"
|
|
2001
|
+
],
|
|
2002
|
+
"FSTAT": {
|
|
2003
|
+
"Size": 42,
|
|
2004
|
+
"Created": "2026-02-05T22:50:06.043Z",
|
|
2005
|
+
"Modified": "2026-02-05T22:50:06.043Z",
|
|
2006
|
+
"Accessed": "2026-02-05T22:59:25.648Z",
|
|
2007
|
+
"Mode": 33188
|
|
2008
|
+
}
|
|
2009
|
+
},
|
|
2010
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/index.html": {
|
|
2011
|
+
"UUID": "5ef17134-6605-4770-b698-e9c05a114c69",
|
|
2012
|
+
"Type": "URI",
|
|
2013
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/index.html",
|
|
2014
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/index.html",
|
|
2015
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content",
|
|
2016
|
+
"Name": "index.html",
|
|
2017
|
+
"MimeType": "text/html",
|
|
2018
|
+
"Nature": "text",
|
|
2019
|
+
"Format": "html",
|
|
2020
|
+
"Schema": "Default",
|
|
2021
|
+
"Content": false,
|
|
2022
|
+
"Labels": [
|
|
2023
|
+
"__LABELSET_TYPE",
|
|
2024
|
+
"FILE",
|
|
2025
|
+
"__LABELSET_ADDRESS",
|
|
2026
|
+
"test",
|
|
2027
|
+
"static_content",
|
|
2028
|
+
"__LABELSET_NAME",
|
|
2029
|
+
"index",
|
|
2030
|
+
"__LABELSET_EXTENSION",
|
|
2031
|
+
".html",
|
|
2032
|
+
"__LABELSET_FILENAME",
|
|
2033
|
+
"index.html",
|
|
2034
|
+
"__LABELSET_FULLPATH",
|
|
2035
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/index.html",
|
|
2036
|
+
"__LABELSET_FORMAT",
|
|
2037
|
+
"html",
|
|
2038
|
+
"Default"
|
|
2039
|
+
],
|
|
2040
|
+
"FSTAT": {
|
|
2041
|
+
"Size": 91,
|
|
2042
|
+
"Created": "2026-02-05T22:50:04.306Z",
|
|
2043
|
+
"Modified": "2026-02-05T22:50:04.306Z",
|
|
2044
|
+
"Accessed": "2026-02-05T22:59:25.648Z",
|
|
2045
|
+
"Mode": 33188
|
|
2046
|
+
}
|
|
2047
|
+
},
|
|
2048
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/style.css": {
|
|
2049
|
+
"UUID": "2d55127a-c90b-43cf-833b-ae675ae0e5cf",
|
|
2050
|
+
"Type": "URI",
|
|
2051
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/style.css",
|
|
2052
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/style.css",
|
|
2053
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content",
|
|
2054
|
+
"Name": "style.css",
|
|
2055
|
+
"MimeType": "text/css",
|
|
2056
|
+
"Nature": "text",
|
|
2057
|
+
"Format": "css",
|
|
2058
|
+
"Schema": "Default",
|
|
2059
|
+
"Content": false,
|
|
2060
|
+
"Labels": [
|
|
2061
|
+
"__LABELSET_TYPE",
|
|
2062
|
+
"FILE",
|
|
2063
|
+
"__LABELSET_ADDRESS",
|
|
2064
|
+
"test",
|
|
2065
|
+
"static_content",
|
|
2066
|
+
"__LABELSET_NAME",
|
|
2067
|
+
"style",
|
|
2068
|
+
"__LABELSET_EXTENSION",
|
|
2069
|
+
".css",
|
|
2070
|
+
"__LABELSET_FILENAME",
|
|
2071
|
+
"style.css",
|
|
2072
|
+
"__LABELSET_FULLPATH",
|
|
2073
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/style.css",
|
|
2074
|
+
"__LABELSET_FORMAT",
|
|
2075
|
+
"css",
|
|
2076
|
+
"Default"
|
|
2077
|
+
],
|
|
2078
|
+
"FSTAT": {
|
|
2079
|
+
"Size": 47,
|
|
2080
|
+
"Created": "2026-02-05T22:50:05.122Z",
|
|
2081
|
+
"Modified": "2026-02-05T22:50:05.122Z",
|
|
2082
|
+
"Accessed": "2026-02-05T22:59:25.648Z",
|
|
2083
|
+
"Mode": 33188
|
|
2084
|
+
}
|
|
2085
|
+
},
|
|
2086
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/subsite/index.html": {
|
|
2087
|
+
"UUID": "fd4d7f3e-8cf4-40e1-b754-3335cb57bf3c",
|
|
2088
|
+
"Type": "URI",
|
|
2089
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/subsite/index.html",
|
|
2090
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/subsite/index.html",
|
|
2091
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/subsite",
|
|
2092
|
+
"Name": "index.html",
|
|
2093
|
+
"MimeType": "text/html",
|
|
2094
|
+
"Nature": "text",
|
|
2095
|
+
"Format": "html",
|
|
2096
|
+
"Schema": "Default",
|
|
2097
|
+
"Content": false,
|
|
2098
|
+
"Labels": [
|
|
2099
|
+
"__LABELSET_TYPE",
|
|
2100
|
+
"FILE",
|
|
2101
|
+
"__LABELSET_ADDRESS",
|
|
2102
|
+
"test",
|
|
2103
|
+
"static_content",
|
|
2104
|
+
"subsite",
|
|
2105
|
+
"__LABELSET_NAME",
|
|
2106
|
+
"index",
|
|
2107
|
+
"__LABELSET_EXTENSION",
|
|
2108
|
+
".html",
|
|
2109
|
+
"__LABELSET_FILENAME",
|
|
2110
|
+
"index.html",
|
|
2111
|
+
"__LABELSET_FULLPATH",
|
|
2112
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test/static_content/subsite/index.html",
|
|
2113
|
+
"__LABELSET_FORMAT",
|
|
2114
|
+
"html",
|
|
2115
|
+
"Default"
|
|
2116
|
+
],
|
|
2117
|
+
"FSTAT": {
|
|
2118
|
+
"Size": 80,
|
|
2119
|
+
"Created": "2026-02-05T22:50:07.928Z",
|
|
2120
|
+
"Modified": "2026-02-05T22:50:07.928Z",
|
|
2121
|
+
"Accessed": "2026-02-05T22:59:25.648Z",
|
|
2122
|
+
"Mode": 33188
|
|
2123
|
+
}
|
|
2124
|
+
},
|
|
2125
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator-proxy_tests.js": {
|
|
2126
|
+
"UUID": "65b9fcac-1999-4bc1-ae53-38d3b887777e",
|
|
2127
|
+
"Type": "URI",
|
|
2128
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator-proxy_tests.js",
|
|
2129
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator-proxy_tests.js",
|
|
2130
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy",
|
|
2131
|
+
"Name": "Orator-proxy_tests.js",
|
|
2132
|
+
"MimeType": "application/javascript",
|
|
2133
|
+
"Nature": "application",
|
|
2134
|
+
"Format": "javascript",
|
|
2135
|
+
"Schema": "Default",
|
|
2136
|
+
"Content": false,
|
|
2137
|
+
"Labels": [
|
|
2138
|
+
"__LABELSET_TYPE",
|
|
2139
|
+
"FILE",
|
|
2140
|
+
"__LABELSET_ADDRESS",
|
|
2141
|
+
"test_legacy",
|
|
2142
|
+
"__LABELSET_NAME",
|
|
2143
|
+
"Orator",
|
|
2144
|
+
"proxy",
|
|
2145
|
+
"tests",
|
|
2146
|
+
"__LABELSET_EXTENSION",
|
|
2147
|
+
".js",
|
|
2148
|
+
"__LABELSET_FILENAME",
|
|
2149
|
+
"Orator-proxy_tests.js",
|
|
2150
|
+
"__LABELSET_FULLPATH",
|
|
2151
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator-proxy_tests.js",
|
|
2152
|
+
"__LABELSET_FORMAT",
|
|
2153
|
+
"javascript",
|
|
2154
|
+
"Default"
|
|
2155
|
+
],
|
|
2156
|
+
"FSTAT": {
|
|
2157
|
+
"Size": 4586,
|
|
2158
|
+
"Created": "2024-08-16T15:15:48.882Z",
|
|
2159
|
+
"Modified": "2024-08-16T15:15:48.882Z",
|
|
2160
|
+
"Accessed": "2024-08-16T15:15:50.786Z",
|
|
2161
|
+
"Mode": 33188
|
|
2162
|
+
}
|
|
2163
|
+
},
|
|
2164
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_basic_tests.js": {
|
|
2165
|
+
"UUID": "3bf8d66e-6a49-454e-8d6a-bab83af10f4b",
|
|
2166
|
+
"Type": "URI",
|
|
2167
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_basic_tests.js",
|
|
2168
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_basic_tests.js",
|
|
2169
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy",
|
|
2170
|
+
"Name": "Orator_basic_tests.js",
|
|
2171
|
+
"MimeType": "application/javascript",
|
|
2172
|
+
"Nature": "application",
|
|
2173
|
+
"Format": "javascript",
|
|
2174
|
+
"Schema": "Default",
|
|
2175
|
+
"Content": false,
|
|
2176
|
+
"Labels": [
|
|
2177
|
+
"__LABELSET_TYPE",
|
|
2178
|
+
"FILE",
|
|
2179
|
+
"__LABELSET_ADDRESS",
|
|
2180
|
+
"test_legacy",
|
|
2181
|
+
"__LABELSET_NAME",
|
|
2182
|
+
"Orator",
|
|
2183
|
+
"basic",
|
|
2184
|
+
"tests",
|
|
2185
|
+
"__LABELSET_EXTENSION",
|
|
2186
|
+
".js",
|
|
2187
|
+
"__LABELSET_FILENAME",
|
|
2188
|
+
"Orator_basic_tests.js",
|
|
2189
|
+
"__LABELSET_FULLPATH",
|
|
2190
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_basic_tests.js",
|
|
2191
|
+
"__LABELSET_FORMAT",
|
|
2192
|
+
"javascript",
|
|
2193
|
+
"Default"
|
|
2194
|
+
],
|
|
2195
|
+
"FSTAT": {
|
|
2196
|
+
"Size": 6643,
|
|
2197
|
+
"Created": "2024-08-16T15:15:48.882Z",
|
|
2198
|
+
"Modified": "2024-08-16T15:15:48.882Z",
|
|
2199
|
+
"Accessed": "2024-08-16T15:15:50.793Z",
|
|
2200
|
+
"Mode": 33188
|
|
2201
|
+
}
|
|
2202
|
+
},
|
|
2203
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_cluster_test.js.deferred": {
|
|
2204
|
+
"UUID": "752e9607-90ac-4894-a590-dde24f03ff4d",
|
|
2205
|
+
"Type": "URI",
|
|
2206
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_cluster_test.js.deferred",
|
|
2207
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_cluster_test.js.deferred",
|
|
2208
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy",
|
|
2209
|
+
"Name": "Orator_cluster_test.js.deferred",
|
|
2210
|
+
"MimeType": null,
|
|
2211
|
+
"Nature": "UNKNOWN",
|
|
2212
|
+
"Format": "UNKNOWN",
|
|
2213
|
+
"Schema": "Default",
|
|
2214
|
+
"Content": false,
|
|
2215
|
+
"Labels": [
|
|
2216
|
+
"__LABELSET_TYPE",
|
|
2217
|
+
"FILE",
|
|
2218
|
+
"__LABELSET_ADDRESS",
|
|
2219
|
+
"test_legacy",
|
|
2220
|
+
"__LABELSET_NAME",
|
|
2221
|
+
"Orator",
|
|
2222
|
+
"cluster",
|
|
2223
|
+
"test",
|
|
2224
|
+
"js",
|
|
2225
|
+
"__LABELSET_EXTENSION",
|
|
2226
|
+
".deferred",
|
|
2227
|
+
"__LABELSET_FILENAME",
|
|
2228
|
+
"Orator_cluster_test.js.deferred",
|
|
2229
|
+
"__LABELSET_FULLPATH",
|
|
2230
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_cluster_test.js.deferred",
|
|
2231
|
+
"__LABELSET_FORMAT",
|
|
2232
|
+
"UNKNOWN",
|
|
2233
|
+
"Default"
|
|
2234
|
+
],
|
|
2235
|
+
"FSTAT": {
|
|
2236
|
+
"Size": 5316,
|
|
2237
|
+
"Created": "2024-08-16T15:15:48.882Z",
|
|
2238
|
+
"Modified": "2024-08-16T15:15:48.882Z",
|
|
2239
|
+
"Accessed": "2024-08-16T15:15:51.350Z",
|
|
2240
|
+
"Mode": 33188
|
|
2241
|
+
}
|
|
2242
|
+
},
|
|
2243
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_logging_tests.js": {
|
|
2244
|
+
"UUID": "71c1a04a-c292-46b3-b384-6ba1ab2b02c5",
|
|
2245
|
+
"Type": "URI",
|
|
2246
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_logging_tests.js",
|
|
2247
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_logging_tests.js",
|
|
2248
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy",
|
|
2249
|
+
"Name": "Orator_logging_tests.js",
|
|
2250
|
+
"MimeType": "application/javascript",
|
|
2251
|
+
"Nature": "application",
|
|
2252
|
+
"Format": "javascript",
|
|
2253
|
+
"Schema": "Default",
|
|
2254
|
+
"Content": false,
|
|
2255
|
+
"Labels": [
|
|
2256
|
+
"__LABELSET_TYPE",
|
|
2257
|
+
"FILE",
|
|
2258
|
+
"__LABELSET_ADDRESS",
|
|
2259
|
+
"test_legacy",
|
|
2260
|
+
"__LABELSET_NAME",
|
|
2261
|
+
"Orator",
|
|
2262
|
+
"logging",
|
|
2263
|
+
"tests",
|
|
2264
|
+
"__LABELSET_EXTENSION",
|
|
2265
|
+
".js",
|
|
2266
|
+
"__LABELSET_FILENAME",
|
|
2267
|
+
"Orator_logging_tests.js",
|
|
2268
|
+
"__LABELSET_FULLPATH",
|
|
2269
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Orator_logging_tests.js",
|
|
2270
|
+
"__LABELSET_FORMAT",
|
|
2271
|
+
"javascript",
|
|
2272
|
+
"Default"
|
|
2273
|
+
],
|
|
2274
|
+
"FSTAT": {
|
|
2275
|
+
"Size": 3939,
|
|
2276
|
+
"Created": "2024-08-16T15:15:48.882Z",
|
|
2277
|
+
"Modified": "2024-08-16T15:15:48.883Z",
|
|
2278
|
+
"Accessed": "2024-08-16T15:15:50.787Z",
|
|
2279
|
+
"Mode": 33188
|
|
2280
|
+
}
|
|
2281
|
+
},
|
|
2282
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.css": {
|
|
2283
|
+
"UUID": "f173d454-d874-4229-ac9c-70f5b6061f5e",
|
|
2284
|
+
"Type": "URI",
|
|
2285
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.css",
|
|
2286
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.css",
|
|
2287
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy",
|
|
2288
|
+
"Name": "Test.css",
|
|
2289
|
+
"MimeType": "text/css",
|
|
2290
|
+
"Nature": "text",
|
|
2291
|
+
"Format": "css",
|
|
2292
|
+
"Schema": "Default",
|
|
2293
|
+
"Content": false,
|
|
2294
|
+
"Labels": [
|
|
2295
|
+
"__LABELSET_TYPE",
|
|
2296
|
+
"FILE",
|
|
2297
|
+
"__LABELSET_ADDRESS",
|
|
2298
|
+
"test_legacy",
|
|
2299
|
+
"__LABELSET_NAME",
|
|
2300
|
+
"Test",
|
|
2301
|
+
"__LABELSET_EXTENSION",
|
|
2302
|
+
".css",
|
|
2303
|
+
"__LABELSET_FILENAME",
|
|
2304
|
+
"Test.css",
|
|
2305
|
+
"__LABELSET_FULLPATH",
|
|
2306
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.css",
|
|
2307
|
+
"__LABELSET_FORMAT",
|
|
2308
|
+
"css",
|
|
2309
|
+
"Default"
|
|
2310
|
+
],
|
|
2311
|
+
"FSTAT": {
|
|
2312
|
+
"Size": 34,
|
|
2313
|
+
"Created": "2024-08-16T15:15:48.883Z",
|
|
2314
|
+
"Modified": "2024-08-16T15:15:48.883Z",
|
|
2315
|
+
"Accessed": "2024-08-16T15:15:51.341Z",
|
|
2316
|
+
"Mode": 33188
|
|
2317
|
+
}
|
|
2318
|
+
},
|
|
2319
|
+
"URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.html": {
|
|
2320
|
+
"UUID": "9fd107f9-ae04-4725-8bd1-748b37ced101",
|
|
2321
|
+
"Type": "URI",
|
|
2322
|
+
"Hash": "URI~CONTENT~FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.html",
|
|
2323
|
+
"Path": "FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.html",
|
|
2324
|
+
"Location": "/Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy",
|
|
2325
|
+
"Name": "Test.html",
|
|
2326
|
+
"MimeType": "text/html",
|
|
2327
|
+
"Nature": "text",
|
|
2328
|
+
"Format": "html",
|
|
2329
|
+
"Schema": "Default",
|
|
2330
|
+
"Content": false,
|
|
2331
|
+
"Labels": [
|
|
2332
|
+
"__LABELSET_TYPE",
|
|
2333
|
+
"FILE",
|
|
2334
|
+
"__LABELSET_ADDRESS",
|
|
2335
|
+
"test_legacy",
|
|
2336
|
+
"__LABELSET_NAME",
|
|
2337
|
+
"Test",
|
|
2338
|
+
"__LABELSET_EXTENSION",
|
|
2339
|
+
".html",
|
|
2340
|
+
"__LABELSET_FILENAME",
|
|
2341
|
+
"Test.html",
|
|
2342
|
+
"__LABELSET_FULLPATH",
|
|
2343
|
+
"FILE://Users/stevenvelozo/Code/retold/modules/orator/orator/test_legacy/Test.html",
|
|
2344
|
+
"__LABELSET_FORMAT",
|
|
2345
|
+
"html",
|
|
2346
|
+
"Default"
|
|
2347
|
+
],
|
|
2348
|
+
"FSTAT": {
|
|
2349
|
+
"Size": 41,
|
|
2350
|
+
"Created": "2024-08-16T15:15:48.883Z",
|
|
2351
|
+
"Modified": "2024-08-16T15:15:48.883Z",
|
|
2352
|
+
"Accessed": "2024-08-16T15:15:52.536Z",
|
|
2353
|
+
"Mode": 33188
|
|
2354
|
+
}
|
|
2355
|
+
}
|
|
2356
|
+
},
|
|
2357
|
+
"RootFolder": "/Users/stevenvelozo/Code/retold/modules/orator/orator",
|
|
2358
|
+
"AdditionalScanFolders": [],
|
|
2359
|
+
"OutputFolderPath": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist",
|
|
2360
|
+
"StageFolderPath": "/Users/stevenvelozo/Code/retold/modules/orator/orator/dist/indoctrinate_content_staging",
|
|
2361
|
+
"TargetFilter": false,
|
|
2362
|
+
"WriteCatalogFile": true,
|
|
2363
|
+
"IgnoreUnknownTypes": false
|
|
2364
|
+
}
|