summaryrefslogtreecommitdiff
path: root/backend/instance/api-connection.ts
blob: 3f0a6618b333fbdb59d484e1115156ab8c8596dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { WebSocket as wsocket } from 'ws';
import { ServerStatus as Status } from './api-defs.js';

let SERVER_LOG = 1;
let API_ADDRESS = 'http://localhost:4000';

export var status: Status = { isBusy: false, lastUpdate: 0, loadedModel: '', domain: '' };
export var ws: wsocket;

let slog = ( msg: string ) => { if( SERVER_LOG ) console.log( '[server] ' + msg ); };

export function setStatus( s: any ) {
  const newstatus: Status = { ...status, ...s };
  status = newstatus;
  return status;
}

export function serverOpen( addr: string ) {
  API_ADDRESS = addr;
  ws = new wsocket( addr );

  ws.on( 'open', () => {
    slog( 'connection opened' );
    let s = status;
    s.lastUpdate = Date.now();
    s.msg = 'welcome';
    ws.send( JSON.stringify( s ) );
  } );

  ws.on( 'message', ( message: string ) => {
    status.lastUpdate = Date.now();
    try {
      let json = JSON.parse( message );
      if( json.msg == 'ping' ) {
        let s = { ...status };
        s.msg = 'pong';
        setTimeout( () => ws.send( JSON.stringify( s ) ), 5000 );
      }
      else {
        slog( `unhandled message: ${message}` );
      }
    } catch ( err ) {
      slog( '[server] ' + err );
    }
  } );

  ws.on( 'error' , ( err ) => {
    slog( `WebSocket error: ${err}` );
    ws.close();
  } );

  ws.on( 'close', ( code, reason ) => {
    setTimeout( () => { ws = serverOpen( addr ) }, 5000 );
    slog( `connection closed: ${code}, ${reason}` );
  } );

  return ws;
};

export function serverNotify( what: any ) {
  const newstatus: Status = { ...status, ...what };
  status = newstatus;
  try {
    ws.send( JSON.stringify( status ) );
  }
  catch ( err ) {
    slog( '[server] ' + err );
    ws = serverOpen( API_ADDRESS );
  }
};