static ngx_int_t websocket_dequeue(subscriber_t *self) { full_subscriber_t *fsub = (full_subscriber_t *)self; DBG("%p dequeue", self); fsub->dequeue_handler(&fsub->sub, fsub->dequeue_handler_data); self->enqueued = 0; if(fsub->connected) { ngx_str_t close_msg = ngx_string("410 Gone"); websocket_send_close_frame(fsub, CLOSE_NORMAL, &close_msg); } if(fsub->ping_ev.timer_set) { ngx_del_timer(&fsub->ping_ev); } if(fsub->closing_ev.timer_set) { ngx_del_timer(&fsub->closing_ev); } if(fsub->timeout_ev.timer_set) { ngx_del_timer(&fsub->timeout_ev); } if(self->destroy_after_dequeue) { websocket_subscriber_destroy(self); } return NGX_OK; }
static ngx_int_t websocket_dequeue(subscriber_t *self) { full_subscriber_t *fsub = (full_subscriber_t *)self; DBG("%p dequeue", self); fsub->dequeue_handler(&fsub->sub, fsub->dequeue_handler_data); if(self->destroy_after_dequeue) { websocket_subscriber_destroy(self); } return NGX_OK; }
static ngx_int_t websocket_release(subscriber_t *self, uint8_t nodestroy) { full_subscriber_t *fsub = (full_subscriber_t *)self; assert(self->reserved > 0); self->reserved--; DBG("%p release for req %p, reservations: %i", self, fsub->sub.request, self->reserved); if(nodestroy == 0 && fsub->awaiting_destruction == 1 && self->reserved == 0) { websocket_subscriber_destroy(self); return NGX_ABORT; } else { return NGX_OK; } }
static ngx_int_t websocket_dequeue(subscriber_t *self) { full_subscriber_t *fsub = (full_subscriber_t *)self; DBG("%p dequeue", self); fsub->dequeue_handler(&fsub->sub, fsub->dequeue_handler_data); self->enqueued = 0; if(fsub->ping_ev.timer_set) { ngx_del_timer(&fsub->ping_ev); } if(self->destroy_after_dequeue) { websocket_subscriber_destroy(self); } return NGX_OK; }
ngx_int_t nchan_create_websocket_publisher(ngx_http_request_t *r) { subscriber_t *sub; nchan_llist_timed_t *sub_link; nchan_request_ctx_t *ctx = ngx_http_get_module_ctx(r, nchan_module); if(ctx) { ctx->publisher_type = &pub_name; } if((sub = websocket_subscriber_create(r, NULL)) == NULL) { ERR("couldn't create websocket publisher."); return NGX_ERROR; } if((sub_link = nchan_ws_llist_enqueue(sub)) == NULL) { websocket_subscriber_destroy(sub); ERR("couldn't create websocket publisher llink"); return NGX_ERROR; } sub->fn->set_dequeue_callback(sub, ws_publisher_dequeue_callback, sub_link); sub->fn->enqueue(sub); return NGX_OK; }