- if (writebuf_char(&wb, CHAR_FOR_ANSWER_FAIL)
- && writebuf_uint32(&wb, wreq->msgid)
- && writebuf_uint32(&wb, (uint32_t)wreq->xreq.context.flags)
- && writebuf_string(&wb, status)
- && writebuf_string(&wb, info ? : "")) {
- rc = afb_ws_binary_v(wreq->stubws->ws, wb.iovec, wb.count);
- if (rc >= 0)
- return;
- }
- ERROR("error while sending fail");
-}
-
-static void server_req_subcall_cb(struct afb_xreq *xreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *cb_closure)
-{
- int rc;
- struct writebuf wb = { .count = 0 };
- struct server_subcall *sc, *osc;
- struct server_req *wreq = CONTAINER_OF_XREQ(struct server_req, xreq);
- struct afb_stub_ws *stubws = wreq->stubws;
-
- sc = malloc(sizeof *sc);
- if (!sc) {
- callback(cb_closure, 1, afb_msg_json_internal_error());
- } else {
- sc->callback = callback;
- sc->closure = cb_closure;
-
- pthread_mutex_unlock(&stubws->mutex);
- sc->subcallid = ptr2id(sc);
- do {
- sc->subcallid++;
- osc = stubws->subcalls;
- while(osc && osc->subcallid != sc->subcallid)
- osc = osc->next;
- } while (osc);
- sc->next = stubws->subcalls;
- stubws->subcalls = sc;
- pthread_mutex_unlock(&stubws->mutex);
-
- if (writebuf_char(&wb, CHAR_FOR_SUBCALL_CALL)
- && writebuf_uint32(&wb, wreq->msgid)
- && writebuf_uint32(&wb, sc->subcallid)
- && writebuf_string(&wb, api)
- && writebuf_string(&wb, verb)
- && writebuf_object(&wb, args)) {
- rc = afb_ws_binary_v(wreq->stubws->ws, wb.iovec, wb.count);
- if (rc >= 0)
- return;
- }
- ERROR("error while sending fail");
- }
-}
-
-static int server_req_subscribe_cb(struct afb_xreq *xreq, struct afb_event event)
-{
- int rc, rc2;
- struct writebuf wb = { .count = 0 };
- struct server_req *wreq = CONTAINER_OF_XREQ(struct server_req, xreq);
-
- rc = afb_evt_add_watch(wreq->stubws->listener, event);