function byStomp()

in frontend/src/composables/analysis-api-requester.ts [52:139]


function byStomp(resolve: (req: Requester) => void) {
  const resRejMap = new Map<number, ResRej>();

  const client = new Client({
    brokerURL: `${'https:' === location.protocol ? 'wss' : 'ws'}://${location.host}/jifa-stomp`,
    reconnectDelay: 5000
  });

  let subscriptionReceipt = uuidv4();
  let requestId = 1;

  function nextRequestId() {
    return requestId++;
  }

  let token = useEnv().token;
  if (token) {
    client.connectHeaders = {
      'jifa-token': token
    };
  }

  client.onConnect = () => {
    client.subscribe(
      '/ud/analysis',
      (message) => {
        let requestId = Number(message.headers['request-id']);

        if (resRejMap.has(requestId)) {
          let resRej = resRejMap.get(requestId) as ResRej;
          let success = message.headers['response-success'] === 'true';
          let data = message.body ? JSON.parse(message.body) : null;
          if (success) {
            resRejMap.delete(requestId);
            resRej.resolve(data);
          } else {
            if (data && data.hasOwnProperty('errorCode')) {
              if (data.errorCode === 'ELASTIC_WORKER_NOT_READY') {
                if (resRej.retries-- > 0) {
                  setTimeout(() => {
                    client.publish(resRej.params);
                  }, 2000);
                  return;
                }
              }
            }

            resRejMap.delete(requestId);
            showErrorNotification(data.errorCode, data.message);
            resRej.reject(data);
          }
        }
      },
      {
        receipt: subscriptionReceipt
      }
    );

    client.watchForReceipt(subscriptionReceipt, () => {
      resolve({
        request(namespace: string, api: string, target: string, parameters?: object): Promise<any> {
          let id = nextRequestId();
          let params = {
            destination: '/ad/analysis',
            headers: { 'request-id': id.toString() },
            body: JSON.stringify({
              namespace,
              api,
              target,
              parameters
            })
          };
          let p = new Promise((resolve, reject) => {
            resRejMap.set(id, { resolve, reject, params, retries: 60 });
          });
          client.publish(params);
          return p;
        },

        close() {
          client.deactivate();
        }
      });
    });
  };

  client.activate();
}