alchemymvc 1.3.22 → 1.4.0-alpha.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.
Files changed (155) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -3
  3. package/lib/app/behaviour/publishable_behaviour.js +5 -5
  4. package/lib/app/behaviour/revision_behaviour.js +96 -59
  5. package/lib/app/behaviour/sluggable_behaviour.js +14 -14
  6. package/lib/app/conduit/electron_conduit.js +9 -9
  7. package/lib/app/conduit/http_conduit.js +13 -13
  8. package/lib/app/conduit/loopback_conduit.js +15 -15
  9. package/lib/app/conduit/socket_conduit.js +43 -43
  10. package/lib/app/config/routes.js +26 -0
  11. package/lib/app/controller/00-default_app_controller.js +21 -0
  12. package/lib/app/controller/alchemy_info_controller.js +12 -12
  13. package/lib/app/datasource/mongo_datasource.js +27 -18
  14. package/lib/app/element/00-default_app_element.js +19 -0
  15. package/lib/app/element/time_ago.js +5 -5
  16. package/lib/app/helper/00-default_app_helper.js +11 -0
  17. package/lib/app/helper/alchemy_helper.js +22 -22
  18. package/lib/app/helper/backed_map.js +1 -1
  19. package/lib/app/helper/breadcrumb.js +10 -10
  20. package/lib/app/helper/client_collection.js +3 -3
  21. package/lib/app/helper/cron.js +29 -29
  22. package/lib/app/helper/enum_values.js +6 -6
  23. package/lib/app/helper/pagination_helper.js +36 -36
  24. package/lib/app/helper/router_helper.js +35 -35
  25. package/lib/app/helper/socket_helper.js +57 -57
  26. package/lib/app/helper/syncable.js +62 -62
  27. package/lib/app/helper_component/paginate_component.js +9 -9
  28. package/lib/app/helper_controller/component.js +1 -1
  29. package/lib/app/helper_controller/conduit.js +31 -31
  30. package/lib/app/helper_controller/controller.js +54 -39
  31. package/lib/app/helper_datasource/00-nosql_datasource.js +624 -70
  32. package/lib/app/helper_datasource/05-fallback_datasource.js +10 -10
  33. package/lib/app/helper_datasource/idb_datasource.js +6 -6
  34. package/lib/app/helper_datasource/indexed_db.js +22 -22
  35. package/lib/app/helper_datasource/remote_datasource.js +5 -5
  36. package/lib/app/helper_error/http_error.js +4 -4
  37. package/lib/app/helper_error/model_error.js +2 -2
  38. package/lib/app/helper_error/validation_error.js +12 -12
  39. package/lib/app/helper_field/00-objectid_field.js +7 -7
  40. package/lib/app/helper_field/05-string_field.js +16 -12
  41. package/lib/app/helper_field/06-text_field.js +2 -4
  42. package/lib/app/helper_field/10-number_field.js +9 -12
  43. package/lib/app/helper_field/11-date_field.js +15 -15
  44. package/lib/app/helper_field/15-local_temporal_field.js +10 -10
  45. package/lib/app/helper_field/20-decimal_field.js +8 -9
  46. package/lib/app/helper_field/belongsto_field.js +1 -1
  47. package/lib/app/helper_field/big_int_field.js +8 -8
  48. package/lib/app/helper_field/boolean_field.js +9 -11
  49. package/lib/app/helper_field/datetime_field.js +3 -3
  50. package/lib/app/helper_field/enum_field.js +13 -8
  51. package/lib/app/helper_field/fixed_decimal_field.js +6 -7
  52. package/lib/app/helper_field/geopoint_field.js +9 -10
  53. package/lib/app/helper_field/habtm_field.js +3 -3
  54. package/lib/app/helper_field/hasoneparent_field.js +1 -1
  55. package/lib/app/helper_field/html_field.js +2 -4
  56. package/lib/app/helper_field/integer_field.js +8 -11
  57. package/lib/app/helper_field/local_date_field.js +5 -5
  58. package/lib/app/helper_field/local_date_time_field.js +5 -5
  59. package/lib/app/helper_field/local_time_field.js +5 -5
  60. package/lib/app/helper_field/mixed_field.js +5 -5
  61. package/lib/app/helper_field/object_field.js +6 -6
  62. package/lib/app/helper_field/password_field.js +3 -3
  63. package/lib/app/helper_field/regexp_field.js +7 -9
  64. package/lib/app/helper_field/schema_field.js +91 -88
  65. package/lib/app/helper_field/settings_field.js +92 -0
  66. package/lib/app/helper_field/time_field.js +6 -6
  67. package/lib/app/helper_field/url_field.js +2 -4
  68. package/lib/app/helper_model/00-base_criteria.js +662 -0
  69. package/lib/app/helper_model/05-criteria_expressions.js +605 -0
  70. package/lib/app/helper_model/10-model_criteria.js +1182 -0
  71. package/lib/app/helper_model/data_provider.js +2 -2
  72. package/lib/app/helper_model/document.js +103 -92
  73. package/lib/app/helper_model/document_list.js +14 -14
  74. package/lib/app/helper_model/field_config.js +11 -11
  75. package/lib/app/helper_model/field_set.js +17 -17
  76. package/lib/app/helper_model/model.js +201 -123
  77. package/lib/app/helper_model/remote_data_provider.js +2 -2
  78. package/lib/app/helper_validator/00_validator.js +16 -16
  79. package/lib/app/helper_validator/not_empty_validator.js +9 -9
  80. package/lib/app/model/00-default_app_model.js +18 -0
  81. package/lib/app/model/05-system_model.js +27 -0
  82. package/lib/app/model/{alchemy_migration_model.js → system_migration_model.js} +4 -4
  83. package/lib/app/model/system_setting_model.js +154 -0
  84. package/lib/app/model/{alchemy_task_history_model.js → system_task_history_model.js} +7 -7
  85. package/lib/app/model/{alchemy_task_model.js → system_task_model.js} +11 -11
  86. package/lib/bootstrap.js +22 -312
  87. package/lib/class/accumulator.js +5 -5
  88. package/lib/class/behaviour.js +5 -5
  89. package/lib/class/component.js +3 -3
  90. package/lib/class/conduit.js +152 -150
  91. package/lib/class/controller.js +42 -42
  92. package/lib/class/datasource.js +74 -79
  93. package/lib/class/document.js +74 -95
  94. package/lib/class/document_list.js +5 -5
  95. package/lib/class/element.js +17 -17
  96. package/lib/class/error.js +3 -3
  97. package/lib/class/field.js +169 -91
  98. package/lib/class/field_value.js +6 -6
  99. package/lib/class/helper.js +3 -3
  100. package/lib/class/inode.js +17 -17
  101. package/lib/class/inode_dir.js +12 -12
  102. package/lib/class/inode_file.js +26 -26
  103. package/lib/class/inode_list.js +4 -4
  104. package/lib/class/migration.js +4 -4
  105. package/lib/class/model.js +146 -165
  106. package/lib/class/path_definition.js +22 -22
  107. package/lib/class/path_evaluator.js +5 -5
  108. package/lib/class/path_param_definition.js +7 -7
  109. package/lib/class/plugin.js +312 -0
  110. package/lib/class/postponement.js +29 -29
  111. package/lib/class/reciprocal.js +8 -8
  112. package/lib/class/route.js +33 -33
  113. package/lib/class/router.js +73 -73
  114. package/lib/class/schema.js +21 -21
  115. package/lib/class/schema_client.js +105 -82
  116. package/lib/class/session.js +63 -29
  117. package/lib/class/session_scene.js +4 -4
  118. package/lib/class/sitemap.js +16 -16
  119. package/lib/class/task.js +39 -39
  120. package/lib/class/task_service.js +43 -47
  121. package/lib/{init → core}/alchemy.js +411 -373
  122. package/lib/{init/functions.js → core/alchemy_functions.js} +113 -91
  123. package/lib/core/alchemy_load_functions.js +715 -0
  124. package/lib/core/base.js +50 -62
  125. package/lib/core/client_alchemy.js +144 -152
  126. package/lib/core/client_base.js +27 -50
  127. package/lib/core/discovery.js +16 -18
  128. package/lib/core/middleware.js +54 -43
  129. package/lib/core/{routing.js → prefix.js} +14 -16
  130. package/lib/core/setting.js +1684 -0
  131. package/lib/core/stage.js +758 -0
  132. package/lib/scripts/create_constants.js +119 -0
  133. package/lib/{init/languages.js → scripts/create_languages.js} +5 -5
  134. package/lib/scripts/create_settings.js +449 -0
  135. package/lib/scripts/create_shared_constants.js +95 -0
  136. package/lib/scripts/create_stages.js +55 -0
  137. package/lib/scripts/init_alchemy.js +51 -0
  138. package/lib/{init/requirements.js → scripts/preload_modules.js} +15 -2
  139. package/lib/scripts/setup_devwatch.js +238 -0
  140. package/lib/stages/00-load_core.js +342 -0
  141. package/lib/stages/05-load_app.js +57 -0
  142. package/lib/stages/10-datasource.js +61 -0
  143. package/lib/stages/15-tasks.js +27 -0
  144. package/lib/stages/20-settings.js +68 -0
  145. package/lib/stages/50-routes.js +218 -0
  146. package/lib/stages/90-server.js +347 -0
  147. package/package.json +5 -7
  148. package/lib/app/helper_model/criteria.js +0 -2294
  149. package/lib/app/helper_model/db_query.js +0 -1488
  150. package/lib/app/routes.js +0 -11
  151. package/lib/core/socket.js +0 -171
  152. package/lib/init/constants.js +0 -158
  153. package/lib/init/devwatch.js +0 -238
  154. package/lib/init/load_functions.js +0 -979
  155. package/lib/stages.js +0 -515
