jsgui3-server 0.0.121 → 0.0.122
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 +248 -248
- package/examples/box/2) twenty square boxes/css flex wrap/server.js +112 -112
- 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 +320 -320
- package/examples/controls/10) window, mirrored text inputs/server.js +117 -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 +435 -452
- package/examples/controls/12) window, Select_Options control/server.js +117 -117
- 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 +204 -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 +247 -209
- package/examples/controls/8) window, checkbox/server.js +117 -117
- package/examples/controls/9) window, date picker/client.js +303 -303
- package/examples/controls/9) window, date picker/server.js +117 -117
- package/examples/controls/9b) window, shared data.model mirrored date pickers/client.js +398 -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/15) window, text field/server.js +0 -39
- 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,413 +1,413 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// 24/07/2019 - Looks like this needs more work.
|
|
4
|
-
// Want to provide simple and powerful API.
|
|
5
|
-
// Load images from disk to memory upon startup?
|
|
6
|
-
// Make resized versions?
|
|
7
|
-
|
|
8
|
-
// Specifically being able to deal with icons and a directory of icons.
|
|
9
|
-
|
|
10
|
-
var path = require('path'),
|
|
11
|
-
fs = require('fs'),
|
|
12
|
-
url = require('url'),
|
|
13
|
-
jsgui = require('jsgui3-html'),
|
|
14
|
-
os = require('os'),
|
|
15
|
-
http = require('http'),
|
|
16
|
-
libUrl = require('url'),
|
|
17
|
-
Resource = jsgui.Resource;
|
|
18
|
-
|
|
19
|
-
const fs2 = require('../fs2');
|
|
20
|
-
const fnlfs = require('fnlfs');
|
|
21
|
-
|
|
22
|
-
const libpath = require('path');
|
|
23
|
-
|
|
24
|
-
// Then could this connect to a cms db?
|
|
25
|
-
// Or a wider source of images?
|
|
26
|
-
// Mapping the ws image requests to acquiring the image data.
|
|
27
|
-
// Won't necessarily be on disk. Could call to another resource, such as network / file / files on network.
|
|
28
|
-
// Could map over / use another resource.
|
|
29
|
-
|
|
30
|
-
/*
|
|
31
|
-
jsgui_jpeg = require('../../image/node/jsgui-node-jpeg'),
|
|
32
|
-
jsgui_png = require('../../image/node/jsgui-node-png');
|
|
33
|
-
*/
|
|
34
|
-
//Worker = require('webworker-threads');
|
|
35
|
-
|
|
36
|
-
var stringify = jsgui.stringify,
|
|
37
|
-
each = jsgui.each,
|
|
38
|
-
arrayify = jsgui.arrayify,
|
|
39
|
-
tof = jsgui.tof;
|
|
40
|
-
var call_multi = jsgui.call_multi;
|
|
41
|
-
var filter_map_by_regex = jsgui.filter_map_by_regex;
|
|
42
|
-
var Class = jsgui.Class,
|
|
43
|
-
Data_Object = jsgui.Data_Object,
|
|
44
|
-
Enhanced_Data_Object = jsgui.Enhanced_Data_Object;
|
|
45
|
-
var fp = jsgui.fp,
|
|
46
|
-
is_defined = jsgui.is_defined;
|
|
47
|
-
var get_item_sig = jsgui.get_item_sig;
|
|
48
|
-
var Collection = jsgui.Collection;
|
|
49
|
-
|
|
50
|
-
// need to see what type of image it is.
|
|
51
|
-
var mime_types = {
|
|
52
|
-
'jpg': 'image/jpeg',
|
|
53
|
-
'jpeg': 'image/jpeg',
|
|
54
|
-
'gif': 'image/gif',
|
|
55
|
-
'png': 'image/png',
|
|
56
|
-
'svg': 'image/svg+xml',
|
|
57
|
-
'otf': 'application/font-sfnt',
|
|
58
|
-
'ttf': 'application/font-sfnt'
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
var serve_image_file_from_buffer = function (buffer, filename, response) {
|
|
62
|
-
console.log('filename', filename);
|
|
63
|
-
var extname = path.extname(filename);
|
|
64
|
-
console.log('extname ' + extname);
|
|
65
|
-
var extension = extname.substr(1);
|
|
66
|
-
console.log('extension ' + extension);
|
|
67
|
-
response.writeHead(200, {
|
|
68
|
-
'Content-Type': mime_types[extension]
|
|
69
|
-
});
|
|
70
|
-
response.end(buffer, 'binary');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
var serve_image_file_from_disk = function (filePath, response) {
|
|
74
|
-
var extname = path.extname(filePath);
|
|
75
|
-
console.log('extname ' + extname);
|
|
76
|
-
var extension = extname.substr(1);
|
|
77
|
-
console.log('extension ' + extension);
|
|
78
|
-
fs.readFile(filePath, function (err, data) {
|
|
79
|
-
if (err) {
|
|
80
|
-
throw err;
|
|
81
|
-
} else {
|
|
82
|
-
response.writeHead(200, {
|
|
83
|
-
'Content-Type': mime_types[extension]
|
|
84
|
-
});
|
|
85
|
-
response.end(data, 'binary');
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
class Site_Images extends Resource {
|
|
91
|
-
constructor(spec) {
|
|
92
|
-
super(spec);
|
|
93
|
-
this.custom_paths = {};
|
|
94
|
-
this.served_directories = new Collection({
|
|
95
|
-
'index_by': 'name'
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// A cache?
|
|
99
|
-
// By path?
|
|
100
|
-
// By name?
|
|
101
|
-
|
|
102
|
-
// Maybe an icon cache makes sense for the moment.
|
|
103
|
-
// All icons get loaded at the beginning.
|
|
104
|
-
// Want to be able to show mime types easily in a selector.
|
|
105
|
-
|
|
106
|
-
// Getting icons set up easily for an app will be very useful.
|
|
107
|
-
// Going to be similar between apps too.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
// map icons name to buffer
|
|
111
|
-
// or map icons, then there is some info within an obj.
|
|
112
|
-
|
|
113
|
-
this.map_icons = {};
|
|
114
|
-
|
|
115
|
-
// this.map_resized_icons = {} ???
|
|
116
|
-
|
|
117
|
-
// icons by name.
|
|
118
|
-
// will have the loaded buffers for the icons in memory too.
|
|
119
|
-
}
|
|
120
|
-
'start'(callback) {
|
|
121
|
-
callback(null, true);
|
|
122
|
-
}
|
|
123
|
-
'get_image_url'(image_key) {
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
'get_icon_url'(icon_key) {
|
|
127
|
-
// May have different size icons
|
|
128
|
-
// For the moment will keep this simple.
|
|
129
|
-
return '/img/icons/' + icon_key + '.png';
|
|
130
|
-
}
|
|
131
|
-
load_icon_set(path, map_icons) {
|
|
132
|
-
|
|
133
|
-
// Observable? Promise?
|
|
134
|
-
|
|
135
|
-
const my_map_icons = this.map_icons;
|
|
136
|
-
//const {map_icons} = this;
|
|
137
|
-
|
|
138
|
-
// Async function?
|
|
139
|
-
// Callback?
|
|
140
|
-
// lets just load them for the moment.
|
|
141
|
-
// obs function to show progress along the way could help too.
|
|
142
|
-
|
|
143
|
-
// use of fnlfs?
|
|
144
|
-
// do more work on that too?
|
|
145
|
-
// fnlfs definitely makes sense.
|
|
146
|
-
|
|
147
|
-
// maybe will have an observable (ofp) that loads a bunch of files.
|
|
148
|
-
// ofp seems perfect for this.
|
|
149
|
-
|
|
150
|
-
// A reverse of the map icons....
|
|
151
|
-
// mapping from the file name to the icon name
|
|
152
|
-
|
|
153
|
-
const map_icon_filenames_to_names = {};
|
|
154
|
-
// Worth making an array of them in each place.
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
each(map_icons, (v, k) => {
|
|
158
|
-
map_icon_filenames_to_names[v] = map_icon_filenames_to_names[v] || [];
|
|
159
|
-
map_icon_filenames_to_names[v].push(k)
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
//console.log('Website Image Resource load_icon_set', map_icons);
|
|
163
|
-
|
|
164
|
-
const icons_to_load = [];
|
|
165
|
-
const resolved_path = libpath.resolve(path);
|
|
166
|
-
//console.log('resolved_path', resolved_path);
|
|
167
|
-
const obs_files = fnlfs.dir_files(resolved_path);
|
|
168
|
-
//console.log('obs_files', obs_files);
|
|
169
|
-
obs_files.on('next', data => {
|
|
170
|
-
//console.log('obs_files next data', data);
|
|
171
|
-
|
|
172
|
-
// does the file match the map_icons
|
|
173
|
-
// extname
|
|
174
|
-
const {name, path} = data;
|
|
175
|
-
// search for it before the last .
|
|
176
|
-
let noextname;
|
|
177
|
-
let pos1 = name.lastIndexOf('.');
|
|
178
|
-
// just need to get these icons easily available....
|
|
179
|
-
|
|
180
|
-
if (pos1 > -1) {
|
|
181
|
-
noextname = name.substring(0, pos1);
|
|
182
|
-
} else {
|
|
183
|
-
noextname = name;
|
|
184
|
-
}
|
|
185
|
-
//console.log('noextname', noextname);
|
|
186
|
-
// check for the name match....
|
|
187
|
-
|
|
188
|
-
if (map_icon_filenames_to_names[name]) {
|
|
189
|
-
//console.log('found match', name);
|
|
190
|
-
//console.log('map_icon_filenames_to_names[name]', map_icon_filenames_to_names[name]);
|
|
191
|
-
|
|
192
|
-
each(map_icon_filenames_to_names[name], filename => {
|
|
193
|
-
icons_to_load.push([filename, name, path]);
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
// Then put it in icons_to_load
|
|
198
|
-
// keep track of the relvant paths and icon names.
|
|
199
|
-
// best to include the full path...
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
obs_files.on('complete', async() => {
|
|
205
|
-
//console.log('obs files complete. icons_to_load', icons_to_load);
|
|
206
|
-
|
|
207
|
-
// Then go through this list, loading them into buffers.
|
|
208
|
-
// Then those buffers will be served on request using the names given for the icons.
|
|
209
|
-
|
|
210
|
-
// async for in loop...
|
|
211
|
-
|
|
212
|
-
for (let icon_info of icons_to_load) {
|
|
213
|
-
const [icon_key, filename, path] = icon_info;
|
|
214
|
-
// load the file....
|
|
215
|
-
|
|
216
|
-
// is load an obs?
|
|
217
|
-
const buf_file = await fnlfs.load(path);
|
|
218
|
-
//console.log('buf_file', buf_file);
|
|
219
|
-
//console.log('buf_file.length', buf_file.length);
|
|
220
|
-
|
|
221
|
-
// then put this into the buffer of icons.
|
|
222
|
-
// by size? icon resizing?
|
|
223
|
-
|
|
224
|
-
// mime_types
|
|
225
|
-
// look into mime_types
|
|
226
|
-
|
|
227
|
-
// look at the file extension too.
|
|
228
|
-
// work out the mime_type that way.
|
|
229
|
-
|
|
230
|
-
const ext = libpath.extname(filename).substr(1);
|
|
231
|
-
//console.log('ext', ext);
|
|
232
|
-
|
|
233
|
-
const mime_type = mime_types[ext];
|
|
234
|
-
//console.log('mime_type', mime_type);
|
|
235
|
-
|
|
236
|
-
my_map_icons[icon_key] = {
|
|
237
|
-
'mime_type': mime_type,
|
|
238
|
-
'key': icon_key,
|
|
239
|
-
'buffer': buf_file
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// Send the names of all icons over to the client?
|
|
245
|
-
// Not right now, just make them available from the server.
|
|
246
|
-
|
|
247
|
-
// load the file names in the path...?
|
|
248
|
-
// see which correspond to the map_icons
|
|
249
|
-
// then load those icons from disk. - done that.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// load_icon_set
|
|
257
|
-
// will get them served under /img/icons/...
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
// want to be able to serve a path better.
|
|
264
|
-
// still has bug here.
|
|
265
|
-
'serve_directory'(path) {
|
|
266
|
-
this.served_directories.push({
|
|
267
|
-
'name': path
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
// basically get requests, but can handle more than just get.
|
|
271
|
-
'process'(req, res) {
|
|
272
|
-
//console.log('Site_Images processing');
|
|
273
|
-
|
|
274
|
-
// Escaping etc?
|
|
275
|
-
// slashed in icon keys? escape and unescape them...?
|
|
276
|
-
|
|
277
|
-
// change some keys...? avoid slashes in keys...
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
// Should look into icons collection?
|
|
283
|
-
// A specific /img/icons/ system will be in use.
|
|
284
|
-
// Means to get resized versions too?
|
|
285
|
-
|
|
286
|
-
// When processing a request, check if there is such an icon?
|
|
287
|
-
|
|
288
|
-
// looking in img/icons/?
|
|
289
|
-
// will have special processing for them.
|
|
290
|
-
|
|
291
|
-
const {map_icons} = this;
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
var remoteAddress = req.connection.remoteAddress;
|
|
295
|
-
var custom_paths = this.custom_paths;
|
|
296
|
-
|
|
297
|
-
var rurl = req.url;
|
|
298
|
-
//var pool = this.pool;
|
|
299
|
-
// should have a bunch of resources from the pool.
|
|
300
|
-
//var pool_resources = pool.resources();
|
|
301
|
-
//console.log('pool_resources ' + stringify(pool_resources));
|
|
302
|
-
var url_parts = url.parse(req.url, true);
|
|
303
|
-
//console.log('url_parts ' + stringify(url_parts));
|
|
304
|
-
var splitPath = url_parts.path.substr(1).split('/');
|
|
305
|
-
console.log('resource site images splitPath ' + stringify(splitPath));
|
|
306
|
-
|
|
307
|
-
// Will check for icons first.
|
|
308
|
-
// Be able to reference icons without the extension.
|
|
309
|
-
// easier that way. just icon keys.
|
|
310
|
-
|
|
311
|
-
let ctu = true;
|
|
312
|
-
|
|
313
|
-
if (splitPath.length === 3) {
|
|
314
|
-
// and the icons...
|
|
315
|
-
|
|
316
|
-
if (splitPath[1] === 'icons') {
|
|
317
|
-
const icon_key = splitPath[2];
|
|
318
|
-
const icon_info = map_icons[icon_key];
|
|
319
|
-
if (icon_info) {
|
|
320
|
-
console.log('icon_info', icon_info);
|
|
321
|
-
|
|
322
|
-
const {mime_type, buffer} = icon_info;
|
|
323
|
-
|
|
324
|
-
// then serve that buffer with that mime type.
|
|
325
|
-
|
|
326
|
-
res.writeHead(200, {
|
|
327
|
-
"Content-Type": mime_type
|
|
328
|
-
});
|
|
329
|
-
res.write(buffer);
|
|
330
|
-
res.end();
|
|
331
|
-
ctu = false;
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
if (ctu) {
|
|
344
|
-
if (rurl.substr(0, 1) == '/') rurl = rurl.substr(1);
|
|
345
|
-
rurl = rurl.replace(/\./g, '☺');
|
|
346
|
-
//console.log('rurl ' + rurl);
|
|
347
|
-
var custom_response_entry = custom_paths[rurl];
|
|
348
|
-
var that = this;
|
|
349
|
-
//console.log('custom_response_entry ' + stringify(custom_response_entry));
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
if (custom_response_entry) {
|
|
354
|
-
var tcr = tof(custom_response_entry);
|
|
355
|
-
//console.log('tcr ' + tcr);
|
|
356
|
-
if (tcr == 'data_value') {
|
|
357
|
-
val = custom_response_entry.value();
|
|
358
|
-
//console.log('val ' + val);
|
|
359
|
-
var tval = tof(val);
|
|
360
|
-
if (tval == 'string') {
|
|
361
|
-
// then it should be a local file path, serve it.
|
|
362
|
-
serve_image_file_from_disk(val, res);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
//throw 'stop';
|
|
366
|
-
} else {
|
|
367
|
-
//console.log('splitPath', splitPath);
|
|
368
|
-
if (splitPath.length > 0) {
|
|
369
|
-
if (splitPath[0] == 'img' || splitPath[0] == 'images') {
|
|
370
|
-
//console.log('splitPath', splitPath);
|
|
371
|
-
if (splitPath.length > 1) {
|
|
372
|
-
// At this point, can look for the file on disk within the app directory.
|
|
373
|
-
//console.log('rurl', rurl);
|
|
374
|
-
//console.log('req.url', req.url);
|
|
375
|
-
// replace /images/ with /img/
|
|
376
|
-
var project_disk_path = req.url.replace('images/', 'img/');
|
|
377
|
-
if (project_disk_path.substr(0, 1) == '/') project_disk_path = project_disk_path.substr(1);
|
|
378
|
-
// try to load it from disk.
|
|
379
|
-
// try to load it as a buffer
|
|
380
|
-
fs2.load_file_as_buffer(project_disk_path, function (err, buffer) {
|
|
381
|
-
if (err) {
|
|
382
|
-
console.log('error loading ' + project_disk_path + ': ' + err);
|
|
383
|
-
// Then try serving the file using the other methods, but will need to take care not to expect some resources to be there,
|
|
384
|
-
// such as the web_data resource.
|
|
385
|
-
// Want top have a very versitile web_data resource that uses a DB, but also to have the means to interact with the files on disk
|
|
386
|
-
// in the project directory.
|
|
387
|
-
res.writeHead(404, {
|
|
388
|
-
"Content-Type": "text/plain"
|
|
389
|
-
});
|
|
390
|
-
res.write("404 Not Found\n");
|
|
391
|
-
res.end();
|
|
392
|
-
} else {
|
|
393
|
-
console.log('loaded file, need to serve it');
|
|
394
|
-
// need to set the mime type correctly.
|
|
395
|
-
// We can get this from the file name for the moment.
|
|
396
|
-
// serve_image_file_from_buffer
|
|
397
|
-
//serve_image_file_from_disk(diskPath, res);
|
|
398
|
-
console.log('buffer', buffer);
|
|
399
|
-
console.log('project_disk_path', project_disk_path);
|
|
400
|
-
serve_image_file_from_buffer(buffer, project_disk_path, res);
|
|
401
|
-
}
|
|
402
|
-
})
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
}
|
|
412
|
-
}
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// 24/07/2019 - Looks like this needs more work.
|
|
4
|
+
// Want to provide simple and powerful API.
|
|
5
|
+
// Load images from disk to memory upon startup?
|
|
6
|
+
// Make resized versions?
|
|
7
|
+
|
|
8
|
+
// Specifically being able to deal with icons and a directory of icons.
|
|
9
|
+
|
|
10
|
+
var path = require('path'),
|
|
11
|
+
fs = require('fs'),
|
|
12
|
+
url = require('url'),
|
|
13
|
+
jsgui = require('jsgui3-html'),
|
|
14
|
+
os = require('os'),
|
|
15
|
+
http = require('http'),
|
|
16
|
+
libUrl = require('url'),
|
|
17
|
+
Resource = jsgui.Resource;
|
|
18
|
+
|
|
19
|
+
const fs2 = require('../fs2');
|
|
20
|
+
const fnlfs = require('fnlfs');
|
|
21
|
+
|
|
22
|
+
const libpath = require('path');
|
|
23
|
+
|
|
24
|
+
// Then could this connect to a cms db?
|
|
25
|
+
// Or a wider source of images?
|
|
26
|
+
// Mapping the ws image requests to acquiring the image data.
|
|
27
|
+
// Won't necessarily be on disk. Could call to another resource, such as network / file / files on network.
|
|
28
|
+
// Could map over / use another resource.
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
jsgui_jpeg = require('../../image/node/jsgui-node-jpeg'),
|
|
32
|
+
jsgui_png = require('../../image/node/jsgui-node-png');
|
|
33
|
+
*/
|
|
34
|
+
//Worker = require('webworker-threads');
|
|
35
|
+
|
|
36
|
+
var stringify = jsgui.stringify,
|
|
37
|
+
each = jsgui.each,
|
|
38
|
+
arrayify = jsgui.arrayify,
|
|
39
|
+
tof = jsgui.tof;
|
|
40
|
+
var call_multi = jsgui.call_multi;
|
|
41
|
+
var filter_map_by_regex = jsgui.filter_map_by_regex;
|
|
42
|
+
var Class = jsgui.Class,
|
|
43
|
+
Data_Object = jsgui.Data_Object,
|
|
44
|
+
Enhanced_Data_Object = jsgui.Enhanced_Data_Object;
|
|
45
|
+
var fp = jsgui.fp,
|
|
46
|
+
is_defined = jsgui.is_defined;
|
|
47
|
+
var get_item_sig = jsgui.get_item_sig;
|
|
48
|
+
var Collection = jsgui.Collection;
|
|
49
|
+
|
|
50
|
+
// need to see what type of image it is.
|
|
51
|
+
var mime_types = {
|
|
52
|
+
'jpg': 'image/jpeg',
|
|
53
|
+
'jpeg': 'image/jpeg',
|
|
54
|
+
'gif': 'image/gif',
|
|
55
|
+
'png': 'image/png',
|
|
56
|
+
'svg': 'image/svg+xml',
|
|
57
|
+
'otf': 'application/font-sfnt',
|
|
58
|
+
'ttf': 'application/font-sfnt'
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var serve_image_file_from_buffer = function (buffer, filename, response) {
|
|
62
|
+
console.log('filename', filename);
|
|
63
|
+
var extname = path.extname(filename);
|
|
64
|
+
console.log('extname ' + extname);
|
|
65
|
+
var extension = extname.substr(1);
|
|
66
|
+
console.log('extension ' + extension);
|
|
67
|
+
response.writeHead(200, {
|
|
68
|
+
'Content-Type': mime_types[extension]
|
|
69
|
+
});
|
|
70
|
+
response.end(buffer, 'binary');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
var serve_image_file_from_disk = function (filePath, response) {
|
|
74
|
+
var extname = path.extname(filePath);
|
|
75
|
+
console.log('extname ' + extname);
|
|
76
|
+
var extension = extname.substr(1);
|
|
77
|
+
console.log('extension ' + extension);
|
|
78
|
+
fs.readFile(filePath, function (err, data) {
|
|
79
|
+
if (err) {
|
|
80
|
+
throw err;
|
|
81
|
+
} else {
|
|
82
|
+
response.writeHead(200, {
|
|
83
|
+
'Content-Type': mime_types[extension]
|
|
84
|
+
});
|
|
85
|
+
response.end(data, 'binary');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
class Site_Images extends Resource {
|
|
91
|
+
constructor(spec) {
|
|
92
|
+
super(spec);
|
|
93
|
+
this.custom_paths = {};
|
|
94
|
+
this.served_directories = new Collection({
|
|
95
|
+
'index_by': 'name'
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// A cache?
|
|
99
|
+
// By path?
|
|
100
|
+
// By name?
|
|
101
|
+
|
|
102
|
+
// Maybe an icon cache makes sense for the moment.
|
|
103
|
+
// All icons get loaded at the beginning.
|
|
104
|
+
// Want to be able to show mime types easily in a selector.
|
|
105
|
+
|
|
106
|
+
// Getting icons set up easily for an app will be very useful.
|
|
107
|
+
// Going to be similar between apps too.
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
// map icons name to buffer
|
|
111
|
+
// or map icons, then there is some info within an obj.
|
|
112
|
+
|
|
113
|
+
this.map_icons = {};
|
|
114
|
+
|
|
115
|
+
// this.map_resized_icons = {} ???
|
|
116
|
+
|
|
117
|
+
// icons by name.
|
|
118
|
+
// will have the loaded buffers for the icons in memory too.
|
|
119
|
+
}
|
|
120
|
+
'start'(callback) {
|
|
121
|
+
callback(null, true);
|
|
122
|
+
}
|
|
123
|
+
'get_image_url'(image_key) {
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
'get_icon_url'(icon_key) {
|
|
127
|
+
// May have different size icons
|
|
128
|
+
// For the moment will keep this simple.
|
|
129
|
+
return '/img/icons/' + icon_key + '.png';
|
|
130
|
+
}
|
|
131
|
+
load_icon_set(path, map_icons) {
|
|
132
|
+
|
|
133
|
+
// Observable? Promise?
|
|
134
|
+
|
|
135
|
+
const my_map_icons = this.map_icons;
|
|
136
|
+
//const {map_icons} = this;
|
|
137
|
+
|
|
138
|
+
// Async function?
|
|
139
|
+
// Callback?
|
|
140
|
+
// lets just load them for the moment.
|
|
141
|
+
// obs function to show progress along the way could help too.
|
|
142
|
+
|
|
143
|
+
// use of fnlfs?
|
|
144
|
+
// do more work on that too?
|
|
145
|
+
// fnlfs definitely makes sense.
|
|
146
|
+
|
|
147
|
+
// maybe will have an observable (ofp) that loads a bunch of files.
|
|
148
|
+
// ofp seems perfect for this.
|
|
149
|
+
|
|
150
|
+
// A reverse of the map icons....
|
|
151
|
+
// mapping from the file name to the icon name
|
|
152
|
+
|
|
153
|
+
const map_icon_filenames_to_names = {};
|
|
154
|
+
// Worth making an array of them in each place.
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
each(map_icons, (v, k) => {
|
|
158
|
+
map_icon_filenames_to_names[v] = map_icon_filenames_to_names[v] || [];
|
|
159
|
+
map_icon_filenames_to_names[v].push(k)
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
//console.log('Website Image Resource load_icon_set', map_icons);
|
|
163
|
+
|
|
164
|
+
const icons_to_load = [];
|
|
165
|
+
const resolved_path = libpath.resolve(path);
|
|
166
|
+
//console.log('resolved_path', resolved_path);
|
|
167
|
+
const obs_files = fnlfs.dir_files(resolved_path);
|
|
168
|
+
//console.log('obs_files', obs_files);
|
|
169
|
+
obs_files.on('next', data => {
|
|
170
|
+
//console.log('obs_files next data', data);
|
|
171
|
+
|
|
172
|
+
// does the file match the map_icons
|
|
173
|
+
// extname
|
|
174
|
+
const {name, path} = data;
|
|
175
|
+
// search for it before the last .
|
|
176
|
+
let noextname;
|
|
177
|
+
let pos1 = name.lastIndexOf('.');
|
|
178
|
+
// just need to get these icons easily available....
|
|
179
|
+
|
|
180
|
+
if (pos1 > -1) {
|
|
181
|
+
noextname = name.substring(0, pos1);
|
|
182
|
+
} else {
|
|
183
|
+
noextname = name;
|
|
184
|
+
}
|
|
185
|
+
//console.log('noextname', noextname);
|
|
186
|
+
// check for the name match....
|
|
187
|
+
|
|
188
|
+
if (map_icon_filenames_to_names[name]) {
|
|
189
|
+
//console.log('found match', name);
|
|
190
|
+
//console.log('map_icon_filenames_to_names[name]', map_icon_filenames_to_names[name]);
|
|
191
|
+
|
|
192
|
+
each(map_icon_filenames_to_names[name], filename => {
|
|
193
|
+
icons_to_load.push([filename, name, path]);
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
// Then put it in icons_to_load
|
|
198
|
+
// keep track of the relvant paths and icon names.
|
|
199
|
+
// best to include the full path...
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
obs_files.on('complete', async() => {
|
|
205
|
+
//console.log('obs files complete. icons_to_load', icons_to_load);
|
|
206
|
+
|
|
207
|
+
// Then go through this list, loading them into buffers.
|
|
208
|
+
// Then those buffers will be served on request using the names given for the icons.
|
|
209
|
+
|
|
210
|
+
// async for in loop...
|
|
211
|
+
|
|
212
|
+
for (let icon_info of icons_to_load) {
|
|
213
|
+
const [icon_key, filename, path] = icon_info;
|
|
214
|
+
// load the file....
|
|
215
|
+
|
|
216
|
+
// is load an obs?
|
|
217
|
+
const buf_file = await fnlfs.load(path);
|
|
218
|
+
//console.log('buf_file', buf_file);
|
|
219
|
+
//console.log('buf_file.length', buf_file.length);
|
|
220
|
+
|
|
221
|
+
// then put this into the buffer of icons.
|
|
222
|
+
// by size? icon resizing?
|
|
223
|
+
|
|
224
|
+
// mime_types
|
|
225
|
+
// look into mime_types
|
|
226
|
+
|
|
227
|
+
// look at the file extension too.
|
|
228
|
+
// work out the mime_type that way.
|
|
229
|
+
|
|
230
|
+
const ext = libpath.extname(filename).substr(1);
|
|
231
|
+
//console.log('ext', ext);
|
|
232
|
+
|
|
233
|
+
const mime_type = mime_types[ext];
|
|
234
|
+
//console.log('mime_type', mime_type);
|
|
235
|
+
|
|
236
|
+
my_map_icons[icon_key] = {
|
|
237
|
+
'mime_type': mime_type,
|
|
238
|
+
'key': icon_key,
|
|
239
|
+
'buffer': buf_file
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// Send the names of all icons over to the client?
|
|
245
|
+
// Not right now, just make them available from the server.
|
|
246
|
+
|
|
247
|
+
// load the file names in the path...?
|
|
248
|
+
// see which correspond to the map_icons
|
|
249
|
+
// then load those icons from disk. - done that.
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// load_icon_set
|
|
257
|
+
// will get them served under /img/icons/...
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
// want to be able to serve a path better.
|
|
264
|
+
// still has bug here.
|
|
265
|
+
'serve_directory'(path) {
|
|
266
|
+
this.served_directories.push({
|
|
267
|
+
'name': path
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// basically get requests, but can handle more than just get.
|
|
271
|
+
'process'(req, res) {
|
|
272
|
+
//console.log('Site_Images processing');
|
|
273
|
+
|
|
274
|
+
// Escaping etc?
|
|
275
|
+
// slashed in icon keys? escape and unescape them...?
|
|
276
|
+
|
|
277
|
+
// change some keys...? avoid slashes in keys...
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
// Should look into icons collection?
|
|
283
|
+
// A specific /img/icons/ system will be in use.
|
|
284
|
+
// Means to get resized versions too?
|
|
285
|
+
|
|
286
|
+
// When processing a request, check if there is such an icon?
|
|
287
|
+
|
|
288
|
+
// looking in img/icons/?
|
|
289
|
+
// will have special processing for them.
|
|
290
|
+
|
|
291
|
+
const {map_icons} = this;
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
var remoteAddress = req.connection.remoteAddress;
|
|
295
|
+
var custom_paths = this.custom_paths;
|
|
296
|
+
|
|
297
|
+
var rurl = req.url;
|
|
298
|
+
//var pool = this.pool;
|
|
299
|
+
// should have a bunch of resources from the pool.
|
|
300
|
+
//var pool_resources = pool.resources();
|
|
301
|
+
//console.log('pool_resources ' + stringify(pool_resources));
|
|
302
|
+
var url_parts = url.parse(req.url, true);
|
|
303
|
+
//console.log('url_parts ' + stringify(url_parts));
|
|
304
|
+
var splitPath = url_parts.path.substr(1).split('/');
|
|
305
|
+
console.log('resource site images splitPath ' + stringify(splitPath));
|
|
306
|
+
|
|
307
|
+
// Will check for icons first.
|
|
308
|
+
// Be able to reference icons without the extension.
|
|
309
|
+
// easier that way. just icon keys.
|
|
310
|
+
|
|
311
|
+
let ctu = true;
|
|
312
|
+
|
|
313
|
+
if (splitPath.length === 3) {
|
|
314
|
+
// and the icons...
|
|
315
|
+
|
|
316
|
+
if (splitPath[1] === 'icons') {
|
|
317
|
+
const icon_key = splitPath[2];
|
|
318
|
+
const icon_info = map_icons[icon_key];
|
|
319
|
+
if (icon_info) {
|
|
320
|
+
console.log('icon_info', icon_info);
|
|
321
|
+
|
|
322
|
+
const {mime_type, buffer} = icon_info;
|
|
323
|
+
|
|
324
|
+
// then serve that buffer with that mime type.
|
|
325
|
+
|
|
326
|
+
res.writeHead(200, {
|
|
327
|
+
"Content-Type": mime_type
|
|
328
|
+
});
|
|
329
|
+
res.write(buffer);
|
|
330
|
+
res.end();
|
|
331
|
+
ctu = false;
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
if (ctu) {
|
|
344
|
+
if (rurl.substr(0, 1) == '/') rurl = rurl.substr(1);
|
|
345
|
+
rurl = rurl.replace(/\./g, '☺');
|
|
346
|
+
//console.log('rurl ' + rurl);
|
|
347
|
+
var custom_response_entry = custom_paths[rurl];
|
|
348
|
+
var that = this;
|
|
349
|
+
//console.log('custom_response_entry ' + stringify(custom_response_entry));
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
if (custom_response_entry) {
|
|
354
|
+
var tcr = tof(custom_response_entry);
|
|
355
|
+
//console.log('tcr ' + tcr);
|
|
356
|
+
if (tcr == 'data_value') {
|
|
357
|
+
val = custom_response_entry.value();
|
|
358
|
+
//console.log('val ' + val);
|
|
359
|
+
var tval = tof(val);
|
|
360
|
+
if (tval == 'string') {
|
|
361
|
+
// then it should be a local file path, serve it.
|
|
362
|
+
serve_image_file_from_disk(val, res);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//throw 'stop';
|
|
366
|
+
} else {
|
|
367
|
+
//console.log('splitPath', splitPath);
|
|
368
|
+
if (splitPath.length > 0) {
|
|
369
|
+
if (splitPath[0] == 'img' || splitPath[0] == 'images') {
|
|
370
|
+
//console.log('splitPath', splitPath);
|
|
371
|
+
if (splitPath.length > 1) {
|
|
372
|
+
// At this point, can look for the file on disk within the app directory.
|
|
373
|
+
//console.log('rurl', rurl);
|
|
374
|
+
//console.log('req.url', req.url);
|
|
375
|
+
// replace /images/ with /img/
|
|
376
|
+
var project_disk_path = req.url.replace('images/', 'img/');
|
|
377
|
+
if (project_disk_path.substr(0, 1) == '/') project_disk_path = project_disk_path.substr(1);
|
|
378
|
+
// try to load it from disk.
|
|
379
|
+
// try to load it as a buffer
|
|
380
|
+
fs2.load_file_as_buffer(project_disk_path, function (err, buffer) {
|
|
381
|
+
if (err) {
|
|
382
|
+
console.log('error loading ' + project_disk_path + ': ' + err);
|
|
383
|
+
// Then try serving the file using the other methods, but will need to take care not to expect some resources to be there,
|
|
384
|
+
// such as the web_data resource.
|
|
385
|
+
// Want top have a very versitile web_data resource that uses a DB, but also to have the means to interact with the files on disk
|
|
386
|
+
// in the project directory.
|
|
387
|
+
res.writeHead(404, {
|
|
388
|
+
"Content-Type": "text/plain"
|
|
389
|
+
});
|
|
390
|
+
res.write("404 Not Found\n");
|
|
391
|
+
res.end();
|
|
392
|
+
} else {
|
|
393
|
+
console.log('loaded file, need to serve it');
|
|
394
|
+
// need to set the mime type correctly.
|
|
395
|
+
// We can get this from the file name for the moment.
|
|
396
|
+
// serve_image_file_from_buffer
|
|
397
|
+
//serve_image_file_from_disk(diskPath, res);
|
|
398
|
+
console.log('buffer', buffer);
|
|
399
|
+
console.log('project_disk_path', project_disk_path);
|
|
400
|
+
serve_image_file_from_buffer(buffer, project_disk_path, res);
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
413
|
module.exports = Site_Images;
|