}
+njs_int_t
+ngx_js_ext_flags(njs_vm_t *vm, njs_object_prop_t *prop,
+ njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
+{
+ uintptr_t data;
+
+ data = (uintptr_t) njs_vm_external(vm, NJS_PROTO_ID_ANY, value);
+ if (data == 0) {
+ njs_value_undefined_set(retval);
+ return NJS_DECLINED;
+ }
+
+ data = data & (uintptr_t) njs_vm_prop_magic32(prop);
+
+ switch (njs_vm_prop_magic16(prop)) {
+ case NGX_JS_BOOLEAN:
+ default:
+ njs_value_boolean_set(retval, data);
+ break;
+ }
+
+ return NJS_OK;
+}
+
+
njs_int_t
ngx_js_ext_boolean(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
#define NGX_JS_DEPRECATED 1
#define NGX_JS_STRING 2
#define NGX_JS_BUFFER 4
+#define NGX_JS_BOOLEAN 8
+#define NGX_JS_NUMBER 16
#define ngx_js_buffer_type(btype) ((btype) & ~NGX_JS_DEPRECATED)
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
njs_int_t ngx_js_ext_constant(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
+njs_int_t ngx_js_ext_flags(njs_vm_t *vm, njs_object_prop_t *prop,
+ njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
njs_int_t ngx_js_ext_boolean(njs_vm_t *vm, njs_object_prop_t *prop,
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
};
+static njs_external_t ngx_stream_js_ext_session_flags[] = {
+
+ {
+ .flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL,
+ .name.symbol = NJS_SYMBOL_TO_STRING_TAG,
+ .u.property = {
+ .value = "Stream Flags",
+ }
+ },
+
+ {
+ .flags = NJS_EXTERN_PROPERTY,
+ .name.string = njs_str("last"),
+ .enumerable = 1,
+ .u.property = {
+ .handler = ngx_js_ext_flags,
+ .magic16 = NGX_JS_BOOLEAN,
+ .magic32 = 0x00000001,
+ }
+ },
+
+};
+
+
static njs_vm_ops_t ngx_stream_js_ops = {
ngx_stream_js_set_timer,
ngx_stream_js_clear_timer,
static njs_int_t ngx_stream_js_session_proto_id;
+static njs_int_t ngx_stream_js_session_flags_proto_id;
static ngx_int_t
ngx_stream_js_run_event(ngx_stream_session_t *s, ngx_stream_js_ctx_t *ctx,
ngx_stream_js_ev_t *event)
{
- size_t len;
- u_char *p;
- njs_int_t ret;
- ngx_buf_t *b;
- ngx_connection_t *c;
- njs_opaque_value_t last_key, last;
-
- static const njs_str_t last_str = njs_str("last");
+ size_t len;
+ u_char *p;
+ njs_int_t ret;
+ ngx_buf_t *b;
+ uintptr_t flags;
+ ngx_connection_t *c;
if (event->ev == NULL) {
return NJS_OK;
return ret;
}
- njs_vm_value_string_set(ctx->vm, njs_value_arg(&last_key), last_str.start,
- last_str.length);
-
- njs_value_boolean_set(njs_value_arg(&last), b && b->last_buf);
+ flags = b && b->last_buf;
- ret = njs_vm_object_alloc(ctx->vm, njs_value_arg(&ctx->args[2]),
- njs_value_arg(&last_key),
- njs_value_arg(&last), NULL);
+ ret = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[2]),
+ ngx_stream_js_session_flags_proto_id, (void *) flags, 0);
if (ret != NJS_OK) {
- return ret;
+ return NGX_ERROR;
}
njs_vm_post_event(ctx->vm, event->ev, njs_value_arg(&ctx->args[1]), 2);
njs_nitems(ngx_stream_js_ext_session));
if (ngx_stream_js_session_proto_id < 0) {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
- "failed to add js request proto");
+ "failed to add js session proto");
+ return NGX_ERROR;
+ }
+
+ ngx_stream_js_session_flags_proto_id = njs_vm_external_prototype(conf->vm,
+ ngx_stream_js_ext_session_flags,
+ njs_nitems(ngx_stream_js_ext_session_flags));
+ if (ngx_stream_js_session_flags_proto_id < 0) {
+ ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+ "failed to add js session flags proto");
return NGX_ERROR;
}