webfast 0.1.32 → 0.1.37

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,174 @@
1
1
  console.log(`WebFast!`);
2
- window.WebFast = {
3
- ts : Date.now()
4
- }
2
+ let web= {};
3
+ web.fast = {
4
+ ts : Date.now(),
5
+ action : function(data,ell) {
6
+ console.log(`Action Function`,data,ell);
7
+ },
8
+ functions : {
9
+ form : function(data,ell) {
10
+ console.log(`Handle Form Function`);
11
+ }
12
+ },
13
+ que : {
14
+ list : [],
15
+ state : false,
16
+ run : function(count){
17
+ // Grab first before sending
18
+ item = web.fast.que.list[0];
19
+ if (item != undefined) {
20
+ delete web.fast.que.list[0];
21
+ web.fast.que.list.slice(1);
22
+ console.log(`Sending Item`,item);
23
+
24
+ web.fast.socket.send(JSON.stringify(item)); // Send data to the server
25
+ }
26
+ }
27
+ },
28
+ tmp : {
29
+ int : {}
30
+ },
31
+ socket : undefined
32
+ }
33
+ // Connect to the Socket.IO server
34
+ const telegram = window.Telegram.WebApp;
35
+ // Step 1: Parse the query string
36
+ if (webfastSocket == undefined) {
37
+ webfastSocket = window.location.host;
38
+ }
39
+
40
+ let setData;
41
+ if (telegram.initData == ``) {
42
+ setData = `hybrid.institute.anonymous`
43
+ } else {
44
+ setData = telegram.initData;
45
+ }
46
+
47
+ const socketURL = `wss://${webfastSocket.replace(`https://`,``)}socket.io/?qbt=${setData}`;
48
+
49
+ // Assuming you have a variable `socketURL` containing your WebSocket URL
50
+ web.fast.connectWebSocket = function(socketURL,maxRetries = 40, retries = 0) {
51
+ web.fast.createWebSocket = function(socketURL, maxRetries, retries) {
52
+ const ws = new WebSocket(socketURL);
53
+ web.fast.socket = ws;
54
+ ws.onopen = () => {
55
+ console.log('WebSocket connected');
56
+ // Start other things (e.g., send initial data)
57
+ web.fast.que.state = true;
58
+ };
59
+
60
+ ws.onmessage = (event) => {
61
+ console.log('Received:', event.data);
62
+ // Handle received data
63
+ web.fast.que.state = Date.now();
64
+ web.fast.receive(`socket`,event.data); // Placeholder for processing response
65
+ };
66
+
67
+ ws.onclose = (event) => {
68
+ web.fast.que.state = false;
69
+ if (retries < maxRetries) {
70
+ retries++;
71
+ console.log(`WebSocket closed. Retrying in 10 seconds...`);
72
+ setTimeout(web.fast.createWebSocket(socketURL,maxRetries,retries), 10000); // Retry after 10 seconds
73
+ } else {
74
+ console.log(`WebSocket connection failed after ${maxRetries} attempts.`);
75
+ // Handle failure (e.g., show an error message)
76
+ }
77
+ };
78
+
79
+ ws.onerror = (error) => {
80
+ console.error('WebSocket error:', error);
81
+ // Handle error (e.g., show an error message)
82
+ web.fast.que.state = false;
83
+ };
84
+
85
+ // Send message to path for example api.example.event
86
+ web.fast.sendMessage = function(path,message) {
87
+ // Add to que
88
+ web.fast.que.list.push({
89
+ path : path,
90
+ message : message});
91
+ }
92
+ };
93
+
94
+ web.fast.createWebSocket(socketURL, maxRetries, retries); // Initial connection
95
+ }
96
+
97
+ // Call the function to start the WebSocket connection
98
+ web.fast.connectWebSocket(socketURL);
99
+ web.fast.receive = function(data) {
100
+ // Placeholder for processing the received data
101
+ // Implement your logic here (e.g., update UI, handle specific messages)
102
+ console.log('Processing received data:', data);
103
+ }
104
+
105
+ // On Ready desable all forms with jquery
106
+ jQuery(document).ready(function() {
107
+
108
+ // Make function
109
+ web.fast.tmp.int.que = setInterval(function(){
110
+ // This is the function
111
+ if (web.fast.que.state != false && web.fast.que.list.length > 0) {
112
+ // State check
113
+ web.fast.que.run();
114
+ }
115
+ },10);
116
+
117
+ // Scan for all webfast ellements
118
+ jQuery(`[webfast]`).each(function() {
119
+ let elementType = jQuery(this).prop('nodeName');
120
+ console.log('Element type:', elementType);
121
+
122
+ // Get now the data
123
+ let webAction = jQuery(this).attr(`webfast`);
124
+ let action = jQuery(this).attr(`webfast-${webAction}`);
125
+ console.log(`Data Actions webAction, action`,webAction,action);
126
+
127
+ // Create action runner
128
+ // Check if id
129
+ if (jQuery(this).attr(`id`) == undefined) {
130
+ const array = new Uint32Array(1);
131
+ window.crypto.getRandomValues(array);
132
+ const randomValue = array[0];
133
+
134
+ console.log(`Set UUID: ${randomValue}`);
135
+ jQuery(this).attr(`id`,randomValue);
136
+ }
137
+
138
+ switch (elementType) {
139
+ case "FORM":
140
+ jQuery(this).submit(function(e) {
141
+ e.preventDefault(); // Prevent the default form submission
142
+
143
+ // Check what to do like socketpath
144
+ web.fast.action(action,this,e);
145
+ return false;
146
+ });
147
+ break;
148
+ case "DIV":
149
+ // We will do the div element part
150
+ // check whyt type etc
151
+ // Make request to server with websocket thingy
152
+ // Set in QUE
153
+ let other;
154
+ if (action == `list`) {
155
+ other = {
156
+ type : action,
157
+ html : jQuery(this).html()
158
+ }
159
+ }
160
+ web.fast.sendMessage(`socket.api.${webAction}`,{
161
+ ts : Date.now(),
162
+ ell : jQuery(this).attr(`id`),
163
+ other : other
164
+ })
165
+ break;
166
+ case "BUTTON":
167
+ // Check button interaction
168
+ console.error(`SETUP BUTTON INTERACTION`);
169
+ break;
170
+ default:
171
+ console.error(`No Action for : ${elementType}`);
172
+ }
173
+ });
174
+ });
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title><%= title %></title>
7
- <script src="<%= url %>/app/content/js/jquery-3.7.1.min.js"></script>
7
+ <script src="<%= url %>app/content/js/jquery-3.7.1.min.js"></script>
8
8
  <script src="https://telegram.org/js/telegram-web-app.js"></script>
