import * as fs from 'fs'; import * as WebSocket from 'ws'; const fetch = require('node-fetch'); import * as req from 'request'; import * as childProcess from 'child_process'; export const async = (fn: Function) => (done: Function) => { fn().then(() => { done(); }, (err: Error) => { done(err); }); }; export const request = async (endpoint: string, params: any, me?: any): Promise<{ body: any, status: number }> => { const auth = me ? { i: me.token } : {}; try { const res = await fetch('http://localhost:80/api' + endpoint, { method: 'POST', body: JSON.stringify(Object.assign(auth, params)) }); const status = res.status; const body = res.status !== 204 ? await res.json().catch() : null; return { body, status }; } catch (e) { return { body: null, status: 500 }; } }; export const signup = async (params?: any): Promise => { const q = Object.assign({ username: 'test', password: 'test' }, params); const res = await request('/signup', q); return res.body; }; export const post = async (user: any, params?: any): Promise => { const q = Object.assign({ text: 'test' }, params); const res = await request('/notes/create', q, user); return res.body ? res.body.createdNote : null; }; export const react = async (user: any, note: any, reaction: string): Promise => { await request('/notes/reactions/create', { noteId: note.id, reaction: reaction }, user); }; export const uploadFile = (user: any, path?: string): Promise => new Promise((ok, rej) => { req.post({ url: 'http://localhost:80/api/drive/files/create', formData: { i: user.token, file: fs.createReadStream(path || __dirname + '/resources/Lenna.png') }, json: true }, (err, httpResponse, body) => { ok(body); }); }); export function connectStream(user: any, channel: string, listener: (message: Record) => any, params?: any): Promise { return new Promise((res, rej) => { const ws = new WebSocket(`ws://localhost/streaming?i=${user.token}`); ws.on('open', () => { ws.on('message', data => { const msg = JSON.parse(data.toString()); if (msg.type == 'channel' && msg.body.id == 'a') { listener(msg.body); } else if (msg.type == 'connected' && msg.body.id == 'a') { res(ws); } }); ws.send(JSON.stringify({ type: 'connect', body: { channel: channel, id: 'a', pong: true, params: params } })); }); }); } export function launchServer(callbackSpawnedProcess: (p: childProcess.ChildProcess) => void, moreProcess: () => Promise = async () => {}) { return (done: (err?: Error) => any) => { const p = childProcess.spawn('node', [__dirname + '/../index.js'], { stdio: ['inherit', 'inherit', 'inherit', 'ipc'], env: { NODE_ENV: 'test', PATH: process.env.PATH } }); callbackSpawnedProcess(p); p.on('message', message => { if (message === 'ok') moreProcess().then(() => done()).catch(e => done(e)); }); }; }