server/controllers/helix.ts
        
| Properties | 
| 
 | 
| Methods | 
| constructor(router: Router) | ||||||
| Defined in server/controllers/helix.ts:9 | ||||||
| 
                                    Parameters :
                                     
 | 
| Static Readonly ROUTE_PREFIX | 
| Type : string | 
| Default value : '/api/helix' | 
| Defined in server/controllers/helix.ts:9 | 
| Protected list | |||||||||
| list(req: Request, res: Response) | |||||||||
| Defined in server/controllers/helix.ts:82 | |||||||||
| 
                        Parameters :
                        
                         
 
                        Returns :          void | 
| Protected proxy | |||||||||
| proxy(req: HelixRequest, res: Response) | |||||||||
| Defined in server/controllers/helix.ts:16 | |||||||||
| 
                        Parameters :
                        
                         
 
                        Returns :          void | 
import { Request, Response, Router } from 'express';
import * as request from 'request';
import { readFileSync } from 'fs';
import { HELIX_ENDPOINTS, IDENTITY_TOKEN_SOURCE, SSL } from '../config';
import { HelixRequest, HelixRequestOptions } from './d';
export class HelixCtrl {
  static readonly ROUTE_PREFIX = '/api/helix';
  constructor(router: Router) {
    router.route('/helix/list').get(this.list);
    router.route('/helix/*').all(this.proxy);
  }
  protected proxy(req: HelixRequest, res: Response) {
    const url = req.originalUrl.replace(HelixCtrl.ROUTE_PREFIX, '');
    const helixKey = url.split('/')[1];
    const segments = helixKey.split('.');
    const group = segments[0];
    segments.shift();
    const name = segments.join('.');
    const user = req.session.username;
    const method = req.method.toLowerCase();
    if (method != 'get' && !req.session.isAdmin) {
      res.status(403).send('Forbidden');
      return;
    }
    let apiPrefix = null;
    if (HELIX_ENDPOINTS[group]) {
      HELIX_ENDPOINTS[group].forEach((section) => {
        if (section[name]) {
          apiPrefix = section[name];
        }
      });
    }
    if (apiPrefix) {
      const realUrl = apiPrefix + url.replace(`/${helixKey}`, '');
      console.log(`helix-rest request url ${realUrl}`);
      const options: HelixRequestOptions = {
        url: realUrl,
        json: req.body,
        headers: {
          'Helix-User': user,
        },
        agentOptions: {
          rejectUnauthorized: false,
        },
      };
      if (SSL.cafiles.length > 0) {
        options.agentOptions.ca = readFileSync(SSL.cafiles[0], {
          encoding: 'utf-8',
        });
      }
      if (IDENTITY_TOKEN_SOURCE) {
        options.headers['Identity-Token'] =
          res.locals.cookie['helixui_identity.token'];
      }
      request[method](options, (error, response, body) => {
        if (error) {
          res.status(response?.statusCode || 500).send(error);
        } else if (body?.error) {
          res.status(response?.statusCode || 500).send(body?.error);
        } else {
          res.status(response?.statusCode).send(body);
        }
      });
    } else {
      res.status(404).send('Not found');
    }
  }
  protected list(req: Request, res: Response) {
    try {
      res.json(HELIX_ENDPOINTS);
    } catch (err) {
      console.log('error from helix/list/');
      console.log(err);
    }
  }
}