9
9
  <script src="https://unpkg.com/@tonconnect/ui@latest/dist/tonconnect-ui.min.js"></script>
10
- <script src="<%= url %>/app/content/js/webfast.js"></script>
10
+ <script src="<%= url %>app/content/js/webfast.js"></script>
11
11
  </head>
12
12
  <body>
13
13
 
package/ejs/view/list.ejs CHANGED
@@ -3,7 +3,12 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title><%= title %></title>
6
+ <title><%= title %></title><!-- Include Socket.IO from CDN -->
7
+ <script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
8
+ <script src="<%= url %>app/content/js/jquery-3.7.1.min.js"></script>
9
+ <script src="https://telegram.org/js/telegram-web-app.js"></script>
10
+ <script src="https://unpkg.com/@tonconnect/ui@latest/dist/tonconnect-ui.min.js"></script>
11
+ <script src="<%= url %>app/content/js/webfast.js"></script>
7
12
  </head>
8
13
  <body>
9
14
 
package/example.js CHANGED
@@ -1,5 +1,8 @@
1
1
  const path = require(`path`);
2
2
  let program = require(path.join(__dirname,`index.js`))({
3
- wget : '/usr/local/bin/wget'
3
+ wget : '/usr/local/bin/wget',
4
+ process : {
5
+ ts : Date.now()
6
+ }
4
7
  });
5
8
  console.log(`Required`);
