static v7_val_t WebSocket_send(struct v7 *v7, v7_val_t this_obj, v7_val_t args) { v7_val_t datav = v7_array_get(v7, args, 0); v7_val_t ncv = v7_get(v7, this_obj, "_nc", ~0); struct mg_connection *nc; /* * TODO(alashkin): check why v7_is_instanceof throws exception * in case of string */ int is_blob = !v7_is_string(datav) && v7_is_instanceof(v7, datav, "Blob"); if (!v7_is_string(datav) && !is_blob) { v7_throw(v7, "arg should be string or Blob"); return v7_create_undefined(); } if (!v7_is_foreign(ncv) || (nc = (struct mg_connection *) v7_to_foreign(ncv)) == NULL) { v7_throw(v7, "ws not connected"); return v7_create_undefined(); } if (is_blob) { _WebSocket_send_blob(v7, nc, datav); } else { _WebSocket_send_string(v7, nc, datav); } return v7_create_undefined(); }
static struct clubby *get_clubby(struct v7 *v7, v7_val_t obj) { v7_val_t clubbyv = v7_get(v7, obj, s_clubby_prop, sizeof(s_clubby_prop)); if (!v7_is_foreign(clubbyv)) { return 0; } return v7_get_ptr(v7, clubbyv); }
static v7_val_t WebSocket_close(struct v7 *v7, v7_val_t this_obj, v7_val_t args) { struct ns_connection *nc; v7_val_t ncv = v7_get(v7, this_obj, "_nc", ~0); (void) args; if (v7_is_foreign(ncv) && (nc = (struct ns_connection *) v7_to_foreign(ncv)) != NULL) { nc->flags |= NSF_CLOSE_IMMEDIATELY; } return v7_create_undefined(); }
static v7_val_t WebSocket_send(struct v7 *v7, v7_val_t this_obj, v7_val_t args) { v7_val_t datav = v7_array_get(v7, args, 0); v7_val_t ncv = v7_get(v7, this_obj, "_nc", ~0); struct ns_connection *nc; const char *data; size_t len; if (!v7_is_string(datav)) { v7_throw(v7, "non string data not implemented"); return v7_create_undefined(); } if (!v7_is_foreign(ncv) || (nc = (struct ns_connection *) v7_to_foreign(ncv)) == NULL) { v7_throw(v7, "ws not connected"); return v7_create_undefined(); } data = v7_to_string(v7, &datav, &len); ns_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, data, len); return v7_create_undefined(); }