HEX
Server: Apache/2.2.34 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0910052141
System: Linux Kou-Etsu-Dou 4.4.59+ #25556 SMP PREEMPT Thu Mar 4 18:03:46 CST 2021 x86_64
User: hosam (1026)
PHP: 7.2.29
Disabled: NONE
Upload Files
File: //volume1/@appstore/SynologyApplicationService/node_libs/VapidSendServer.js
const webpush = require('/var/packages/SynologyApplicationService/target/node_modules/web-push/src/index');
const net = require('net');
const fs = require('fs');

const SOCK_FILE_PATH = '/var/run/vapid_send_server.sock';

/*
   TODO: get public key and private key from daemon
const PUBLIC_KEY_FILE_PATH = '/usr/syno/etc/packages/SynologyApplicationService/vapid/public.key';
const PRIVATE_KEY_FILE_PATH = '/usr/syno/etc/packages/SynologyApplicationService/vapid/private.key';

fs.readFile(PUBLIC_KEY_FILE_PATH, 'utf-8', function (err, publickey) {
	if (err) {
	}

	fs.readFile(PRIVATE_KEY_FILE_PATH, 'utf-8', function (error, privatekey) {
		if (error) {
		}

		webpush.setVapidDetails('mailto:pm@synology.com', publickey, privatekey);
	});
});
*/

var unixServer = net.createServer(function(client) {
	var buffer = null;
	var curLen = -1;
	var totalLen = -1;

	client.on('data', function(data) {
		if (-1 === totalLen) {
			totalLen = data.readUInt32BE(0);
			curLen = 0;
			data = data.slice(4);
			buffer = new Buffer(totalLen);
		}

		var remainLen = totalLen - curLen;
		curLen += data.copy(buffer, curLen, 0, remainLen);
		data = data.slice(remainLen);

		if (curLen === totalLen) {
			try {
				var obj = JSON.parse(buffer.toString());

				webpush.setVapidDetails('mailto:pm@synology.com', obj['publickey'], obj['privatekey']);

				const pushSubscription = {
					endpoint: obj['endpoint'],
					keys: {
						auth: obj['auth'],
						p256dh: obj['p256dh']
					}
				};

				webpush.sendNotification(pushSubscription, JSON.stringify(obj['data']));
				// TODO: error response and handling		
			} catch (e) {

			}
			
			totalLen = -1;
			curLen = -1;
			buffer = null;
		}
	});
});
unixServer.listen(SOCK_FILE_PATH);