@@ -5,6 +5,10 @@ module.exports = async function(req,res,body,params,command,middleValue) {
5
5
  if (middleValue.location != undefined) {
6
6
  locSendMessage = `Thank you for sending your location\n ${middleValue.location.longitude}\n${middleValue.location.latitude}`;
7
7
  }
8
+
9
+ const scripting = await program.modules.telegram.script.function.check(program,command,middleValue.chat.id,middleValue,body);
10
+ console.log(scripting);
11
+
8
12
  return {
9
13
  message : locSendMessage,
10
14
  response : {
@@ -0,0 +1,63 @@
1
+ module.exports = async function(program,req,res,body,params,command,middleValue) {
2
+ console.log(`Location Telegram Function`);
3
+ // We have the start function
4
+ let locSendMessage = false;
5
+
6
+ // Now get the photos and save them in db files
7
+ // loop through photos
8
+ const user = middleValue.from.id;
9
+ const uuid = program.uuid.v4();
10
+ for (let photoI in middleValue.photo) {
11
+ let photo = middleValue.photo[photoI];
12
+ // photo url user
13
+ const userPhotoURL = await program.modules.telegram.functions.get.file(program,photo.file_id);
14
+ console.log(userPhotoURL);
15
+ // create url
16
+ const photoURL = `https://api.telegram.org/file/bot${process.env.telegram}/${userPhotoURL.result.file_path}`;;
17
+
18
+ //res.status(200);
19
+ // Now do the fetch process thingy
20
+ await program.modules.telegram.functions.get.downloadAndConvertToBase64(program,photoURL,async function(program,response){
21
+ console.log(`We have now file data`);
22
+ // Create id for file that is unique uuid
23
+ const meta = {
24
+ user : response.data.user,
25
+ type : response.imageData.type,
26
+ size : {
27
+ width : response.imageData.width,
28
+ height : response.imageData.height
29
+ }
30
+ }
31
+ await program.modules.data.file.uploadBuffer(program,response.buffer,uuid,meta,async function(progam,upload,meta){
32
+ console.log(`Uploaded Buffer`);
33
+ // Save to membe
34
+ // Now we have received so we can add marker to the receive message
35
+ });
36
+
37
+ },{
38
+ user : user,
39
+ data : middleValue
40
+ });
41
+
42
+ }
43
+
44
+ res.status(200);
45
+
46
+ locSendMessage = `Image succesfull received`;
47
+
48
+ const scripting = await program.modules.telegram.script.function.check(program,command,middleValue.chat.id,middleValue,body);
49
+ console.log(scripting);
50
+
51
+ // Send back
52
+ if (scripting == true) {
53
+ return true;
54
+ } else {
55
+ return {
56
+ message : locSendMessage,
57
+ response : {
58
+ message : locSendMessage,
59
+ uuid : uuid
60
+ }
61
+ }
62
+ }
63
+ }
@@ -76,7 +76,27 @@ module.exports = {
76
76
  }
77
77
  }
78
78
  } else {
79
- console.error(`Need to set anwser data`);
79
+ // Check if something with type:
80
+ for (let li in question.match.data) {
81
+ let matchCheck = question.match.data[li];
82
+ if (typeof matchCheck.anwser == `object`) {
83
+ // Grab type if it's there
84
+ switch (matchCheck.anwser.type) {
85
+ case command:
86
+ console.log(`It's the dynamic thing`);
87
+ matched = matchCheck;
88
+ let variable = data.message[command]
89
+ anwserData = {
90
+ type : command,
91
+ data : variable
92
+ };
93
+ break;
94
+ default:
95
+ console.log(`No matching type found`);
96
+ }
97
+ }
98
+ }
99
+
80
100
  }
81
101
 
82
102
  // End of match process fo matched checking
@@ -132,6 +152,7 @@ module.exports = {
132
152
  // Create replacelist
133
153
  let replace = {
134
154
  "{{URL}}" : process.env.url,
155
+ "{{WEBURL}}" : process.env.webURL,
135
156
  "{{TEST}}" : "TEST REPLACED"
136
157
  }
137
158
 
@@ -34,6 +34,7 @@ module.exports = {
34
34
  } catch(err) {
35
35
  console.error(err);
36
36
  console.error(`Error Scripting`);
37
+ return false;
37
38
  }
38
39
  },
39
40
  response : async function() {
@@ -15,7 +15,9 @@
15
15
  "function" : "program.modules.bots.scripts.function.response",
16
16
  "next" : "nextFunc"
17
17
  },{
18
- "anwser" : "hi",
18
+ "anwser" : {
19
+ "type" : "photo"
20
+ },
19
21
  "function" : "program.modules.bots.scripts.function.response",
20
22
  "next" : "nextFunc"
21
23
  }]
