jsgui3-server 0.0.121 → 0.0.123
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/.vscode/settings.json +6 -0
- package/README.md +10 -10
- package/controls/Active_HTML_Document.js +116 -116
- package/controls/README.md +7 -7
- package/controls/page/admin.js +74 -74
- package/controls/panel/admin.js +11 -11
- package/examples/_css/basic.css +913 -913
- package/examples/_css/database-control.css +51 -51
- package/examples/_css/jsgui.css +66 -66
- package/examples/_css/multi-layout.css +23 -23
- package/examples/_css/style.css +1669 -1669
- package/examples/_css/top-and-bottom-bars.css +54 -54
- package/examples/box/1) square box/client.js +188 -188
- package/examples/box/1) square box/server.js +112 -112
- package/examples/box/2) twenty square boxes/css flex wrap/client.js +112 -248
- package/examples/box/2) twenty square boxes/css flex wrap/server.js +39 -112
- package/examples/box/3) twenty selectable square boxes/css flex wrap/client.js +129 -0
- package/examples/{controls/15) window, text field → box/3) twenty selectable square boxes/css flex wrap}/server.js +38 -38
- package/examples/boxes/square_boxes.js +45 -48
- package/examples/boxes/square_boxes_client.js +132 -136
- package/examples/client-side-popup-menu-button.html +93 -93
- package/examples/color_palette.js +51 -51
- package/examples/color_palette_client.js +95 -95
- package/examples/controls/1) window/client.js +186 -186
- package/examples/controls/1) window/server.js +117 -117
- package/examples/controls/10) window, mirrored text inputs/client.js +118 -320
- package/examples/controls/10) window, mirrored text inputs/server.js +37 -117
- package/examples/controls/11) window, mirrored text fields/client.js +493 -251
- package/examples/controls/11) window, mirrored text fields/server.js +117 -117
- package/examples/controls/11b) window, shared Data_Object model mirrored text fields/client.js +613 -331
- package/examples/controls/11b) window, shared Data_Object model mirrored text fields/server.js +117 -117
- package/examples/controls/11c) window, shared Data_Value model mirrored text fields/client.js +617 -617
- package/examples/controls/11c) window, shared Data_Value model mirrored text fields/server.js +117 -117
- package/examples/controls/11d) window, shared model mirrored integer text fields/client.js +611 -280
- package/examples/controls/11d) window, shared model mirrored integer text fields/server.js +134 -22
- package/examples/controls/12) window, Select_Options control/client.js +66 -452
- package/examples/controls/12) window, Select_Options control/server.js +19 -117
- package/examples/controls/13) window, Dropdown_Menu control/client.js +66 -0
- package/examples/controls/13) window, Dropdown_Menu control/server.js +20 -0
- package/examples/controls/2) two windows/client.js +193 -193
- package/examples/controls/2) two windows/server.js +113 -113
- package/examples/controls/3) five windows/client.js +217 -217
- package/examples/controls/3) five windows/server.js +116 -115
- package/examples/controls/4) window, tabbed panel/client.js +54 -225
- package/examples/controls/4) window, tabbed panel/server.js +17 -117
- package/examples/controls/5) window, grid/client.js +204 -484
- package/examples/controls/5) window, grid/server.js +117 -119
- package/examples/controls/6) window, color_palette/client.js +68 -204
- package/examples/controls/6) window, color_palette/server.js +117 -117
- package/examples/controls/7) window, month_view/client.js +40 -231
- package/examples/controls/7) window, month_view/server.js +117 -117
- package/examples/controls/8) window, checkbox/client.js +33 -209
- package/examples/controls/8) window, checkbox/server.js +117 -117
- package/examples/controls/9) window, date picker/client.js +76 -303
- package/examples/controls/9) window, date picker/server.js +117 -117
- package/examples/controls/9b) window, shared data.model mirrored date pickers/README.md +51 -0
- package/examples/controls/9b) window, shared data.model mirrored date pickers/client.js +83 -398
- package/examples/controls/9b) window, shared data.model mirrored date pickers/server.js +117 -117
- package/examples/controls/__old/_html-server-color-palette.js +114 -114
- package/examples/controls/__old/html-server-combo-box.js +104 -104
- package/examples/controls/__old/html-server-list.js +98 -98
- package/examples/controls/__old/html-server-popup-menu-button.js +114 -114
- package/examples/controls/__old/html-server-start-stop-toggle-button.js +146 -146
- package/examples/controls/__old/scs-arrow-button.js +36 -36
- package/examples/controls/__old/scs-date-picker.js +157 -157
- package/examples/controls/__old/scs-file-browser.js +82 -82
- package/examples/controls/__old/scs-item.js +159 -159
- package/examples/controls/__old/scs-month-arrow-selector.js +126 -126
- package/examples/controls/__old/scs-month-view.js +94 -94
- package/examples/controls/__old/scs-start-stop-toggle-button.js +40 -40
- package/examples/controls/__old/scs-tree.js +49 -49
- package/examples/controls/__old/scs-year-arrow-selector.js +127 -127
- package/examples/demos/date-picker.js +119 -119
- package/examples/demos/explain-encapsulation.js +9 -9
- package/examples/demos/resizing.js +35 -35
- package/examples/demos/server_time.js +6 -6
- package/examples/grids/grid_1.js +45 -45
- package/examples/grids/grid_1_client.js +329 -329
- package/examples/html-rendering.js +20 -20
- package/examples/html-server.js +105 -105
- package/examples/introducing jsgui3/server.js +110 -110
- package/examples/mx_display/mx_display_1.js +45 -45
- package/examples/mx_display/mx_display_1_client.js +444 -444
- package/fs2.js +1836 -1836
- package/http/responders/HTTP_Responder.js +15 -15
- package/http/responders/static/Static_Route_HTTP_Responder.js +105 -105
- package/module.js +34 -34
- package/old/_single-control-server.js +418 -418
- package/old/single-control-server.js +368 -368
- package/old/single-page-app.js +131 -131
- package/package.json +42 -42
- package/page-context.js +92 -92
- package/publishers/helpers/assigners/Assigner.js +10 -10
- package/publishers/helpers/assigners/static-compressed-response-buffers/Single_Control_Webpage_Server_Static_Compressed_Response_Buffers_Assigner.js +150 -150
- package/publishers/helpers/assigners/static-headers/Single_Control_Webpage_Server_Static_Headers_Assigner.js +109 -109
- package/publishers/helpers/assigners/static-routes/Single_Control_Webpage_Server_Static_Routes_Assigner.js +91 -91
- package/publishers/helpers/assigners/static-uncompressed-response-buffers/Single_Control_Webpage_Server_Static_Uncompressed_Response_Buffers_Assigner.js +104 -104
- package/publishers/helpers/preparers/static/bundle/Ready_To_Serve_Preparer.js +18 -18
- package/publishers/helpers/preparers/static/bundle/Static_Routes_Responses_Webpage_Bundle_Preparer.js +44 -44
- package/publishers/http-function-publisher.js +212 -212
- package/publishers/http-html-page-publisher.js +5 -5
- package/publishers/http-html-publisher.js +24 -24
- package/publishers/http-js-publisher.js +135 -135
- package/publishers/http-observable-publisher.js +124 -124
- package/publishers/http-publisher.js +53 -53
- package/publishers/http-resource-publisher.js +325 -325
- package/publishers/http-webpage-publisher.js +659 -658
- package/publishers/http-webpageorsite-publisher.js +343 -343
- package/publishers/http-website-publisher.js +640 -640
- package/publishers/notes.md +9 -9
- package/resources/README.md +16 -16
- package/resources/_old_website-javascript-resource.js +994 -994
- package/resources/_old_website-resource.js +507 -507
- package/resources/compile/server-resource-compilation.js +43 -43
- package/resources/data-resource.js +118 -118
- package/resources/fs-resource.js +146 -146
- package/resources/jsbuilder/Abstract_Single_Declaration.js +105 -105
- package/resources/jsbuilder/Abstract_Single_Declaration_Sequence.js +42 -42
- package/resources/jsbuilder/JS_AST/JS_AST_Abstract_Node.js +61 -61
- package/resources/jsbuilder/JS_AST/JS_AST_Abstract_Node_Group.js +41 -41
- package/resources/jsbuilder/JS_AST/JS_AST_Group_Shared.js +61 -61
- package/resources/jsbuilder/JS_AST/JS_AST_Node.js +93 -93
- package/resources/jsbuilder/JS_AST/JS_AST_Node_0-Core.js +253 -253
- package/resources/jsbuilder/JS_AST/JS_AST_Node_1-Babel.js +337 -337
- package/resources/jsbuilder/JS_AST/JS_AST_Node_10-Changing.js +39 -39
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.1.1-Child.js +96 -96
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.1.2-Parent.js +37 -37
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.1.3-Ancestor.js +61 -61
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.2-Inner.js +43 -43
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.3-All.js +72 -72
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.4-Sibling.js +92 -92
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.5-Available_In_Scope.js +29 -29
- package/resources/jsbuilder/JS_AST/JS_AST_Node_2.9-Signature.js +116 -116
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3-Basics.js +159 -159
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.0.0-Basics_First.js +178 -178
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.0.1-Basics_Second.js +87 -87
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.0.99-Basics_Last.js +91 -91
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.1-Basics_Each.js +136 -136
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.1.5-Basics_Count.js +73 -73
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.2-Basics_Filter.js +39 -39
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.3-Basics_Collect.js +85 -85
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.4-Basics_Select.js +42 -42
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.5-Basics_Find.js +40 -40
- package/resources/jsbuilder/JS_AST/JS_AST_Node_3.6-Basics_Callmap.js +54 -54
- package/resources/jsbuilder/JS_AST/JS_AST_Node_4.0-Index_Indexes.js +45 -45
- package/resources/jsbuilder/JS_AST/JS_AST_Node_4.1-Index.js +343 -343
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.0-Category.js +38 -38
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.1-Category_Identifier.js +30 -30
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.2-Category_Literal.js +28 -28
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.3-Category_Expression.js +26 -26
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.4-Category_Pattern.js +8 -8
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.5-Category_Declaration.js +43 -43
- package/resources/jsbuilder/JS_AST/JS_AST_Node_5.6-Category_Statement.js +21 -21
- package/resources/jsbuilder/JS_AST/JS_AST_Node_6.0-Type.js +89 -89
- package/resources/jsbuilder/JS_AST/JS_AST_Node_6.1-Type_Class_Declaration.js +8 -8
- package/resources/jsbuilder/JS_AST/JS_AST_Node_6.2-Type_Variable_Declaration.js +27 -27
- package/resources/jsbuilder/JS_AST/JS_AST_Node_6.3-Type_Variable_Declarator.js +28 -28
- package/resources/jsbuilder/JS_AST/JS_AST_Node_7-Query.js +736 -736
- package/resources/jsbuilder/JS_AST/JS_AST_Node_8-Features.js +64 -64
- package/resources/jsbuilder/JS_AST/JS_AST_Node_9-Planning.js +31 -31
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Arrangement.js +15 -15
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Node_Declared_Object.js +305 -305
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Node_Feature.js +77 -77
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Node_Feature_Declaration.js +248 -248
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Node_Feature_Declarator.js +138 -138
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Root_Node_Feature/JS_AST_Root_Node_Feature.js +10 -10
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Root_Node_Feature/JS_AST_Root_Node_Feature_Exported.js +100 -100
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Root_Node_Feature/JS_AST_Root_Node_Feature_Exports.js +60 -60
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Root_Node_Feature/JS_AST_Root_Node_Interpreted.js +179 -179
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Root_Node_Feature/_JSGUI_Root_Node_Interpreted.js +43 -43
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Feature/JS_AST_Root_Node_Feature/special_case_objectassign_to_object.js +12 -12
- package/resources/jsbuilder/JS_AST/JS_AST_Node_Group.js +35 -35
- package/resources/jsbuilder/JS_AST/JS_AST_Operation.js +11 -11
- package/resources/jsbuilder/JS_AST/JS_AST_Operation_On_Relationship.js +31 -31
- package/resources/jsbuilder/JS_AST/JS_AST_Ordered_Relationship_Node_To_Group.js +37 -37
- package/resources/jsbuilder/JS_AST/JS_AST_Ordinal.js +39 -39
- package/resources/jsbuilder/JS_AST/JS_AST_Ordinal_Relationship.js +25 -25
- package/resources/jsbuilder/JS_AST/JS_AST_Relationship_Node_To_Group.js +200 -200
- package/resources/jsbuilder/JS_AST/JS_AST_Relationship_Node_Within_Group_To_Node.js +43 -43
- package/resources/jsbuilder/JS_AST/_JS_AST_Node_3.8-Query_Features.js +76 -76
- package/resources/jsbuilder/JS_AST/query/enable_array_as_queryable.js +227 -227
- package/resources/jsbuilder/JS_AST/query/find_object_keys.js +404 -404
- package/resources/jsbuilder/JS_AST/query/node_queries.js +8 -8
- package/resources/jsbuilder/JS_AST/query/root_query_identidy.js +11 -11
- package/resources/jsbuilder/JS_AST_Node_Extended/JSGUI_Singular_Declaration.js +85 -85
- package/resources/jsbuilder/JS_AST_Node_Extended/JS_AST_Node_Declaration.js +123 -123
- package/resources/jsbuilder/JS_AST_Node_Extended/JS_AST_Node_Extended.js +87 -87
- package/resources/jsbuilder/JS_AST_Node_Extended/JS_AST_Node_Extended_0-Core.js +10 -10
- package/resources/jsbuilder/JS_Builder.js +10 -10
- package/resources/jsbuilder/JS_File/Feature/JS_File_Declared_Object.js +31 -31
- package/resources/jsbuilder/JS_File/Feature/JS_File_Exported_Object_Info.js +25 -25
- package/resources/jsbuilder/JS_File/Feature/JS_File_Exports.js +78 -78
- package/resources/jsbuilder/JS_File/Feature/JS_File_Feature.js +17 -17
- package/resources/jsbuilder/JS_File/Feature/JS_File_Imported_Object_Info.js +25 -25
- package/resources/jsbuilder/JS_File/Feature/JS_File_Imports.js +8 -8
- package/resources/jsbuilder/JS_File/JS_File.js +12 -12
- package/resources/jsbuilder/JS_File/JS_File_0-Core.js +202 -202
- package/resources/jsbuilder/JS_File/JS_File_1-Early_Parse.js +175 -175
- package/resources/jsbuilder/JS_File/JS_File_2-Babel.js +81 -81
- package/resources/jsbuilder/JS_File/JS_File_3-JS_AST_Node.js +86 -86
- package/resources/jsbuilder/JS_File/JS_File_4-Query.js +413 -413
- package/resources/jsbuilder/JS_File/JS_File_4.1-Query_Features.js +414 -414
- package/resources/jsbuilder/JS_File/JS_File_5-Planning.js +59 -59
- package/resources/jsbuilder/JS_File/JS_File_6-Changing.js +24 -24
- package/resources/jsbuilder/JS_File/JS_File_Export_Reference.js +12 -12
- package/resources/jsbuilder/JS_File/JS_File_Import_Reference.js +23 -23
- package/resources/jsbuilder/JS_File/JS_File_Import_References.js +31 -31
- package/resources/jsbuilder/JS_File/JS_File_Processor.js +16 -16
- package/resources/jsbuilder/JS_File/JS_Files.js +15 -15
- package/resources/jsbuilder/Module.js +14 -14
- package/resources/jsbuilder/Platform.js +13 -13
- package/resources/jsbuilder/Platforms.js +69 -69
- package/resources/jsbuilder/Project.js +109 -109
- package/resources/jsbuilder/Reference.js +1 -1
- package/resources/jsbuilder/Reference_Sequence.js +16 -16
- package/resources/jsbuilder/Scope.js +29 -29
- package/resources/jsbuilder/Variable_Name_Provider.js +42 -42
- package/resources/jsbuilder/_JS_File.js +225 -225
- package/resources/jsbuilder/ast_query.js +20 -20
- package/resources/jsbuilder/babel/babel_consts.js +162 -162
- package/resources/jsbuilder/babel/babel_node_tools.js +541 -541
- package/resources/jsbuilder/babel/deep_iterate/deep_iterate_babel.js +923 -904
- package/resources/jsbuilder/build.js +16 -16
- package/resources/jsbuilder/platform_notes.md +66 -66
- package/resources/jsbuilder/test/test_ast_node.js +381 -381
- package/resources/jsbuilder/test/test_js_file.js +303 -303
- package/resources/jsbuilder/test/test_project.js +157 -157
- package/resources/local-server-info-resource.js +96 -96
- package/resources/notes.txt +10 -10
- package/resources/old/website-image-resource.js +1185 -1185
- package/resources/process-js.js +498 -498
- package/resources/processors/bundlers/bundle.js +29 -29
- package/resources/processors/bundlers/bundler.js +23 -23
- package/resources/processors/bundlers/css-bundler.js +234 -234
- package/resources/processors/bundlers/js/JS_Bundler.js +51 -51
- package/resources/processors/bundlers/js/esbuild/Advanced_JS_Bundler_Using_ESBuild.js +388 -391
- package/resources/processors/bundlers/js/esbuild/Bundler_Using_ESBuild.js +8 -8
- package/resources/processors/bundlers/js/esbuild/Core_JS_Non_Minifying_Bundler_Using_ESBuild.js +188 -188
- package/resources/processors/bundlers/js/esbuild/Core_JS_Single_File_Minifying_Bundler_Using_ESBuild.js +191 -192
- package/resources/processors/bundlers/js/esbuild/_Old_CSS_Extractor.js +239 -239
- package/resources/processors/bundlers/js-bundler.js +263 -263
- package/resources/processors/bundlers/test_ast.js +73 -73
- package/resources/processors/bundlers/webpage-bundler.js +404 -404
- package/resources/processors/bundlers/website-bundler.js +22 -22
- package/resources/processors/extractors/Extractor.js +9 -11
- package/resources/processors/extractors/js/css_and_js/AST_Node/CSS_And_JS_From_JS_String_Using_AST_Node_Extractor.js +239 -254
- package/resources/processors/extractors/js/css_and_js/CSS_And_JS_From_JS_String_Extractor.js +3 -3
- package/resources/processors/extractors/string/Pos_Span_String_Extractor.js +93 -93
- package/resources/server-installed-tools.js +28 -28
- package/resources/server-resource-pool.js +41 -41
- package/resources/website-audio-resource.js +735 -735
- package/resources/website-css-resource.js +411 -411
- package/resources/website-image-resource.js +412 -412
- package/resources/website-javascript-resource-processor.js +908 -908
- package/resources/website-javascript-resource.js +874 -874
- package/resources/website-resource-processor.js +10 -10
- package/resources/website-resource.js +164 -164
- package/resources/website-static-html-resource.js +199 -199
- package/resources/website-template-html-resource.js +231 -231
- package/roadmap.md +75 -75
- package/server.js +609 -573
- package/static-page-context.js +13 -13
- package/website/webpage.js +81 -81
- package/website/website-group.js +15 -15
- package/website/website.js +260 -260
- package/examples/controls/11d) window, shared model mirrored integer text fields/both.js +0 -17
- package/examples/controls/13) window, shared model mirrored lat_long/client.js +0 -933
- package/examples/controls/13) window, shared model mirrored lat_long/server.js +0 -50
- package/examples/controls/14) window, control compositional model/client.js +0 -328
- package/examples/controls/14) window, control compositional model/server.js +0 -118
- package/examples/controls/14a) window, control spec has compositional model/client.js +0 -440
- package/examples/controls/14a) window, control spec has compositional model/server.js +0 -118
- package/examples/controls/15) window, text field/client.js +0 -256
- package/examples/controls/16) Window([Text_Input])/client.js +0 -266
- package/examples/controls/16) Window([Text_Input])/server.js +0 -109
- package/examples/controls/16a) Window([Text_Input]) Integer data.model.data_type/client.js +0 -494
- package/examples/controls/16a) Window([Text_Input]) Integer data.model.data_type/isomorphic.js +0 -24
- package/examples/controls/16a) Window([Text_Input]) Integer data.model.data_type/server.js +0 -73
- package/examples/controls/2b) two window, context menus/client.js +0 -193
- package/examples/controls/2b) two window, context menus/server.js +0 -114
- package/examples/controls/4a) window, tabbed panel with various controls inside/client.js +0 -233
- package/examples/controls/4a) window, tabbed panel with various controls inside/server.js +0 -118
|
@@ -1,326 +1,326 @@
|
|
|
1
|
-
// Just a Class for a change
|
|
2
|
-
// then handle...
|
|
3
|
-
// need to handle http requests, for the resource.
|
|
4
|
-
const zlib = require('zlib');
|
|
5
|
-
const Cookies = require('cookies');
|
|
6
|
-
const multiparty = require('multiparty');
|
|
7
|
-
//const util = require('util');
|
|
8
|
-
|
|
9
|
-
// Publishing using websockets would be cool.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// More observable systems?
|
|
13
|
-
// Making use of ofp could be very useful in various cases.
|
|
14
|
-
// mfp in some parts first?
|
|
15
|
-
const HTTP_Publisher = require('./http-publisher');
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
// For publishing a resource, implying resources don't themselves need http handling.
|
|
19
|
-
|
|
20
|
-
// maybe a handle-http js file may help that will do things in a rather general purpose way?
|
|
21
|
-
// But it more seems as though we need to set the routing. Then we could assign such handlers from the router.
|
|
22
|
-
|
|
23
|
-
// Possibly there should be a Website_Router Resource?
|
|
24
|
-
// Or a resource wrapper.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// Could extend a JSON_Publisher. Resource_JSON_Publisher possibly.
|
|
30
|
-
class Resource_Publisher extends HTTP_Publisher {
|
|
31
|
-
|
|
32
|
-
// Make this able to publish any resource?
|
|
33
|
-
// But I don't think this is going to publish a Website Resource as a Website.
|
|
34
|
-
// There is now the specialised HTTP_Website_Publisher.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
constructor(spec) {
|
|
38
|
-
super(spec);
|
|
39
|
-
this.resource = spec.resource;
|
|
40
|
-
// Don't make a new server interface by default.
|
|
41
|
-
this.name = spec.name;
|
|
42
|
-
}
|
|
43
|
-
handle_http(req, res) {
|
|
44
|
-
//console.log('Resource_Publisher handle HTTP');
|
|
45
|
-
// then the http request params...
|
|
46
|
-
//console.log('req.url', req.url);
|
|
47
|
-
let {
|
|
48
|
-
headers,
|
|
49
|
-
url,
|
|
50
|
-
method,
|
|
51
|
-
params
|
|
52
|
-
} = req;
|
|
53
|
-
//console.log('headers, url, method, params', headers, url, method, params);
|
|
54
|
-
let resource_url_parts = url.split('/').slice(3).filter(x => x != '');
|
|
55
|
-
//console.log('resource_url_parts', resource_url_parts);
|
|
56
|
-
if (resource_url_parts.length === 1 && resource_url_parts[0] === 'status.json') {
|
|
57
|
-
(async () => {
|
|
58
|
-
let status = await this.resource.status;
|
|
59
|
-
//console.log('status', status);
|
|
60
|
-
let s_status = JSON.stringify(status);
|
|
61
|
-
//console.log('s_status', s_status);
|
|
62
|
-
res.setHeader('Content-Type', 'application/json');
|
|
63
|
-
res.end(s_status);
|
|
64
|
-
})();
|
|
65
|
-
} else {
|
|
66
|
-
// get the result from the resource.
|
|
67
|
-
// process?
|
|
68
|
-
(async () => {
|
|
69
|
-
let cookies = new Cookies(req, res);
|
|
70
|
-
let serve_access_error = () => {
|
|
71
|
-
//res.sendStatus(403);
|
|
72
|
-
//res.status(500).send({ error: "access denied" });
|
|
73
|
-
res.writeHead(403);
|
|
74
|
-
res.end('Access Denied');
|
|
75
|
-
}
|
|
76
|
-
let serve_result = (r) => {
|
|
77
|
-
if (r !== undefined) {
|
|
78
|
-
//console.log('r', r);
|
|
79
|
-
// Then turn it to JSON.
|
|
80
|
-
// to server output json.
|
|
81
|
-
|
|
82
|
-
// Resources that don't return JSON?
|
|
83
|
-
|
|
84
|
-
let j = JSON.stringify(r);
|
|
85
|
-
|
|
86
|
-
// Middleware could be better?
|
|
87
|
-
// Only want to gzip if the client says its accepted.
|
|
88
|
-
|
|
89
|
-
zlib.gzip(j, (error, result) => {
|
|
90
|
-
if (error) {
|
|
91
|
-
throw error;
|
|
92
|
-
} else {
|
|
93
|
-
// console.log(result);
|
|
94
|
-
res.setHeader('Content-Type', 'application/json');
|
|
95
|
-
res.setHeader('Content-Encoding', 'gzip');
|
|
96
|
-
res.setHeader('Content-Length', result.length);
|
|
97
|
-
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
98
|
-
res.setHeader('Pragma', 'no-cache');
|
|
99
|
-
res.setHeader('Expires', '0');
|
|
100
|
-
/*
|
|
101
|
-
Cache-Control: no-cache, no-store, must-revalidate
|
|
102
|
-
Pragma: no-cache
|
|
103
|
-
Expires: 0
|
|
104
|
-
*/
|
|
105
|
-
// compress with gzip
|
|
106
|
-
res.end(result);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
//console.log('j', j);
|
|
110
|
-
//console.log('typeof r', typeof r);
|
|
111
|
-
} else {
|
|
112
|
-
// Serve error?
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Want to build auth into the server module itself.
|
|
118
|
-
// Will show simple unauthorised app / view.
|
|
119
|
-
|
|
120
|
-
// /site/ controls?
|
|
121
|
-
// useful in particular for making a website?
|
|
122
|
-
// could be too large.
|
|
123
|
-
|
|
124
|
-
// /auth/ makes sense for a 'not logged in' control with its own API.
|
|
125
|
-
// include the login.js control too.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (method === 'DELETE') {
|
|
129
|
-
let jwt_cookie = cookies.get('jwt') || cookies.get('Authentication');
|
|
130
|
-
let auth_info, r;
|
|
131
|
-
let restricted = false;
|
|
132
|
-
//console.log('jwt_cookie', jwt_cookie);
|
|
133
|
-
if (jwt_cookie) {
|
|
134
|
-
if (this.resource.authenticate) {
|
|
135
|
-
auth_info = this.resource.authenticate(jwt_cookie);
|
|
136
|
-
//let user_key = auth_info.key;
|
|
137
|
-
}
|
|
138
|
-
// Could provide further data...
|
|
139
|
-
} else {
|
|
140
|
-
// if there is an authenticate function but no cookie...
|
|
141
|
-
//console.log('this.resource.authenticate', this.resource.authenticate);
|
|
142
|
-
if (this.resource.authenticate) {
|
|
143
|
-
restricted = !this.resource.authenticate();
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (!restricted) {
|
|
147
|
-
if (auth_info && auth_info !== true) {
|
|
148
|
-
let r = await this.resource.delete(auth_info, resource_url_parts[0]);
|
|
149
|
-
serve_result(r);
|
|
150
|
-
} else {
|
|
151
|
-
console.log('resource_url_parts', resource_url_parts);
|
|
152
|
-
console.log('pre resource get');
|
|
153
|
-
let r = await this.resource.delete(resource_url_parts[0]);
|
|
154
|
-
serve_result(r);
|
|
155
|
-
}
|
|
156
|
-
} else {
|
|
157
|
-
console.log('restricted, so there is an error');
|
|
158
|
-
serve_access_error();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
if (method === 'GET') {
|
|
162
|
-
let jwt_cookie = cookies.get('jwt') || cookies.get('Authentication');
|
|
163
|
-
let auth_info, r;
|
|
164
|
-
let restricted = false;
|
|
165
|
-
//console.log('jwt_cookie', jwt_cookie);
|
|
166
|
-
if (jwt_cookie) {
|
|
167
|
-
if (this.resource.authenticate) {
|
|
168
|
-
auth_info = this.resource.authenticate(jwt_cookie);
|
|
169
|
-
//let user_key = auth_info.key;
|
|
170
|
-
}
|
|
171
|
-
// Could provide further data...
|
|
172
|
-
} else {
|
|
173
|
-
// if there is an authenticate function but no cookie...
|
|
174
|
-
//console.log('this.resource.authenticate', this.resource.authenticate);
|
|
175
|
-
if (this.resource.authenticate) {
|
|
176
|
-
restricted = !this.resource.authenticate();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (!restricted) {
|
|
180
|
-
if (auth_info && auth_info !== true) {
|
|
181
|
-
let r = await this.resource.get(auth_info, resource_url_parts);
|
|
182
|
-
serve_result(r);
|
|
183
|
-
} else {
|
|
184
|
-
console.log('resource_url_parts', resource_url_parts);
|
|
185
|
-
console.log('pre resource get');
|
|
186
|
-
let r = await this.resource.get(resource_url_parts);
|
|
187
|
-
serve_result(r);
|
|
188
|
-
}
|
|
189
|
-
} else {
|
|
190
|
-
console.log('restricted, so there is an error');
|
|
191
|
-
serve_access_error();
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
if (method === 'POST') {
|
|
195
|
-
//console.log('Resource_Publisher POST resource_url_parts');
|
|
196
|
-
//console.log('resource_url_parts', resource_url_parts);
|
|
197
|
-
//console.log('headers', headers);
|
|
198
|
-
let jwt_cookie = cookies.get('jwt') || cookies.get('Authentication');
|
|
199
|
-
let auth_info, r;
|
|
200
|
-
if (jwt_cookie) {
|
|
201
|
-
auth_info = this.resource.authenticate(jwt_cookie);
|
|
202
|
-
//let user_key = auth_info.key;
|
|
203
|
-
}
|
|
204
|
-
const content_type = headers['content-type'];
|
|
205
|
-
// 'multipart/form-data; boundary=----WebKitFormBoundaryxk08Mj2AlOPsmrGp'
|
|
206
|
-
let serve_result = r => {
|
|
207
|
-
if (r !== undefined) {
|
|
208
|
-
console.log('serve_result r', r);
|
|
209
|
-
// Then turn it to JSON.
|
|
210
|
-
// to server output json.
|
|
211
|
-
let j = JSON.stringify(r);
|
|
212
|
-
zlib.gzip(j, (error, result) => {
|
|
213
|
-
if (error) {
|
|
214
|
-
throw error;
|
|
215
|
-
} else {
|
|
216
|
-
// console.log(result);
|
|
217
|
-
res.setHeader('Content-Type', 'application/json');
|
|
218
|
-
res.setHeader('Content-Encoding', 'gzip');
|
|
219
|
-
res.setHeader('Content-Length', result.length);
|
|
220
|
-
// compress with gzip
|
|
221
|
-
res.end(result);
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
//console.log('j', j);
|
|
225
|
-
//console.log('typeof r', typeof r);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (content_type.indexOf('multipart/form-data') === 0) {
|
|
229
|
-
var form = new multiparty.Form();
|
|
230
|
-
let files = [];
|
|
231
|
-
form.on('error', err => {
|
|
232
|
-
// serve error result
|
|
233
|
-
res.writeHead(500);
|
|
234
|
-
res.end('Error: ' + err);
|
|
235
|
-
});
|
|
236
|
-
form.on('part', function (part) {
|
|
237
|
-
//console.log('Object.keys(part)', Object.keys(part));
|
|
238
|
-
const {
|
|
239
|
-
headers,
|
|
240
|
-
name,
|
|
241
|
-
filename,
|
|
242
|
-
readable,
|
|
243
|
-
byteCount
|
|
244
|
-
} = part;
|
|
245
|
-
var bufs = [];
|
|
246
|
-
part.on('data', function (d) {
|
|
247
|
-
bufs.push(d);
|
|
248
|
-
});
|
|
249
|
-
part.on('end', function () {
|
|
250
|
-
var buf = Buffer.concat(bufs);
|
|
251
|
-
//console.log('buf', buf);
|
|
252
|
-
//console.log('buf.length', buf.length);
|
|
253
|
-
files.push({
|
|
254
|
-
buffer: buf,
|
|
255
|
-
name: name,
|
|
256
|
-
filename: filename
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
form.parse(req);
|
|
261
|
-
form.on('close', (async err => {
|
|
262
|
-
if (err) {
|
|
263
|
-
|
|
264
|
-
} else {
|
|
265
|
-
//console.log('form ended');
|
|
266
|
-
try {
|
|
267
|
-
if (auth_info && auth_info !== true) {
|
|
268
|
-
//console.log('pre resource post obj', obj);
|
|
269
|
-
//console.log('this.resource', this.resource);
|
|
270
|
-
//console.log('files', files);
|
|
271
|
-
let r = await this.resource.post(auth_info, files);
|
|
272
|
-
//console.log('r', r);
|
|
273
|
-
serve_result(r);
|
|
274
|
-
} else {
|
|
275
|
-
//console.log('pre resource post');
|
|
276
|
-
let r = await this.resource.post(files);
|
|
277
|
-
serve_result(r);
|
|
278
|
-
}
|
|
279
|
-
} catch (err) {
|
|
280
|
-
//console.log('err', err);
|
|
281
|
-
res.statusCode = 400;
|
|
282
|
-
res.setHeader('Content-Type', 'application/json');
|
|
283
|
-
let s_err = err.toString();
|
|
284
|
-
res.setHeader('Content-Length', s_err.length);
|
|
285
|
-
//console.log('s_err', s_err);
|
|
286
|
-
res.end(s_err);
|
|
287
|
-
//var e = new Error('error message');
|
|
288
|
-
//next(e);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}));
|
|
292
|
-
} else {
|
|
293
|
-
const bufs = [];
|
|
294
|
-
req.on('data', function (data) {
|
|
295
|
-
bufs.push(data);
|
|
296
|
-
});
|
|
297
|
-
req.on('end', async () => {
|
|
298
|
-
const buf = Buffer.concat(bufs);
|
|
299
|
-
let obj = JSON.parse(buf.toString());
|
|
300
|
-
try {
|
|
301
|
-
if (auth_info && auth_info !== true) {
|
|
302
|
-
let r = await this.resource.post(auth_info, obj);
|
|
303
|
-
serve_result(r);
|
|
304
|
-
} else {
|
|
305
|
-
let r = await this.resource.post(obj);
|
|
306
|
-
serve_result(r);
|
|
307
|
-
}
|
|
308
|
-
} catch (err) {
|
|
309
|
-
console.log('err', err);
|
|
310
|
-
res.statusCode = 400;
|
|
311
|
-
res.setHeader('Content-Type', 'application/json');
|
|
312
|
-
let s_err = err.toString();
|
|
313
|
-
res.setHeader('Content-Length', s_err.length);
|
|
314
|
-
res.end(s_err);
|
|
315
|
-
//var e = new Error('error message');
|
|
316
|
-
//next(e);
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
})();
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// override handle_http
|
|
325
|
-
}
|
|
1
|
+
// Just a Class for a change
|
|
2
|
+
// then handle...
|
|
3
|
+
// need to handle http requests, for the resource.
|
|
4
|
+
const zlib = require('zlib');
|
|
5
|
+
const Cookies = require('cookies');
|
|
6
|
+
const multiparty = require('multiparty');
|
|
7
|
+
//const util = require('util');
|
|
8
|
+
|
|
9
|
+
// Publishing using websockets would be cool.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// More observable systems?
|
|
13
|
+
// Making use of ofp could be very useful in various cases.
|
|
14
|
+
// mfp in some parts first?
|
|
15
|
+
const HTTP_Publisher = require('./http-publisher');
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
// For publishing a resource, implying resources don't themselves need http handling.
|
|
19
|
+
|
|
20
|
+
// maybe a handle-http js file may help that will do things in a rather general purpose way?
|
|
21
|
+
// But it more seems as though we need to set the routing. Then we could assign such handlers from the router.
|
|
22
|
+
|
|
23
|
+
// Possibly there should be a Website_Router Resource?
|
|
24
|
+
// Or a resource wrapper.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
// Could extend a JSON_Publisher. Resource_JSON_Publisher possibly.
|
|
30
|
+
class Resource_Publisher extends HTTP_Publisher {
|
|
31
|
+
|
|
32
|
+
// Make this able to publish any resource?
|
|
33
|
+
// But I don't think this is going to publish a Website Resource as a Website.
|
|
34
|
+
// There is now the specialised HTTP_Website_Publisher.
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
constructor(spec) {
|
|
38
|
+
super(spec);
|
|
39
|
+
this.resource = spec.resource;
|
|
40
|
+
// Don't make a new server interface by default.
|
|
41
|
+
this.name = spec.name;
|
|
42
|
+
}
|
|
43
|
+
handle_http(req, res) {
|
|
44
|
+
//console.log('Resource_Publisher handle HTTP');
|
|
45
|
+
// then the http request params...
|
|
46
|
+
//console.log('req.url', req.url);
|
|
47
|
+
let {
|
|
48
|
+
headers,
|
|
49
|
+
url,
|
|
50
|
+
method,
|
|
51
|
+
params
|
|
52
|
+
} = req;
|
|
53
|
+
//console.log('headers, url, method, params', headers, url, method, params);
|
|
54
|
+
let resource_url_parts = url.split('/').slice(3).filter(x => x != '');
|
|
55
|
+
//console.log('resource_url_parts', resource_url_parts);
|
|
56
|
+
if (resource_url_parts.length === 1 && resource_url_parts[0] === 'status.json') {
|
|
57
|
+
(async () => {
|
|
58
|
+
let status = await this.resource.status;
|
|
59
|
+
//console.log('status', status);
|
|
60
|
+
let s_status = JSON.stringify(status);
|
|
61
|
+
//console.log('s_status', s_status);
|
|
62
|
+
res.setHeader('Content-Type', 'application/json');
|
|
63
|
+
res.end(s_status);
|
|
64
|
+
})();
|
|
65
|
+
} else {
|
|
66
|
+
// get the result from the resource.
|
|
67
|
+
// process?
|
|
68
|
+
(async () => {
|
|
69
|
+
let cookies = new Cookies(req, res);
|
|
70
|
+
let serve_access_error = () => {
|
|
71
|
+
//res.sendStatus(403);
|
|
72
|
+
//res.status(500).send({ error: "access denied" });
|
|
73
|
+
res.writeHead(403);
|
|
74
|
+
res.end('Access Denied');
|
|
75
|
+
}
|
|
76
|
+
let serve_result = (r) => {
|
|
77
|
+
if (r !== undefined) {
|
|
78
|
+
//console.log('r', r);
|
|
79
|
+
// Then turn it to JSON.
|
|
80
|
+
// to server output json.
|
|
81
|
+
|
|
82
|
+
// Resources that don't return JSON?
|
|
83
|
+
|
|
84
|
+
let j = JSON.stringify(r);
|
|
85
|
+
|
|
86
|
+
// Middleware could be better?
|
|
87
|
+
// Only want to gzip if the client says its accepted.
|
|
88
|
+
|
|
89
|
+
zlib.gzip(j, (error, result) => {
|
|
90
|
+
if (error) {
|
|
91
|
+
throw error;
|
|
92
|
+
} else {
|
|
93
|
+
// console.log(result);
|
|
94
|
+
res.setHeader('Content-Type', 'application/json');
|
|
95
|
+
res.setHeader('Content-Encoding', 'gzip');
|
|
96
|
+
res.setHeader('Content-Length', result.length);
|
|
97
|
+
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
98
|
+
res.setHeader('Pragma', 'no-cache');
|
|
99
|
+
res.setHeader('Expires', '0');
|
|
100
|
+
/*
|
|
101
|
+
Cache-Control: no-cache, no-store, must-revalidate
|
|
102
|
+
Pragma: no-cache
|
|
103
|
+
Expires: 0
|
|
104
|
+
*/
|
|
105
|
+
// compress with gzip
|
|
106
|
+
res.end(result);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
//console.log('j', j);
|
|
110
|
+
//console.log('typeof r', typeof r);
|
|
111
|
+
} else {
|
|
112
|
+
// Serve error?
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Want to build auth into the server module itself.
|
|
118
|
+
// Will show simple unauthorised app / view.
|
|
119
|
+
|
|
120
|
+
// /site/ controls?
|
|
121
|
+
// useful in particular for making a website?
|
|
122
|
+
// could be too large.
|
|
123
|
+
|
|
124
|
+
// /auth/ makes sense for a 'not logged in' control with its own API.
|
|
125
|
+
// include the login.js control too.
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
if (method === 'DELETE') {
|
|
129
|
+
let jwt_cookie = cookies.get('jwt') || cookies.get('Authentication');
|
|
130
|
+
let auth_info, r;
|
|
131
|
+
let restricted = false;
|
|
132
|
+
//console.log('jwt_cookie', jwt_cookie);
|
|
133
|
+
if (jwt_cookie) {
|
|
134
|
+
if (this.resource.authenticate) {
|
|
135
|
+
auth_info = this.resource.authenticate(jwt_cookie);
|
|
136
|
+
//let user_key = auth_info.key;
|
|
137
|
+
}
|
|
138
|
+
// Could provide further data...
|
|
139
|
+
} else {
|
|
140
|
+
// if there is an authenticate function but no cookie...
|
|
141
|
+
//console.log('this.resource.authenticate', this.resource.authenticate);
|
|
142
|
+
if (this.resource.authenticate) {
|
|
143
|
+
restricted = !this.resource.authenticate();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!restricted) {
|
|
147
|
+
if (auth_info && auth_info !== true) {
|
|
148
|
+
let r = await this.resource.delete(auth_info, resource_url_parts[0]);
|
|
149
|
+
serve_result(r);
|
|
150
|
+
} else {
|
|
151
|
+
console.log('resource_url_parts', resource_url_parts);
|
|
152
|
+
console.log('pre resource get');
|
|
153
|
+
let r = await this.resource.delete(resource_url_parts[0]);
|
|
154
|
+
serve_result(r);
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
console.log('restricted, so there is an error');
|
|
158
|
+
serve_access_error();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (method === 'GET') {
|
|
162
|
+
let jwt_cookie = cookies.get('jwt') || cookies.get('Authentication');
|
|
163
|
+
let auth_info, r;
|
|
164
|
+
let restricted = false;
|
|
165
|
+
//console.log('jwt_cookie', jwt_cookie);
|
|
166
|
+
if (jwt_cookie) {
|
|
167
|
+
if (this.resource.authenticate) {
|
|
168
|
+
auth_info = this.resource.authenticate(jwt_cookie);
|
|
169
|
+
//let user_key = auth_info.key;
|
|
170
|
+
}
|
|
171
|
+
// Could provide further data...
|
|
172
|
+
} else {
|
|
173
|
+
// if there is an authenticate function but no cookie...
|
|
174
|
+
//console.log('this.resource.authenticate', this.resource.authenticate);
|
|
175
|
+
if (this.resource.authenticate) {
|
|
176
|
+
restricted = !this.resource.authenticate();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!restricted) {
|
|
180
|
+
if (auth_info && auth_info !== true) {
|
|
181
|
+
let r = await this.resource.get(auth_info, resource_url_parts);
|
|
182
|
+
serve_result(r);
|
|
183
|
+
} else {
|
|
184
|
+
console.log('resource_url_parts', resource_url_parts);
|
|
185
|
+
console.log('pre resource get');
|
|
186
|
+
let r = await this.resource.get(resource_url_parts);
|
|
187
|
+
serve_result(r);
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
console.log('restricted, so there is an error');
|
|
191
|
+
serve_access_error();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (method === 'POST') {
|
|
195
|
+
//console.log('Resource_Publisher POST resource_url_parts');
|
|
196
|
+
//console.log('resource_url_parts', resource_url_parts);
|
|
197
|
+
//console.log('headers', headers);
|
|
198
|
+
let jwt_cookie = cookies.get('jwt') || cookies.get('Authentication');
|
|
199
|
+
let auth_info, r;
|
|
200
|
+
if (jwt_cookie) {
|
|
201
|
+
auth_info = this.resource.authenticate(jwt_cookie);
|
|
202
|
+
//let user_key = auth_info.key;
|
|
203
|
+
}
|
|
204
|
+
const content_type = headers['content-type'];
|
|
205
|
+
// 'multipart/form-data; boundary=----WebKitFormBoundaryxk08Mj2AlOPsmrGp'
|
|
206
|
+
let serve_result = r => {
|
|
207
|
+
if (r !== undefined) {
|
|
208
|
+
console.log('serve_result r', r);
|
|
209
|
+
// Then turn it to JSON.
|
|
210
|
+
// to server output json.
|
|
211
|
+
let j = JSON.stringify(r);
|
|
212
|
+
zlib.gzip(j, (error, result) => {
|
|
213
|
+
if (error) {
|
|
214
|
+
throw error;
|
|
215
|
+
} else {
|
|
216
|
+
// console.log(result);
|
|
217
|
+
res.setHeader('Content-Type', 'application/json');
|
|
218
|
+
res.setHeader('Content-Encoding', 'gzip');
|
|
219
|
+
res.setHeader('Content-Length', result.length);
|
|
220
|
+
// compress with gzip
|
|
221
|
+
res.end(result);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
//console.log('j', j);
|
|
225
|
+
//console.log('typeof r', typeof r);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (content_type.indexOf('multipart/form-data') === 0) {
|
|
229
|
+
var form = new multiparty.Form();
|
|
230
|
+
let files = [];
|
|
231
|
+
form.on('error', err => {
|
|
232
|
+
// serve error result
|
|
233
|
+
res.writeHead(500);
|
|
234
|
+
res.end('Error: ' + err);
|
|
235
|
+
});
|
|
236
|
+
form.on('part', function (part) {
|
|
237
|
+
//console.log('Object.keys(part)', Object.keys(part));
|
|
238
|
+
const {
|
|
239
|
+
headers,
|
|
240
|
+
name,
|
|
241
|
+
filename,
|
|
242
|
+
readable,
|
|
243
|
+
byteCount
|
|
244
|
+
} = part;
|
|
245
|
+
var bufs = [];
|
|
246
|
+
part.on('data', function (d) {
|
|
247
|
+
bufs.push(d);
|
|
248
|
+
});
|
|
249
|
+
part.on('end', function () {
|
|
250
|
+
var buf = Buffer.concat(bufs);
|
|
251
|
+
//console.log('buf', buf);
|
|
252
|
+
//console.log('buf.length', buf.length);
|
|
253
|
+
files.push({
|
|
254
|
+
buffer: buf,
|
|
255
|
+
name: name,
|
|
256
|
+
filename: filename
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
form.parse(req);
|
|
261
|
+
form.on('close', (async err => {
|
|
262
|
+
if (err) {
|
|
263
|
+
|
|
264
|
+
} else {
|
|
265
|
+
//console.log('form ended');
|
|
266
|
+
try {
|
|
267
|
+
if (auth_info && auth_info !== true) {
|
|
268
|
+
//console.log('pre resource post obj', obj);
|
|
269
|
+
//console.log('this.resource', this.resource);
|
|
270
|
+
//console.log('files', files);
|
|
271
|
+
let r = await this.resource.post(auth_info, files);
|
|
272
|
+
//console.log('r', r);
|
|
273
|
+
serve_result(r);
|
|
274
|
+
} else {
|
|
275
|
+
//console.log('pre resource post');
|
|
276
|
+
let r = await this.resource.post(files);
|
|
277
|
+
serve_result(r);
|
|
278
|
+
}
|
|
279
|
+
} catch (err) {
|
|
280
|
+
//console.log('err', err);
|
|
281
|
+
res.statusCode = 400;
|
|
282
|
+
res.setHeader('Content-Type', 'application/json');
|
|
283
|
+
let s_err = err.toString();
|
|
284
|
+
res.setHeader('Content-Length', s_err.length);
|
|
285
|
+
//console.log('s_err', s_err);
|
|
286
|
+
res.end(s_err);
|
|
287
|
+
//var e = new Error('error message');
|
|
288
|
+
//next(e);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}));
|
|
292
|
+
} else {
|
|
293
|
+
const bufs = [];
|
|
294
|
+
req.on('data', function (data) {
|
|
295
|
+
bufs.push(data);
|
|
296
|
+
});
|
|
297
|
+
req.on('end', async () => {
|
|
298
|
+
const buf = Buffer.concat(bufs);
|
|
299
|
+
let obj = JSON.parse(buf.toString());
|
|
300
|
+
try {
|
|
301
|
+
if (auth_info && auth_info !== true) {
|
|
302
|
+
let r = await this.resource.post(auth_info, obj);
|
|
303
|
+
serve_result(r);
|
|
304
|
+
} else {
|
|
305
|
+
let r = await this.resource.post(obj);
|
|
306
|
+
serve_result(r);
|
|
307
|
+
}
|
|
308
|
+
} catch (err) {
|
|
309
|
+
console.log('err', err);
|
|
310
|
+
res.statusCode = 400;
|
|
311
|
+
res.setHeader('Content-Type', 'application/json');
|
|
312
|
+
let s_err = err.toString();
|
|
313
|
+
res.setHeader('Content-Length', s_err.length);
|
|
314
|
+
res.end(s_err);
|
|
315
|
+
//var e = new Error('error message');
|
|
316
|
+
//next(e);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
})();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// override handle_http
|
|
325
|
+
}
|
|
326
326
|
module.exports = Resource_Publisher;
|