HEX
Server: Apache/2.4.63 (Unix)
System: Linux TOMS-220NAS 4.4.302+ #86009 SMP Wed Nov 26 18:19:17 CST 2025 x86_64
User: flavio87 (1026)
PHP: 8.3.27
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']))
				.catch(function(error) {
					if (error.statusCode === 410) {
						console.error(`Subscription has expired or been removed. The device endpoint: ${pushSubscription['endpoint']}`);
					} else {
						console.error(`Unexpected error ${error.statusCode}: ${error.body}`);
					}
				});
			} catch (e) {
				console.error(e.message);
			}
			
			totalLen = -1;
			curLen = -1;
			buffer = null;
		}
	});
});
unixServer.listen(SOCK_FILE_PATH);