@@ -31,7 +33,7 @@
31
33
  "text" : "Testing Title : {{START}}",
32
34
  "buttons" : [
33
35
  [
34
- { "text": "EventGO!", "web_app" : { "url" : "{{URL}}events/list"}},
36
+ { "text": "EventGO!", "web_app" : { "url" : "{{WEBURL}}concepts/eventgo/events-list"}},
35
37
  { "text": "Create Event", "callback_data": "create_event" }
36
38
  ]
37
39
  ]
@@ -1,6 +1,6 @@
1
1
  const { MongoClient } = require('mongodb');
2
2
  const uri = process.env.mongo;
3
- const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
3
+ const client = new MongoClient(uri);
4
4
 
5
5
  module.exports = {
6
6
  profilePhoto : async function(program,content,meta) {
@@ -207,7 +207,7 @@ module.exports = async function(program,folder) {
207
207
  } catch (message) {
208
208
  // Process as other
209
209
  console.log(`Process Different`);
210
- let checkArray = [`location`];
210
+ let checkArray = [`location`,`photo`];
211
211
  // Loop through checkArray
212
212
  for (let c in checkArray) {
213
213
  const command = checkArray[c];
@@ -215,7 +215,7 @@ module.exports = async function(program,folder) {
215
215
  if (indexCheck != -1) {
216
216
  console.log(`Run this as middleware`);
217
217
  try {
218
- const runFunc = await program.modules.telegram.middleware[key][command](req,res,body,params,command,middleValue);
218
+ const runFunc = await program.modules.telegram.middleware[key][command](program,req,res,body,params,command,middleValue);
219
219
  const respFunc = runFunc;
220
220
  // PRocess response for object
221
221
  if (respFunc == undefined) {
@@ -3,7 +3,7 @@ const fs = require('fs');
3
3
 
4
4
  // Define the MongoDB URI
5
5
  const uri = process.env.mongo;
6
- const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
6
+ const client = new MongoClient(uri);
7
7
 
8
8
  module.exports = {
9
9
  uploadBuffer: async function (progam,buffer, filename, metadata = {}, callback) {
@@ -18,7 +18,7 @@ module.exports = function(db,collection) {
18
18
 
19
19
  async function main() {
20
20
  // Create a new MongoClient
21
- const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
21
+ const client = new MongoClient(uri);
22
22
 
23
23
  try {
24
24
  // Connect to the MongoDB server
@@ -1,178 +1,316 @@
1
1
  module.exports = async function (program) {
2
- console.log(`Starting UP Express`);
3
- program.express = {
2
+ console.log(`Starting UP Express`);
3
+ program.express = {
4
4
  ts: Date.now(),
5
- };
6
-
7
- const express = require('express');
8
- const cors = require('cors');
9
- const bodyParser = require('body-parser');
10
- const port = 1221;
11
- const basePath = `/api`;
12
-
13
- const app = express();
14
-
15
- const corsOptions = {
5
+ process : program.set.process
6
+ };
7
+
8
+ const express = require('express');
9
+ const cors = require('cors');
10
+ const bodyParser = require('body-parser');
11
+ const WebSocket = require('ws');
12
+ const crypto = require(`crypto`)
13
+ const port = 1221;
14
+ const basePath = `/api`;
15
+
16
+ const app = express();
17
+
18
+ const corsOptions = {
16
19
  origin: '*',
17
20
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
18
21
  credentials: true,
19
22
  optionsSuccessStatus: 204,
20
- };
21
-
22
- app.use(cors(corsOptions));
23
- app.use(bodyParser.json());
24
- app.use(bodyParser.urlencoded({ extended: true }));
25
- app.set('view engine', 'ejs');
26
-
27
- let routesPath = program.path.join(__dirname, `routes`);
28
- // Check if custom routes path
29
- if (program.set.path != undefined) {
30
- routesPath = program.path.join(program.set.path,`routes`);
31
- }
23
+ };
32
24
 
33
- let exprs = {};
34
-
35
- try {
25
+ app.use(cors(corsOptions));
26
+ app.use(bodyParser.json());
27
+ app.use(bodyParser.urlencoded({ extended: true }));
28
+ app.set('view engine', 'ejs');
29
+
30
+ let routesPath = program.path.join(__dirname, `routes`);
31
+ // Check if custom routes path
32
+ if (program.set.path != undefined) {
33
+ routesPath = program.path.join(program.set.path, `routes`);
34
+ }
35
+
36
+ let exprs = {};
37
+
38
+ try {
36
39
  let routesData = await program.modules.walkDirectory(routesPath);
37
-
40
+
38
41
  for (let routeData of routesData) {
39
- let routePath = `${basePath}/${routeData.name}`;
40
-
41
- const split = routeData.name.split('.');
42
- routeData.type = split.length > 1 ? split[split.length - 1] : 'get';
43
- routeData.name = split.length > 1 ? split[0] : routeData.name;
44
-
45
- const routeID = program.uuid.v4();
46
- routeData.tempID = routeID;
47
-
48
- try {
49
- const stats = await program.fs.statSync(routeData.path);
50
- const isDirectory = stats.isDirectory();
51
-
52
- if (isDirectory) {
53
- for (let subData of routeData.sub) {
54
- if (subData !== undefined) {
55
- const routeName = subData.name.replace('.get', '').replace('.post', '');
56
- const subDataSplit = subData.path.split('.');
57
- const type = subDataSplit[subDataSplit.length - 2];
58
-
59
- subData.name = routeName;
60
- delete subData.sub;
61
- subData.type = type;
62
-
63
- subData.func = require(subData.path);
64
- exprs[routePath + '/' + routeName] = subData;
42
+ let routePath = `${basePath}/${routeData.name}`;
43
+
44
+ const split = routeData.name.split('.');
45
+ routeData.type = split.length > 1 ? split[split.length - 1] : 'get';
46
+ routeData.name = split.length > 1 ? split[0] : routeData.name;
47
+
48
+ const routeID = program.uuid.v4();
49
+ routeData.tempID = routeID;
50
+
51
+ try {
52
+ const stats = await program.fs.statSync(routeData.path);
53
+ const isDirectory = stats.isDirectory();
54
+
55
+ if (isDirectory) {
56
+ for (let subData of routeData.sub) {
57
+ if (subData !== undefined) {
58
+ const routeName = subData.name.replace('.get', '').replace('.post', '');
59
+ const subDataSplit = subData.path.split('.');
60
+ const type = subDataSplit[subDataSplit.length - 2];
61
+
62
+ subData.name = routeName;
63
+ delete subData.sub;
64
+ subData.type = type;
65
+
66
+ subData.func = require(subData.path);
67
+ exprs[routePath + '/' + routeName] = subData;
68
+ }
69
+ }
70
+ } else {
71
+ routeData.func = require(routeData.path);
72
+ exprs[routePath] = routeData;
65
73
  }
66
- }
67
- } else {
68
- routeData.func = require(routeData.path);
69
- exprs[routePath] = routeData;
74
+ } catch (err) {
75
+ console.error(`Error Route Func`, routePath);
76
+ console.error(err);
70
77
  }
71
- } catch (err) {
72
- console.error(`Error Route Func`, routePath);
73
- console.error(err);
74
- }
75
-
76
- routeData.webwalk = 0;
78
+
79
+ routeData.webwalk = 0;
77
80
  }
78
-
81
+
79
82
  program.express.routes = exprs;
80
-
83
+
81
84
  for (let route in exprs) {
82
- let routeData = exprs[route];
83
- let state = false;
84
-
85
- try {
86
- app[routeData.type](route, async (req, res) => {
87
- try {
88
- exprs[route].webwalk++;
85
+ let routeData = exprs[route];
86
+ let state = false;
87
+
88
+ try {
89
+ app[routeData.type](route, async (req, res) => {
90
+ try {
91
+ exprs[route].webwalk++;
89
92
 
90
- // Get body
91
- const requestBody = req.body;
92
- const reqParams = req.params;
93
+ // Get body
94
+ const requestBody = req.body;
95
+ const reqParams = req.params;
93
96
 
94
- await routeData.func(program, req, res, route,requestBody,reqParams);
95
- } catch (err) {
96
- console.error(`Error With Route:`, route);
97
+ await routeData.func(program, req, res, route, requestBody, reqParams);
98
+ } catch (err) {
99
+ console.error(`Error With Route:`, route);
100
+ console.error(err);
101
+ }
102
+ });
103
+ state = true;
104
+ } catch (err) {
97
105
  console.error(err);
98
- }
99
- });
100
- state = true;
101
- } catch (err) {
102
- console.error(err);
103
- console.error(`Error Setting Up Route`);
104
- }
105
-
106
- exprs[route].state = state;
106
+ console.error(`Error Setting Up Route`);
107
+ }
108
+
109
+ exprs[route].state = state;
107
110
  }
108
-
111
+
109
112
  console.log(`Routes are set up successfully`);
110
- } catch (err) {
113
+ } catch (err) {
111
114
  console.error(err);
112
115
  console.error(`Error Setting Up Routes`);
113
- }
114
-
115
- program.express.app = app;
116
+ }
117
+
118
+ program.express.app = app;
116
119
 
117
- // Let app listen for content
118
- app.get(`/app/content/ton/manifest.json`,async (req,res) => {
120
+ // Let app listen for content
121
+ app.get(`/app/content/ton/manifest.json`, async (req, res) => {
119
122
  // Let's create a json
120
123
  const manifest = {
121
- url: process.env.url,
122
- name: process.env.name,
123
- iconUrl: process.env.image
124
+ url: process.env.url,
125
+ name: process.env.name,
126
+ iconUrl: process.env.image
124
127
  };
125
-
128
+
126
129
  res.setHeader('Content-Type', 'application/json');
127
130
  res.json(manifest);
128
- });
131
+ });
129
132
 
130
- app.get(`/app/content/:type/:file`,async (req,res) => {
131
- console.log(`Content Get`);
132
- // Try To get file from content folder
133
- try {
134
- const filePath = program.path.join(__dirname,`..`,`..`,`app`,`content`,req.params.type,req.params.file);
135
- let contentFolder = filePath;
136
-
137
- // Check if minify at the end
138
- const fileName = req.params.file;
139
- const isMinified = /-min\.js$/.test(fileName);
140
-
141
- if (isMinified) {
142
- console.log(`${fileName} ends with -min.js`);
143
- const toRequestFile = req.params.file.replace(`-min.js`,`.js`);
144
- contentFolder = program.path.join(__dirname,`..`,`..`,`app`,`content`,req.params.type,toRequestFile);
145
- } else {
146
- console.log(`${fileName} does not end with -min.js`);
147
- }
133
+ app.get(`/app/content/:type/:file`, async (req, res) => {
134
+ console.log(`Content Get`);
135
+ // Try To get file from content folder
136
+ try {
137
+ const filePath = program.path.join(__dirname, `..`, `..`, `app`, `content`, req.params.type, req.params.file);
138
+ let contentFolder = filePath;
148
139
 
149
- res.sendFile(contentFolder);
150
- } catch (err) {
151
- console.error(err);
152
- console.error(`Error Getting : ${req.params.type}`,req.params.file);
153
- }
154
- })
140
+ // Check if minify at the end
141
+ const fileName = req.params.file;
142
+ const isMinified = /-min\.js$/.test(fileName);
143
+
144
+ if (isMinified) {
145
+ console.log(`${fileName} ends with -min.js`);
146
+ const toRequestFile = req.params.file.replace(`-min.js`, `.js`);
147
+ contentFolder = program.path.join(__dirname, `..`, `..`, `app`, `content`, req.params.type, toRequestFile);
148
+ } else {
149
+ console.log(`${fileName} does not end with -min.js`);
150
+ }
151
+
152
+ res.sendFile(contentFolder);
153
+ } catch (err) {
154
+ console.error(err);
155
+ console.error(`Error Getting : ${req.params.type}`, req.params.file);
156
+ }
157
+ })
155
158
 
156
- app.listen(port, () => {
159
+ app.listen(port, () => {
157
160
  console.log(`Server Listening`, port, basePath);
158
- });
159
-
160
- program.express.url = {
161
+ });
162
+
163
+ program.express.url = {
161
164
  adaptive: {
162
- get: [],
163
- post: [],
165
+ get: [],
166
+ post: [],
164
167
  },
165
168
  set: function (requestPath, actionType, callback) {
166
- program.express.url.adaptive[actionType] = app[actionType](requestPath, async (req, res) => {
167
- let run = await callback(req, res, req.body, req.params);
168
- return run;
169
- });
170
- return true;
169
+ program.express.url.adaptive[actionType] = app[actionType](requestPath, async (req, res) => {
170
+ let run = await callback(req, res, req.body, req.params);
171
+ return run;
172
+ });
173
+ return true;
171
174
  },
172
- };
173
-
174
- program.express.setted = true;
175
-
176
- return program;
177
175
  };
178
-
176
+
177
+ program.express.setted = true;
178
+
179
+ let clients = new Map();
180
+ // Start socket thingy
181
+ const PORT = process.env.socket || 3000;
182
+ const wss = new WebSocket.Server({ port: PORT });
183
+
184
+
185
+ wss.on('connection', (ws, req) => {
186
+ console.log(`Socket Connected`);
187
+
188
+ // Generate a unique ID for the WebSocket connection
189
+ const clientId = program.uuid.v4();
190
+ const reqURL = req.url;
191
+ console.log(`We have some data`, reqURL);
192
+ const queryStringWithoutQBT = reqURL.replace('/socket.io/?qbt=', '');
193
+ const queryParamsArray = queryStringWithoutQBT.split('&');
194
+
195
+ const parsedQuery = queryParamsArray.reduce((acc, param) => {
196
+ const [key, value] = param.split('=');
197
+ acc[key] = decodeURIComponent(value);
198
+ return acc;
199
+ }, {});
200
+
201
+ // Extract data from the parsed query
202
+ const { auth_date, query_id, user, hash } = parsedQuery;
203
+
204
+ // Stringify the 'user' field if it contains JSON data
205
+ if (user != undefined) {
206
+ try {
207
+ parsedQuery.user = JSON.stringify(parsedQuery.user);
208
+ } catch (error) {
209
+ console.error('Error parsing JSON in user field:', error);
210
+ }
211
+ }
212
+
213
+ // Construct the data check string
214
+ const sortedKeys = Object.keys(parsedQuery).sort();
215
+ const data_check_string = sortedKeys.map(key => `${key}=${String(parsedQuery[key])}`).join('\n');
216
+
217
+ function HMAC_SHA256(data, key) {
218
+ const hmac = crypto.createHmac('sha256', key);
219
+ hmac.update(data);
220
+ return hmac.digest('hex');
221
+ }
222
+
223
+ const bot_token = process.env.telegram; // replace with your actual bot token
224
+ const secret_key = HMAC_SHA256(bot_token, 'WebAppData');
225
+ const calculated_hash = HMAC_SHA256(data_check_string, secret_key);
226
+
227
+ const received_hash = hash; // replace with the actual received hash
228
+
229
+ if (calculated_hash === received_hash) {
230
+ // Data is from Telegram and has not been tampered with
231
+ // Additional check for auth_date if needed
232
+ const currentUnixTimestamp = Math.floor(new Date().getTime() / 1000);
233
+ if (parseInt(auth_date, 10) <= currentUnixTimestamp) {
234
+ // Data is not outdated
235
+ // Use the validated data as needed
236
+ console.log('Data from Telegram is valid');
237
+ } else {
238
+ console.error('Received data is outdated');
239
+ }
240
+ } else {
241
+ console.error('Received data has been tampered with');
242
+ }
243
+
244
+ console.log(parsedQuery);
245
+
246
+ // Store the WebSocket connection with its ID in the map
247
+ clients.set(clientId, ws);
248
+
249
+ // Send the client ID to the connected client
250
+ ws.send(JSON.stringify({ type: 'clientId', id: clientId, params: parsedQuery }));
251
+
252
+ // Set up a ping interval to keep the connection alive
253
+ const pingInterval = setInterval(() => {
254
+ if (ws.readyState === WebSocket.OPEN) {
255
+ ws.ping();
256
+ } else {
257
+ // If the connection is closed, remove it from the map
258
+ clearInterval(pingInterval);
259
+ clients.delete(clientId);
260
+ console.log(`Removed disconnected socket with ID: ${clientId}`);
261
+ }
262
+ }, 5000); // Adjust the interval as needed
263
+
264
+ ws.on('close', () => {
265
+ console.log(`Socket Disconnected`);
266
+ clearInterval(pingInterval);
267
+ clients.delete(clientId);
268
+ });
269
+
270
+ // WebSocket on message event
271
+ ws.on('message', async (message) => {
272
+ console.log(`Received message from ${clientId}: ${message}`);
273
+
274
+ try {
275
+ // Check for function
276
+ const json = JSON.parse(message.toString(`utf-8`));
277
+ const data = json.message;
278
+ const path = json.path;
279
+ const split = path.split(".")
280
+
281
+ // Check if function is running in program modules that you can add in the init scirpt when using remote
282
+ if (program.express.process != undefined) {
283
+ try {
284
+ let resp = await program.express.process[split[0]][split[1]][split[2]](program,ws,json,data,path);
285
+ if (resp != false) {
286
+ ws.send(JSON.stringify(resp));
287
+ }
288
+ } catch (err) {
289
+ console.error(`Error Running program.express.process for `,split[0],split[1],split[2]);
290
+ ws.send(JSON.stringify({
291
+ ts : Date.now(),
292
+ error : true,
293
+ message : `Error Event Program receive`
294
+ }));
295
+ }
296
+ }
297
+
298
+ // Add your custom on message logic here
299
+ // For example, you can broadcast the message to all connected clients
300
+ clients.forEach((client, id) => {
301
+ if (client.readyState === WebSocket.OPEN && id !== clientId) {
302
+ //ws.send(`Broadcast from ${clientId}: ${message}`);
303
+ }
304
+ });
305
+
306
+ // Check if
307
+ } catch(err) {
308
+ console.error(`Error Something`);
309
+
310
+ }
311
+ });
312
+ });
313
+
314
+
315
+ return program;
316
+ };
@@ -1,12 +1,13 @@
1
1
  module.exports = async function(program,req,res,route) {
2
2
  console.log(`Create`);
3
- const fullPath = program.path.join(__dirname, `..`,`..`,`..`,`..`,`ejs`,`example`,`list.ejs`);
3
+ const fullPath = program.path.join(__dirname, `..`,`..`,`..`,`..`,`ejs`,`view`,`list.ejs`);
4
4
 
5
5
  // Render the EJS template
6
6
  res.render(fullPath, {
7
7
  title: 'EJS Example',
8
8
  name: 'John Doe',
9
9
  isAdmin: true,
10
- fruits: ['Apple', 'Banana', 'Orange']
10
+ fruits: ['Apple', 'Banana', 'Orange'],
11
+ url : process.env.url
11
12
  });
12
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webfast",
3
- "version": "0.1.32",
3
+ "version": "0.1.37",
4
4
  "description": "WebFast! Bot Application, including TON mini-apps for makign it easy and fast to build ini-apps",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -39,6 +39,7 @@
39
39
  "dependencies": {
40
40
  "body-parser": "^1.20.2",
41
41
  "cors": "^2.8.5",
42
+ "crypto": "^1.0.1",
42
43
  "dotenv": "^16.0.3",
43
44
  "ejs": "^3.1.9",
44
45
  "express": "^4.18.2",
@@ -49,6 +50,7 @@
49
50
  "mongodb": "^6.3.0",
50
51
  "node-fetch": "^3.3.2",
51
52
  "path": "^0.12.7",
52
- "uuid": "^9.0.1"
53
+ "uuid": "^9.0.1",
54
+ "ws": "^8.16.0"
53
55
  }
54
56
  }