UNPKG

push-receiver

Version:

A module to subscribe to GCM/FCM and receive notifications within a node process.

53 lines (48 loc) 1.43 kB
const crypto = require('crypto'); const request = require('request-promise'); const { escape } = require('../utils/base64'); const FCM_SUBSCRIBE = 'https://fcm.googleapis.com/fcm/connect/subscribe'; const FCM_ENDPOINT = 'https://fcm.googleapis.com/fcm/send'; module.exports = registerFCM; async function registerFCM({ senderId, token }) { const keys = await createKeys(); const response = await request({ url : FCM_SUBSCRIBE, method : 'POST', headers : { 'Content-Type' : 'application/x-www-form-urlencoded', }, form : { authorized_entity : senderId, endpoint : `${FCM_ENDPOINT}/${token}`, encryption_key : keys.publicKey .replace(/=/g, '') .replace(/\+/g, '-') .replace(/\//g, '_'), encryption_auth : keys.authSecret .replace(/=/g, '') .replace(/\+/g, '-') .replace(/\//g, '_'), }, }); return { keys, fcm : JSON.parse(response), }; } function createKeys() { return new Promise((resolve, reject) => { const dh = crypto.createECDH('prime256v1'); dh.generateKeys(); crypto.randomBytes(16, (err, buf) => { if (err) { return reject(err); } return resolve({ privateKey : escape(dh.getPrivateKey('base64')), publicKey : escape(dh.getPublicKey('base64')), authSecret : escape(buf.toString('base64')), }); }); }); }