package/lib/stages.js DELETED
@@ -1,515 +0,0 @@
1
- /**
2
- * This file is loaded after the main 'init' & 'core' folder files.
3
- * Its main purpose is to launch the server in several stages and
4
- * allow the app-specific logic to hook into them.
5
- *
6
- * Alchemy: Node.js MVC Framework
7
- * Copyright 2013-2018
8
- *
9
- * Licensed under The MIT License
10
- * Redistributions of files must retain the above copyright notice.
11
- *
12
- * @copyright Copyright 2013-2018
13
- * @since 0.0.1
14
- * @version 1.1.0
15
- */
16
- let path = alchemy.modules.path,
17
- settings = alchemy.settings,
18
- http = alchemy.modules.http,
19
- hawkejs = alchemy.hawkejs,
20
- fs = alchemy.use('fs'),
21
- total_http_requests = 0;
22
-
23
- if (alchemy.settings.debug) {
24
- alchemy.sputnik.on('launching', function onLaunch(stage) {
25
-
26
- let colored_name = alchemy.colors.fg.getRgb(0, 5, 5) + stage.name + alchemy.colors.reset;
27
-
28
- let args = ['Launching', colored_name, 'stage…'];
29
-
30
- let line = alchemy.printLog(alchemy.INFO, args, {level: 1});
31
-
32
- if (line && line.args) {
33
- stage.pledge.then(function finished() {
34
- line.args.push('Done in', stage.ended - stage.started, 'ms');
35
- line.dissect();
36
- line.render();
37
- });
38
- }
39
- });
40
- }
41
-
42
- /**
43
- * Add a getter for the total amount of http requests
44
- *
45
- * @author Jelle De Loecker <jelle@elevenways.be>
46
- * @since 1.3.1
47
- * @version 1.3.1
48
- *
49
- * @type {Number}
50
- */
51
- Alchemy.setProperty(function http_request_counter() {
52
- return total_http_requests;
53
- });
54
-
55
- /**
56
- * The "http" stage:
57
- * Create the server and listen to requests
58
- *
59
- * @author Jelle De Loecker <jelle@develry.be>
60
- * @since 0.0.1
61
- * @version 1.3.1
62
- */
63
- alchemy.sputnik.add(function http() {
64
-
65
- // Create the server
66
- alchemy.server = alchemy.modules.http.createServer();
67
-
68
- // Listen for requests
69
- alchemy.server.on('request', function onRequest(request, response) {
70
- Router.resolve(request, response);
71
- total_http_requests++;
72
- });
73
- });
74
-
75
- /**
76
- * The "coreApp" stage:
77
- * Load in Alchemy's main 'app' folder.
78
- *
79
- * @author Jelle De Loecker <jelle@develry.be>
80
- * @since 0.0.1
81
- * @version 1.1.0
82
- */
83
- alchemy.sputnik.add(function core_app() {
84
- alchemy.usePath(path.resolve(PATH_CORE, 'app'), {weight: 1});
85
- });
86
-
87
- /**
88
- * The "datasources" stage:
89
- * Make a connection to all the datasources.
90
- *
91
- * @author Jelle De Loecker <jelle@develry.be>
92
- * @since 0.0.1
93
- * @version 1.1.0
94
- */
95
- alchemy.sputnik.add(function datasources() {
96
-
97
- var tasks = [];
98
-
99
- // Force Blast to load
100
- try {
101
- Blast.doLoaded();
102
- } catch (err) {
103
- alchemy.printLog('error', ['Failed to load application:', err.message], {err: err, level: 1});
104
- return
105
- }
106
-
107
- // Require the environment datasources configuration
108
- try {
109
- require(path.resolve(PATH_ROOT, 'app', 'config', settings.environment, 'database'));
110
- } catch (err) {
111
-
112
- if (err.code == 'MODULE_NOT_FOUND') {
113
- if (!alchemy.settings.client_mode) {
114
- // Only output a warning when not in client mode
115
- log.warn('Could not find ' + settings.environment + ' database settings');
116
- }
117
- } else {
118
- log.warn('Could not load ' + settings.environment + ' database settings:', err);
119
- }
120
-
121
- return;
122
- }
123
-
124
- // Get all available datasources
125
- Object.each(Datasource.get(), function eachDatasource(datasource, key) {
126
- tasks.push(datasource.setup());
127
- });
128
-
129
- return Function.parallel(tasks);
130
- });
131
-
132
- /**
133
- * The "plugins" stage:
134
- * Initialize the defined plugins.
135
- *
136
- * @author Jelle De Loecker <jelle@develry.be>
137
- * @since 0.0.1
138
- * @version 1.2.7
139
- */
140
- alchemy.sputnik.add(function plugins() {
141
- // Load in the plugins
142
- try {
143
- alchemy.startPlugins();
144
- } catch (err) {
145
- // Constitutors sometimes throw errors during this stage.
146
- // Not sure yet why they don't get caught by sputnik
147
- // @TODO: refactor!
148
- log.error('Caught error during "plugins" stage:', err);
149
- throw err;
150
- }
151
- });
152
-
153
- /**
154
- * The "baseApp" stage:
155
- * Load all the files in the user-defined 'app' folder
156
- *
157
- * @author Jelle De Loecker <jelle@develry.be>
158
- * @since 0.0.1
159
- * @version 1.3.22
160
- */
161
- alchemy.sputnik.add(function base_app() {
162
- // Load in the app
163
- alchemy.usePath(PATH_APP, {weight: 20, skip: ['routes']});
164
- });
165
-
166
- /**
167
- * The "defineDebug" stage:
168
- * Setup some debug settings
169
- *
170
- * @author Jelle De Loecker <jelle@develry.be>
171
- * @since 0.0.1
172
- * @version 1.1.0
173
- */
174
- alchemy.sputnik.add(function define_debug() {
175
- // See if we want to enable debugging
176
- if (settings.debug) {
177
- log.info('Hawkejs debugging has been ENABLED');
178
- alchemy.hawkejs._debug = true;
179
- }
180
- });
181
-
182
- /**
183
- * The "hawkejsSetup" stage:
184
- * Initialize Hawkejs
185
- *
186
- * @author Jelle De Loecker <jelle@elevenways.be>
187
- * @since 0.0.1
188
- * @version 1.3.22
189
- */
190
- alchemy.sputnik.add(function hawkejs_setup() {
191
-
192
- // Set the correct asset paths
193
- alchemy.hawkejs.style_path = 'stylesheets/';
194
- alchemy.hawkejs.script_path = 'scripts/';
195
-
196
- // Serve the hawkejs file
197
- Router.use('/hawkejs/hawkejs-client.js', function getHawkejs(req, res, next) {
198
-
199
- var retries = 0;
200
-
201
- Blast.getClientPath({
202
- modify_prototypes : true,
203
- ua : req.conduit.headers.useragent,
204
- create_source_map : alchemy.settings.source_map,
205
- enable_coverage : !!global.__coverage__,
206
- debug : alchemy.settings.debug,
207
- }).done(gotClientFile);
208
-
209
- function gotClientFile(err, path) {
210
-
211
- if (err) {
212
- return retryFnc(err);
213
- }
214
-
215
- let options = {};
216
-
217
- if (req.conduit && req.conduit.supports('async') === false) {
218
- options.add_async_support = true;
219
- }
220
-
221
- alchemy.minifyScript(path, options, function gotMinifiedPath(err, mpath) {
222
-
223
- var options;
224
-
225
- if (!retries) {
226
- options = {
227
- onError: retryFnc
228
- }
229
- }
230
-
231
- req.conduit.serveFile(mpath || path, options);
232
- });
233
- }
234
-
235
- function retryFnc(err) {
236
-
237
- if (retries > 0) {
238
- return req.conduit.error(new Error('Failed to serve client file'));
239
- }
240
-
241
- retries++;
242
-
243
- Blast.getClientPath({
244
- refresh : true,
245
- modify_prototypes : true,
246
- ua : req.conduit.headers.useragent,
247
- create_source_map : alchemy.settings.source_map,
248
- debug : alchemy.settings.debug,
249
- }).done(gotClientFile);
250
- }
251
- });
252
-
253
- // Serve the static file with exposed variables
254
- Router.use('/hawkejs/static.js', function getHawkejs(req, res, next) {
255
- alchemy.hawkejs.getStaticExposedPath((err, path) => {
256
-
257
- if (err) {
258
- return req.conduit.error(err);
259
- }
260
-
261
- req.conduit.serveFile(path);
262
- });
263
- });
264
-
265
- // Serve multiple template files
266
- Router.use('/hawkejs/templates', function onGetTemplates(req, res) {
267
-
268
- var names = req.conduit.param('name');
269
-
270
- if (!names) {
271
- return req.conduit.error(new Error('No template names have been given'));
272
- }
273
-
274
- alchemy.hawkejs.getFirstAvailableSource(names, function gotResult(err, result) {
275
-
276
- if (err) {
277
- return req.conduit.error(err);
278
- }
279
-
280
- if (!result || !result.name) {
281
- return req.conduit.notFound('Could not find any of the given templates');
282
- }
283
-
284
- req.conduit.setHeader('cache-control', 'public, max-age=3600, must-revalidate');
285
-
286
- // Don't use json dry, hawkejs expects regular json
287
- req.conduit.json_dry = false;
288
-
289
- req.conduit.end(result);
290
- });
291
- }, {methods: ['get'], weight: 19});
292
-
293
- // Serve single template files
294
- Router.use('/hawkejs/template', function onGetTemplate(req, res) {
295
-
296
- var name = req.conduit.param('name');
297
-
298
- if (!name) {
299
- return req.conduit.error(new Error('No template name has been given'));
300
- }
301
-
302
- alchemy.hawkejs.getTemplatePath(name, function gotTemplate(err, path) {
303
-
304
- if (err) {
305
- return req.conduit.error(err);
306
- }
307
-
308
- if (!path) {
309
- req.conduit.notFound('Could not find ' + name);
310
- } else {
311
- req.conduit.serveFile(path);
312
- }
313
- });
314
- }, {methods: ['get'], weight: 19});
315
- });
316
-
317
- /**
318
- * The "middleware" stage:
319
- * Setup middleware
320
- *
321
- * @author Jelle De Loecker <jelle@develry.be>
322
- * @since 0.0.1
323
- * @version 1.1.3
324
- */
325
- alchemy.sputnik.add(function middleware() {
326
-
327
- // Serve public files
328
- Router.use('/public/', alchemy.publicMiddleware, 50);
329
-
330
- // Serve stylesheets
331
- Router.use('/stylesheets/', alchemy.styleMiddleware, 50);
332
-
333
- // Serve scripts
334
- Router.use('/scripts/', alchemy.scriptMiddleware, 50);
335
-
336
- // Serve fonts
337
- Router.use('/fonts/', alchemy.fontMiddleware, 50);
338
-
339
- // Serve root files
340
- Router.use('/', alchemy.rootMiddleware, 49);
341
-
342
- if (alchemy.settings.debug) {
343
- // Serve sourcemap files
344
- Router.use('/_sourcemaps/', alchemy.sourcemapMiddleware, 50);
345
- }
346
-
347
- // Parse body (form-data & json, no multipart)
348
- // @todo: not all routes require body parsing
349
- Router.use(function parseBody(req, res, next) {
350
-
351
- // Don't re-check internal redirects, they always should have a body set
352
- if (req.original.body != null || (req.conduit && req.conduit instanceof Classes.Alchemy.Conduit.Loopback)) {
353
- return next();
354
- }
355
-
356
- alchemy.parseRequestBody(req, res, next);
357
-
358
- }, {methods: ['post'], weight: 99999});
359
- });
360
-
361
- /**
362
- * The "routes" stage:
363
- * Initialize all the routes
364
- *
365
- * @author Jelle De Loecker <jelle@develry.be>
366
- * @since 0.0.1
367
- * @version 1.3.22
368
- */
369
- alchemy.sputnik.add(function routes() {
370
- try {
371
- alchemy.useOnce(path.resolve(PATH_APP, 'config', 'routes.js'));
372
- } catch (err) {
373
- // Only output warning when not in client mode
374
- if (!alchemy.settings.client_mode) {
375
- log.warn('No app routes were found:', err);
376
- }
377
- }
378
- });
379
-
380
- /**
381
- * The "startServer" stage:
382
- * Actually start the server
383
- *
384
- * @author Jelle De Loecker <jelle@develry.be>
385
- * @since 0.0.1
386
- * @version 1.3.5
387
- */
388
- alchemy.sputnik.add(function start_server() {
389
-
390
- if (process.send) {
391
- // Create a connection to the hohenheim parent
392
- alchemy.hohenheim = new Classes.Alchemy.Reciprocal(process, 'hohenheim');
393
- }
394
-
395
- if (alchemy.settings.client_mode) {
396
- return alchemy.sputnik.launch('listening');
397
- }
398
-
399
- alchemy.exposeDefaultStaticVariables();
400
-
401
- // If a falsy (non-null) port is given (and no socket file), do nothing
402
- if (!settings.port && settings.port !== null && !settings.socket) {
403
- return;
404
- }
405
-
406
- let listen_target;
407
-
408
- // Are we using a socket file?
409
- if (typeof settings.socket == 'string') {
410
- let stat;
411
-
412
- try {
413
- stat = fs.statSync(settings.socket);
414
- } catch (err) {
415
- // File not found, so it's safe to use
416
- }
417
-
418
- if (stat) {
419
- log.info('Found existing socketfile at', settings.socket, ', need to remove it');
420
- fs.unlinkSync(settings.socket);
421
- }
422
-
423
- listen_target = settings.socket;
424
- }
425
-
426
- if (!listen_target && settings.port) {
427
- listen_target = settings.port;
428
- }
429
-
430
- // Start listening on the given port
431
- // The actual `requests` listener is defined in the 'http' stage
432
- alchemy.server.listen(listen_target, function areListening(){
433
-
434
- let address = alchemy.server.address();
435
- let url = alchemy.settings.url;
436
-
437
- if (typeof address == 'string') {
438
- settings.socket = address;
439
- log.info('HTTP server listening on socket file', address);
440
-
441
- // Make readable by everyone
442
- if (settings.socketfile_chmod) {
443
- fs.chmodSync(address, settings.socketfile_chmod);
444
- }
445
- } else {
446
- // Get the actual server port
447
- settings.port = address.port;
448
- log.info('HTTP server listening on port', settings.port);
449
-
450
- if (!url) {
451
- url = 'http://localhost:' + address.port;
452
- }
453
- }
454
-
455
- if (url) {
456
- let pretty_url = alchemy.colors.bg.getRgb(1, 0, 1) + alchemy.colors.fg.getRgb(5, 3, 0) + ' ' + url + ' ' + alchemy.colors.reset;
457
- log.info('Served at »»', pretty_url, '««');
458
- }
459
-
460
- // If this process is a child, tell the parent we're ready
461
- if (process.send) {
462
- log.info('Letting the parent know we\'re ready!');
463
- process.send({alchemy: {ready: true}});
464
-
465
- process.on('disconnect', function onParentExit() {
466
- log.info('Parent exited, closing down');
467
- process.exit();
468
- });
469
- }
470
-
471
- alchemy.sputnik.launch('listening');
472
- });
473
-
474
- // Listen for errors (like EADDRINUSE)
475
- alchemy.server.on('error', function onError(err) {
476
-
477
- if (process.send) {
478
- process.send({alchemy: {error: err}});
479
- return process.exit();
480
- }
481
-
482
- throw err;
483
- });
484
- });
485
-
486
- /**
487
- * Launch the "startServer" stage after datasources & socket
488
- *
489
- * @author Jelle De Loecker <jelle@develry.be>
490
- * @since 0.0.1
491
- * @version 0.5.0
492
- */
493
- alchemy.sputnik.after(['datasources', 'socket'], function scheduleServerStart() {
494
-
495
- // Need to wait for all classes to load
496
- Blast.loaded(function hasLoaded() {
497
-
498
- alchemy.sputnik.launch('start_server');
499
-
500
- // Indicate the server has started
501
- alchemy.started = true;
502
- });
503
- });
504
-
505
- alchemy.sputnik.launch([
506
- 'http',
507
- 'core_app',
508
- 'plugins',
509
- 'base_app',
510
- 'middleware',
511
- 'datasources',
512
- 'define_debug',
513
- 'socket',
514
- 'hawkejs_setup',
515
- 'routes']);