@alizadefaig/pos-server 1.1.5 → 1.2.1
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/app/config.js +18 -0
- package/app/logger/Local.js +24 -0
- package/app/logger/Log.js +25 -0
- package/app/logger/Server.js +18 -0
- package/app/proxy.js +100 -0
- package/app/socket/client.js +5 -3
- package/app/socket/server.js +71 -6
- package/lib/axios.js +39 -2
- package/package.json +7 -4
- package/routes/common/socket.js +54 -0
- package/routes/desktop/api/printers.js +36 -20
- package/server.js +51 -80
- package/tests/usbPrinterTest.js +20 -0
- package/utils.js +14 -2
- package/config.json +0 -6
- package/routes/server/socket.js +0 -19
package/app/config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
let config = {
|
|
2
|
+
"isServer": true,
|
|
3
|
+
"apiUrl": "https://admin.cafepos.az",
|
|
4
|
+
"debug": false,
|
|
5
|
+
"port": 3005
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const getConfig = () => {
|
|
9
|
+
return config;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const setConfig = (conf) => {
|
|
13
|
+
config = conf || {};
|
|
14
|
+
}
|
|
15
|
+
module.exports = {
|
|
16
|
+
getConfig,
|
|
17
|
+
setConfig
|
|
18
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const {getConfig} = require("../config");
|
|
2
|
+
|
|
3
|
+
class Local {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.path = getConfig().path;
|
|
6
|
+
}
|
|
7
|
+
log(data) {
|
|
8
|
+
console.log(data);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
error(data) {
|
|
12
|
+
console.error(data);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
info(data) {
|
|
16
|
+
console.info(data);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
warning(data) {
|
|
20
|
+
console.warn(data);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = Local;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const Server = require("./Server");
|
|
2
|
+
const Local = require("./Local");
|
|
3
|
+
const {getConfig} = require("../config");
|
|
4
|
+
|
|
5
|
+
class Log {
|
|
6
|
+
loggers = {
|
|
7
|
+
'server': Server,
|
|
8
|
+
'local': Local,
|
|
9
|
+
}
|
|
10
|
+
static logger = null;
|
|
11
|
+
static getLogger() {
|
|
12
|
+
if (!Log.logger) {
|
|
13
|
+
Log.logger = new Log(getConfig().isServer ? "server" : 'local')
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return Log.logger;
|
|
17
|
+
}
|
|
18
|
+
constructor(logger) {
|
|
19
|
+
if (!Log.logger) {
|
|
20
|
+
Log.logger = new this.loggers[logger];
|
|
21
|
+
}
|
|
22
|
+
return Log.logger
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
module.exports = Log;
|
package/app/proxy.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const axios = require("../lib/axios");
|
|
2
|
+
const {getConfig} = require("./config");
|
|
3
|
+
const {getLogger} = require("./logger/Log");
|
|
4
|
+
const {createProxyMiddleware, fixRequestBody} = require("http-proxy-middleware");
|
|
5
|
+
const moment = require("moment");
|
|
6
|
+
const { v4: uuidv4 } = require('uuid');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
function isLocalRoute(req, app) {
|
|
11
|
+
const path = req.path;
|
|
12
|
+
const method = req.method.toLowerCase();
|
|
13
|
+
console.log(app._router);
|
|
14
|
+
// Проверяем стек роутов Express
|
|
15
|
+
return app._router.stack.some((layer) => {
|
|
16
|
+
if (!layer.route) return false; // Это не роут
|
|
17
|
+
if (!layer.route.methods[method]) return false; // Метод не совпадает (GET, POST и т.д.)
|
|
18
|
+
return layer.route.path === path; // Путь совпадает
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// const
|
|
23
|
+
const loadProxy = (app) => {
|
|
24
|
+
let appConfig = getConfig();
|
|
25
|
+
let PROXY_TARGET = appConfig.apiUrl;
|
|
26
|
+
const logger = getLogger();
|
|
27
|
+
const proxy = createProxyMiddleware({
|
|
28
|
+
target: PROXY_TARGET,
|
|
29
|
+
changeOrigin: false,
|
|
30
|
+
on: {
|
|
31
|
+
proxyReq: (proxyReq, req, res, options) => {
|
|
32
|
+
const traceId = uuidv4();
|
|
33
|
+
const timeStamp = moment.utc().unix();
|
|
34
|
+
proxyReq.setHeader('trace-id', traceId);
|
|
35
|
+
req.traceId = traceId;
|
|
36
|
+
logger.log({
|
|
37
|
+
traceId,
|
|
38
|
+
timeStamp,
|
|
39
|
+
request: {
|
|
40
|
+
headers: req.headers,
|
|
41
|
+
method: req.method,
|
|
42
|
+
url: req.url,
|
|
43
|
+
body: req.data,
|
|
44
|
+
params: req.params,
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
return fixRequestBody(proxyReq, req);
|
|
48
|
+
},
|
|
49
|
+
proxyRes: (proxyRes, req, res, options) => {
|
|
50
|
+
const traceId = req.traceId;
|
|
51
|
+
const timeStamp = moment.utc().unix();
|
|
52
|
+
// proxyRes.setHeader('Content-Type', 'application/json');
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
let body = Buffer.from('');
|
|
56
|
+
|
|
57
|
+
proxyRes.on('data', (chunk) => {
|
|
58
|
+
body = Buffer.concat([body, chunk]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
proxyRes.on('end', () => {
|
|
62
|
+
const responseBody = body.toString('utf8');
|
|
63
|
+
|
|
64
|
+
let response = responseBody;
|
|
65
|
+
try {
|
|
66
|
+
response = JSON.parse(responseBody);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
response = responseBody;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
logger.log({
|
|
72
|
+
traceId,
|
|
73
|
+
timeStamp,
|
|
74
|
+
response
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
error: (err, req, res, target) => {
|
|
79
|
+
const traceId = req.traceId;
|
|
80
|
+
const timeStamp = moment.utc().unix();
|
|
81
|
+
logger.error({
|
|
82
|
+
traceId,
|
|
83
|
+
timeStamp,
|
|
84
|
+
error: err
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
res.end(JSON.stringify({
|
|
88
|
+
error: 'Bad Gateway',
|
|
89
|
+
message: err.message,
|
|
90
|
+
traceId: req.traceId || null,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
selfHandleResponse: false
|
|
95
|
+
});
|
|
96
|
+
app.use(proxy);
|
|
97
|
+
}
|
|
98
|
+
module.exports = {
|
|
99
|
+
loadProxy
|
|
100
|
+
}
|
package/app/socket/client.js
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
const {io} = require("socket.io-client");
|
|
2
2
|
const serverSocket = require('../socket/server')();
|
|
3
3
|
let clientSocket = null;
|
|
4
|
-
module.exports = (target, companyId) => {
|
|
4
|
+
module.exports = (target, companyId, terminalId) => {
|
|
5
5
|
if (!clientSocket && companyId) {
|
|
6
6
|
clientSocket = io(target, {
|
|
7
7
|
query: {
|
|
8
|
-
company_id: companyId
|
|
8
|
+
company_id: companyId,
|
|
9
|
+
terminal_id: terminalId,
|
|
10
|
+
is_proxy_server: true,
|
|
9
11
|
}
|
|
10
12
|
});
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
if (clientSocket) {
|
|
14
|
-
clientSocket.onAny((
|
|
16
|
+
clientSocket.onAny((eventName, ...args) => {
|
|
15
17
|
serverSocket.to(companyId).emit(eventName, ...args);
|
|
16
18
|
})
|
|
17
19
|
}
|
package/app/socket/server.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
const {Server} = require("socket.io");
|
|
2
|
+
const axios = require("axios");
|
|
3
|
+
const {getConfig} = require("../config");
|
|
4
|
+
const {getLogger} = require("../logger/Log");
|
|
5
|
+
const {socketSendByFilter} = require("../../utils");
|
|
2
6
|
let serverSocket = null;
|
|
3
7
|
module.exports = (server = null) => {
|
|
4
8
|
if (server && !serverSocket) {
|
|
@@ -6,15 +10,76 @@ module.exports = (server = null) => {
|
|
|
6
10
|
cors: {
|
|
7
11
|
origin: '*'
|
|
8
12
|
}
|
|
9
|
-
})
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const logger = getLogger();
|
|
16
|
+
|
|
10
17
|
|
|
11
18
|
serverSocket.on('connection', (socket) => {
|
|
12
|
-
socket.join(socket.handshake.query.company_id);
|
|
13
19
|
const companyId = socket.handshake.query.company_id;
|
|
14
|
-
const terminalId = socket.handshake.query.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
const terminalId = socket.handshake.query.terminal_id;
|
|
21
|
+
let userId = socket.handshake.query.user_id;
|
|
22
|
+
// const isProxy = socket.handshake.query.is_proxy_server ?? false;
|
|
23
|
+
const isProxy = false;
|
|
24
|
+
const PROXY_TARGET = getConfig().apiUrl;
|
|
25
|
+
|
|
26
|
+
socket.join(companyId);
|
|
27
|
+
socket.terminalId = terminalId;
|
|
28
|
+
socket.companyId = companyId;
|
|
29
|
+
socket.userId = userId;
|
|
30
|
+
socket.isProxy = isProxy;
|
|
31
|
+
|
|
32
|
+
if (!isProxy) {
|
|
33
|
+
|
|
34
|
+
axios.post(`${PROXY_TARGET}/api/socket/connection`, {
|
|
35
|
+
companyId,
|
|
36
|
+
terminalId,
|
|
37
|
+
userId,
|
|
38
|
+
}).catch(error => {
|
|
39
|
+
logger.error(error);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
socket.on('setUserId', (id) => {
|
|
43
|
+
userId = id;
|
|
44
|
+
|
|
45
|
+
axios.post(`${PROXY_TARGET}/api/socket/setUserId`, {
|
|
46
|
+
companyId,
|
|
47
|
+
terminalId,
|
|
48
|
+
userId,
|
|
49
|
+
}).catch((err) => {
|
|
50
|
+
logger.error(err);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if (id) {
|
|
55
|
+
socket.userId = id;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
socket.on('disconnect', () => {
|
|
61
|
+
axios.post(`${PROXY_TARGET}/api/socket/disconnect`, {
|
|
62
|
+
companyId,
|
|
63
|
+
terminalId,
|
|
64
|
+
userId,
|
|
65
|
+
}).catch((err) => {
|
|
66
|
+
logger.error(err);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// socket.on('broadcast', (data) => {
|
|
71
|
+
// console.log(companyId, data.eventName, data.data);
|
|
72
|
+
// })
|
|
73
|
+
|
|
74
|
+
socket.onAny((eventName, ...data) => {
|
|
75
|
+
// socketSendByFilter('company', companyId, eventName, {
|
|
76
|
+
// terminal: [terminalId],
|
|
77
|
+
// }, ...args);
|
|
78
|
+
socket.to(companyId).emit(eventName, ...data);
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
console.log('Proxy');
|
|
82
|
+
}
|
|
18
83
|
});
|
|
19
84
|
}
|
|
20
85
|
|
package/lib/axios.js
CHANGED
|
@@ -1,7 +1,44 @@
|
|
|
1
1
|
const axios = require("axios");
|
|
2
|
-
const {
|
|
2
|
+
const {getConfig} = require("../app/config");
|
|
3
|
+
const {streamToString} = require("../utils");
|
|
4
|
+
const {getLogger} = require("../app/logger/Log");
|
|
5
|
+
const {response} = require("express");
|
|
6
|
+
const logger = getLogger();
|
|
3
7
|
const instance = axios.create({
|
|
4
|
-
baseURL:
|
|
8
|
+
baseURL: getConfig().apiUrl
|
|
9
|
+
});
|
|
10
|
+
instance.interceptors.request.use((config) => {
|
|
11
|
+
const traceId = Date.now().toString();
|
|
12
|
+
config.headers['trace-id'] = traceId;
|
|
13
|
+
logger.log({
|
|
14
|
+
traceId,
|
|
15
|
+
request: {
|
|
16
|
+
headers: config.headers,
|
|
17
|
+
method: config.method,
|
|
18
|
+
url: config.url,
|
|
19
|
+
data: config.data,
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
return config;
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
instance.interceptors.response.use((response) => {
|
|
26
|
+
/**
|
|
27
|
+
* @var request:Cli
|
|
28
|
+
*/
|
|
29
|
+
const traceId = response.request.getHeader('trace-id');
|
|
30
|
+
logger.log({
|
|
31
|
+
traceId,
|
|
32
|
+
response: response.data,
|
|
33
|
+
});
|
|
34
|
+
return response;
|
|
35
|
+
}, (error) => {
|
|
36
|
+
const traceId = error.request.getHeader('trace-id');
|
|
37
|
+
logger.error({
|
|
38
|
+
traceId,
|
|
39
|
+
error: error.response.data
|
|
40
|
+
});
|
|
41
|
+
throw error;
|
|
5
42
|
})
|
|
6
43
|
|
|
7
44
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alizadefaig/pos-server",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Server in express js with Proxy to Main server if need and will work with Electron JS",
|
|
5
5
|
"homepage": "https://gitlab.com/faigalizade/pos-server#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -11,17 +11,20 @@
|
|
|
11
11
|
"url": "git+ssh://git@gitlab.com/faigalizade/pos-server.git"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
+
"@alizadefaig/cafetap-escpos-usb": "^1.0.1",
|
|
14
15
|
"axios": "^1.8.4",
|
|
15
16
|
"cors": "^2.8.5",
|
|
17
|
+
"escpos": "^3.0.0-alpha.6",
|
|
18
|
+
"escpos-network": "^3.0.0-alpha.5",
|
|
16
19
|
"express": "^5.1.0",
|
|
17
20
|
"form-data": "^4.0.2",
|
|
21
|
+
"http-proxy-middleware": "^3.0.5",
|
|
22
|
+
"moment": "^2.30.1",
|
|
18
23
|
"multer": "^1.4.5-lts.2",
|
|
19
24
|
"sequelize": "^6.37.7",
|
|
20
25
|
"socket.io": "^4.8.1",
|
|
21
26
|
"socket.io-client": "^4.8.1",
|
|
22
|
-
"
|
|
23
|
-
"escpos": "^3.0.0-alpha.6",
|
|
24
|
-
"escpos-network": "^3.0.0-alpha.5"
|
|
27
|
+
"uuid": "^11.1.0"
|
|
25
28
|
},
|
|
26
29
|
"license": "ISC",
|
|
27
30
|
"author": "faigalizade@newave.az",
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const express = require('express');
|
|
2
|
+
const {socketSendByFilter} = require("../../utils");
|
|
3
|
+
const serverSocket = require("../../app/socket/server")();
|
|
4
|
+
const router = express.Router();
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
router.all('/socket', (req, res) => {
|
|
8
|
+
/**
|
|
9
|
+
* @var to [company|terminal|user]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const companyId = req.body?.company_id || req.query?.company_id;
|
|
13
|
+
const eventName = (req.body?.event || req.query?.event) ?? null;
|
|
14
|
+
const data = (req.body?.data || req.query?.data) ?? null;
|
|
15
|
+
|
|
16
|
+
if (!companyId || !data || !eventName) {
|
|
17
|
+
return res.json({
|
|
18
|
+
success: false,
|
|
19
|
+
message: 'Required fields is not set',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const to = (req.body?.to || req.query?.to) ?? null;
|
|
24
|
+
const excepts = (req.body?.excepts || req.query?.excepts) ?? null;
|
|
25
|
+
const toId = (req.body?.to_id || req.query?.to_id) ?? null;
|
|
26
|
+
|
|
27
|
+
if (to && ['terminal', 'user'].includes(to)) {
|
|
28
|
+
if (!toId) {
|
|
29
|
+
return res.json({
|
|
30
|
+
success: false,
|
|
31
|
+
message: 'To ID is missing',
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return res.json({
|
|
36
|
+
success: false,
|
|
37
|
+
message: 'To is incorrect',
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
socketSendByFilter({
|
|
42
|
+
companyId,
|
|
43
|
+
eventName,
|
|
44
|
+
data,
|
|
45
|
+
to,
|
|
46
|
+
toId,
|
|
47
|
+
excepts
|
|
48
|
+
}, serverSocket);
|
|
49
|
+
res.send({
|
|
50
|
+
success: true,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
module.exports = router;
|
|
@@ -6,7 +6,8 @@ const net = require('net');
|
|
|
6
6
|
escpos.USB = require('@alizadefaig/cafetap-escpos-usb');
|
|
7
7
|
escpos.Network = require('escpos-network');
|
|
8
8
|
const axios = require('axios');
|
|
9
|
-
const
|
|
9
|
+
const {getConfig} = require("../../../app/config");
|
|
10
|
+
const appConfig = getConfig();
|
|
10
11
|
|
|
11
12
|
let PROXY_TARGET = appConfig.apiUrl || 'http://localhost:8000';
|
|
12
13
|
const getUsbPrinters = async () => {
|
|
@@ -107,47 +108,62 @@ router.get('/printers.get', async (req, res) => {
|
|
|
107
108
|
})
|
|
108
109
|
});
|
|
109
110
|
|
|
110
|
-
router.post('/printers.print', (req, res) => {
|
|
111
|
+
router.post('/printers.print', async (req, res) => {
|
|
111
112
|
const device = getPrinterDevice(req.body.printer)
|
|
112
113
|
if (!device) {
|
|
113
|
-
res.send('bad').status(404);
|
|
114
|
+
return res.send('bad').status(404);
|
|
114
115
|
}
|
|
115
|
-
const
|
|
116
|
+
const imageContent = req.body.content.replace(/\r?\n|\r/g, '').replace(/^data:image\/\w+;base64,/, '');
|
|
116
117
|
const printer = new escpos.Printer(device, {});
|
|
117
|
-
const imageBuffer = Buffer.from(
|
|
118
|
+
const imageBuffer = Buffer.from(imageContent, 'base64');
|
|
119
|
+
const image = await new Promise((resolve) => {
|
|
120
|
+
escpos.Image.load(imageBuffer, 'image/png', (i) => {
|
|
121
|
+
resolve(i);
|
|
122
|
+
})
|
|
123
|
+
})
|
|
118
124
|
const timeOut = req.body.timeout || 5000;
|
|
119
125
|
|
|
120
126
|
let sent = false;
|
|
121
127
|
|
|
122
128
|
device.open((err) => {
|
|
123
129
|
if (err) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
if (!sent) {
|
|
131
|
+
sent = true;
|
|
132
|
+
res.json({
|
|
133
|
+
success: false,
|
|
134
|
+
error: 'connection_error',
|
|
135
|
+
message: err
|
|
136
|
+
})
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
130
139
|
return;
|
|
131
140
|
}
|
|
132
141
|
|
|
133
|
-
printer.image
|
|
142
|
+
printer.raster(image);
|
|
134
143
|
if (req.body.bell) {
|
|
135
|
-
printer.beep(2, 3);
|
|
144
|
+
printer.beep(req.body.bell_count || 2, req.body.bell_time || 3);
|
|
136
145
|
}
|
|
137
|
-
if (req.body.
|
|
138
|
-
printer.cashdraw(2);
|
|
146
|
+
if (req.body.cashdraw) {
|
|
147
|
+
printer.cashdraw(req.body.cashdraw_pin || 2);
|
|
139
148
|
}
|
|
140
149
|
|
|
141
|
-
printer
|
|
150
|
+
printer
|
|
151
|
+
.newLine()
|
|
152
|
+
.newLine()
|
|
153
|
+
.cut()
|
|
142
154
|
.close();
|
|
143
155
|
|
|
144
|
-
sent
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
156
|
+
if (!sent) {
|
|
157
|
+
sent = true;
|
|
158
|
+
res.json({
|
|
159
|
+
success: true,
|
|
160
|
+
})
|
|
161
|
+
}
|
|
148
162
|
});
|
|
163
|
+
|
|
149
164
|
setTimeout(() => {
|
|
150
165
|
if (!sent) {
|
|
166
|
+
sent = true;
|
|
151
167
|
res.json({
|
|
152
168
|
success: false,
|
|
153
169
|
error: 'timeout'
|
package/server.js
CHANGED
|
@@ -3,108 +3,79 @@ const app = express();
|
|
|
3
3
|
const http = require('http');
|
|
4
4
|
const cors = require('cors')
|
|
5
5
|
const server = http.createServer(app);
|
|
6
|
-
const multer = require('multer');
|
|
7
6
|
const {join} = require("node:path");
|
|
7
|
+
const {loadRoutes, streamToString, getIpAddress} = require("./utils");
|
|
8
|
+
const {getConfig, setConfig} = require("./app/config");
|
|
9
|
+
const {loadProxy} = require("./app/proxy");
|
|
10
|
+
const multer = require('multer');
|
|
11
|
+
const {getLogger} = require("./app/logger/Log");
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
8
16
|
const upload = multer();
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const FormData = require("form-data");
|
|
13
|
-
app.use(express.json());
|
|
14
|
-
app.use(express.urlencoded({extended: true})); // Для обработки form-urlencoded
|
|
15
|
-
app.use(upload.any()); // Позволяет обрабатывать файлы
|
|
17
|
+
app.use(express.json({limit: '500mb'}));
|
|
18
|
+
app.use(express.urlencoded({extended: true, limit: '500mb'}));
|
|
19
|
+
app.use(upload.any());
|
|
16
20
|
app.use(cors());
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
let isServer = true;
|
|
27
|
+
let serverSocket = null;
|
|
28
|
+
let clientSocket = null;
|
|
29
|
+
|
|
30
|
+
|
|
17
31
|
const runExpress = (conf = null) => {
|
|
18
|
-
|
|
32
|
+
if (conf) {
|
|
33
|
+
setConfig(conf);
|
|
34
|
+
}
|
|
35
|
+
const appConfig = conf || getConfig();
|
|
19
36
|
let PROXY_TARGET = appConfig.apiUrl;
|
|
20
37
|
const port = appConfig.port;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
38
|
+
isServer = appConfig.isServer;
|
|
39
|
+
serverSocket = require('./app/socket/server')(server);
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
// ==== Server Health checker
|
|
44
|
+
app.get('/health', (req, res) => {
|
|
25
45
|
res.send('ok');
|
|
26
46
|
});
|
|
27
47
|
|
|
28
|
-
|
|
48
|
+
// ===== Init Platform
|
|
29
49
|
app.get('/init', (req, res) => {
|
|
30
|
-
if (!
|
|
31
|
-
|
|
50
|
+
if (!clientSocket && !appConfig.isServer) {
|
|
51
|
+
if (req.header('company-id') && req.header('terminal-id')) {
|
|
52
|
+
clientSocket = require('./app/socket/client')(PROXY_TARGET, req.header('company-id'));
|
|
53
|
+
}
|
|
32
54
|
}
|
|
33
55
|
res.send('ok');
|
|
34
56
|
});
|
|
35
57
|
|
|
36
58
|
|
|
59
|
+
// ==== Load Platform Based Routes ====
|
|
37
60
|
loadRoutes(app, join(__dirname, ('routes/' + (appConfig.isServer ? 'server' : 'desktop'))));
|
|
38
|
-
loadRoutes(app, join(__dirname, ('routes/common')));
|
|
39
|
-
app.use(async (req, res, next) => {
|
|
40
|
-
try {
|
|
41
|
-
const targetUrl = PROXY_TARGET + req.originalUrl;
|
|
42
|
-
const config = {
|
|
43
|
-
method: req.method,
|
|
44
|
-
url: targetUrl,
|
|
45
|
-
headers: {...req.headers, host: new URL(PROXY_TARGET).host},
|
|
46
|
-
responseType: 'stream'
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
if (req.body && Object.keys(req.body).length > 0) {
|
|
50
|
-
config.data = req.body;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (req.files && req.files.length > 0) {
|
|
54
|
-
const FormData = require('form-data');
|
|
55
|
-
const form = new FormData();
|
|
56
|
-
req.files.forEach(file => {
|
|
57
|
-
form.append(file.fieldname, file.buffer, file.originalname);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
Object.entries(req.body).forEach(([key, value]) => {
|
|
61
|
-
form.append(key, value);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
config.data = form;
|
|
65
|
-
config.headers = {...config.headers, ...form.getHeaders(), 'Accept': 'application/json'};
|
|
66
|
-
}
|
|
67
61
|
|
|
68
|
-
const response = await axios(config);
|
|
69
62
|
|
|
63
|
+
// ==== Load Common Routes ====
|
|
64
|
+
loadRoutes(app, join(__dirname, ('routes/common')));
|
|
70
65
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// res.setHeader(key, value);
|
|
74
|
-
// });
|
|
75
|
-
|
|
76
|
-
const responseData = await streamToString(response.data);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (typeof responseData === 'string' || Buffer.isBuffer(responseData)) {
|
|
80
|
-
res.send(responseData);
|
|
81
|
-
} else {
|
|
82
|
-
res.json(responseData);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
} catch (error) {
|
|
86
|
-
if (error.response) {
|
|
87
|
-
// Если сервер вернул ответ с ошибкой
|
|
88
|
-
res.status(error.response.status);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (error.response.data && typeof error.response.data === 'object') {
|
|
92
|
-
const details = await streamToString(error.response.data)
|
|
93
|
-
res.json({error: 'Ошибка от проксируемого сервера', details});
|
|
94
|
-
} else {
|
|
95
|
-
res.send(error.response.data);
|
|
96
|
-
}
|
|
97
|
-
} else {
|
|
98
|
-
// Внутренняя ошибка сервера (например, таймаут или потеря связи)
|
|
99
|
-
res.status(500).json({error: 'Внутренняя ошибка прокси', details: error.message});
|
|
100
|
-
}
|
|
66
|
+
// ==== Load Proxy ====
|
|
67
|
+
loadProxy(app);
|
|
101
68
|
|
|
102
69
|
|
|
103
|
-
|
|
70
|
+
// ==== Start Listen ====
|
|
71
|
+
const hostname = appConfig.host || 'localhost';
|
|
72
|
+
server.listen(port, hostname, async () => {
|
|
73
|
+
if (hostname === 'localhost') {
|
|
74
|
+
console.log(`Server started on ${hostname} http://${hostname}:${port}`);
|
|
75
|
+
} else {
|
|
76
|
+
const host = await getIpAddress();
|
|
77
|
+
console.log(`Server started on ${hostname} http://${host}:${port}`);
|
|
104
78
|
}
|
|
105
|
-
});
|
|
106
|
-
server.listen(port, appConfig.host || 'localhost', () => {
|
|
107
|
-
console.log('Server started on: ' + port);
|
|
108
79
|
})
|
|
109
80
|
}
|
|
110
81
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const escpos = require("escpos");
|
|
2
|
+
escpos.USB = require('@alizadefaig/cafetap-escpos-usb');
|
|
3
|
+
device = new escpos.USB(8137, 8214);
|
|
4
|
+
console.log(device);
|
|
5
|
+
// console.log(base64Str);
|
|
6
|
+
|
|
7
|
+
const printer = new escpos.Printer(device, {});
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
device.open((err) => {
|
|
13
|
+
console.log('asd')
|
|
14
|
+
if (err) {
|
|
15
|
+
console.log(err)
|
|
16
|
+
}
|
|
17
|
+
printer.text('Hello World!');
|
|
18
|
+
|
|
19
|
+
printer.newLine().newLine().cut().close();
|
|
20
|
+
});
|
package/utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const {readdirSync, existsSync} = require("node:fs");
|
|
2
2
|
const {extname, join} = require("node:path");
|
|
3
3
|
const {networkInterfaces} = require("os");
|
|
4
|
+
const escpos = require("escpos");
|
|
4
5
|
|
|
5
6
|
function loadRoutes(app, routesDir, prefix = '') {
|
|
6
7
|
if (!existsSync(routesDir)) {
|
|
@@ -66,7 +67,7 @@ function getPrinterDevice(printer) {
|
|
|
66
67
|
let device = null;
|
|
67
68
|
try {
|
|
68
69
|
if (printer.type === 'USB') {
|
|
69
|
-
device = new escpos.USB(printer.vendor_id, printer.product_id);
|
|
70
|
+
device = new escpos.USB(+printer.vendor_id, +printer.product_id);
|
|
70
71
|
} else {
|
|
71
72
|
device = new escpos.Network(printer.ip_address);
|
|
72
73
|
}
|
|
@@ -91,10 +92,21 @@ const streamToString = async (stream) => {
|
|
|
91
92
|
}
|
|
92
93
|
};
|
|
93
94
|
|
|
95
|
+
const socketSendByFilter = ({companyId, eventName, data, to, toId, excepts}, serverSocket = null) => {
|
|
96
|
+
if (!serverSocket) {
|
|
97
|
+
serverSocket = require('./app/socket/server')();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (!to) {
|
|
101
|
+
serverSocket.to(companyId).emit(eventName, data);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
94
105
|
module.exports = {
|
|
95
106
|
loadRoutes,
|
|
96
107
|
getIpAddress,
|
|
97
108
|
ipRange,
|
|
98
109
|
getPrinterDevice,
|
|
99
|
-
streamToString
|
|
110
|
+
streamToString,
|
|
111
|
+
socketSendByFilter
|
|
100
112
|
}
|
package/config.json
DELETED
package/routes/server/socket.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const express = require('express');
|
|
2
|
-
const serverSocket = require("../../app/socket/server")();
|
|
3
|
-
const router = express.Router();
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
router.all('/socket', (req, res) => {
|
|
7
|
-
const companyId = req.body?.company_id || req.query?.company_id;
|
|
8
|
-
const eventName = req.body?.event || req.query?.event;
|
|
9
|
-
const data = req.body?.data || req.query?.data;
|
|
10
|
-
if (!companyId || !eventName || !data) {
|
|
11
|
-
return res.send('ok');
|
|
12
|
-
}
|
|
13
|
-
serverSocket
|
|
14
|
-
.to(companyId)
|
|
15
|
-
.emit(eventName, data);
|
|
16
|
-
res.send('ok');
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
module.exports = router;
|