diff options
author | Dmitry Volyntsev <xeioex@nginx.com> | 2023-09-05 18:15:14 -0700 |
---|---|---|
committer | Dmitry Volyntsev <xeioex@nginx.com> | 2023-09-05 18:15:14 -0700 |
commit | db843f4c5482e6a11f3a2bc622b8013d1df3d7e0 (patch) | |
tree | 0deb9766ac8fc0cbddad6a18774d3580f4ae30cc /nginx/ngx_stream_js_module.c | |
parent | edf96120b7453d9db64dda069963abd61f416ccd (diff) | |
download | njs-db843f4c5482e6a11f3a2bc622b8013d1df3d7e0.tar.gz njs-db843f4c5482e6a11f3a2bc622b8013d1df3d7e0.zip |
Modules: added a session object for js_periodic handler.
Now js_periodic handler is provided with a session object as its first
argument. Session object can be used to access variables created with
js_set, js_var or map directives.
example.conf:
js_var $js_var JS-VAR;
location @periodics {
js_periodic main.handler interval=60s;
}
example.js:
function handler(s) {
ngx.log(ngx.INFO, s.variables.js_var);
}
Diffstat (limited to 'nginx/ngx_stream_js_module.c')
-rw-r--r-- | nginx/ngx_stream_js_module.c | 112 |
1 files changed, 89 insertions, 23 deletions
diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index 376b728b..6e28f4ab 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -88,7 +88,7 @@ static ngx_int_t ngx_stream_js_variable_set(ngx_stream_session_t *s, static ngx_int_t ngx_stream_js_variable_var(ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_stream_js_init_vm(ngx_stream_session_t *s, - unsigned inject_session); + njs_int_t proto_id); static void ngx_stream_js_drop_events(ngx_stream_js_ctx_t *ctx); static void ngx_stream_js_cleanup(void *data); static njs_int_t ngx_stream_js_run_event(ngx_stream_session_t *s, @@ -117,6 +117,9 @@ static njs_int_t ngx_stream_js_ext_set_return_value(njs_vm_t *vm, static njs_int_t ngx_stream_js_ext_variables(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval); +static njs_int_t ngx_stream_js_periodic_variables(njs_vm_t *vm, + njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, + njs_value_t *retval); static njs_host_event_t ngx_stream_js_set_timer(njs_external_ptr_t external, uint64_t delay, njs_vm_event_t vm_event); @@ -546,6 +549,38 @@ static njs_external_t ngx_stream_js_ext_session[] = { }; +static njs_external_t ngx_stream_js_ext_periodic_session[] = { + + { + .flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL, + .name.symbol = NJS_SYMBOL_TO_STRING_TAG, + .u.property = { + .value = "PeriodicSession", + } + }, + + { + .flags = NJS_EXTERN_OBJECT, + .name.string = njs_str("rawVariables"), + .u.object = { + .writable = 1, + .prop_handler = ngx_stream_js_periodic_variables, + .magic32 = NGX_JS_BUFFER, + } + }, + + { + .flags = NJS_EXTERN_OBJECT, + .name.string = njs_str("variables"), + .u.object = { + .writable = 1, + .prop_handler = ngx_stream_js_periodic_variables, + .magic32 = NGX_JS_STRING, + } + }, +}; + + static njs_external_t ngx_stream_js_ext_session_flags[] = { { @@ -613,6 +648,7 @@ static ngx_stream_filter_pt ngx_stream_next_filter; static njs_int_t ngx_stream_js_session_proto_id; +static njs_int_t ngx_stream_js_periodic_session_proto_id; static njs_int_t ngx_stream_js_session_flags_proto_id; @@ -686,7 +722,7 @@ ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name) return NGX_DECLINED; } - rc = ngx_stream_js_init_vm(s, 1); + rc = ngx_stream_js_init_vm(s, ngx_stream_js_session_proto_id); if (rc != NGX_OK) { return rc; } @@ -767,7 +803,7 @@ ngx_stream_js_body_filter(ngx_stream_session_t *s, ngx_chain_t *in, ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "stream js filter u:%ui", from_upstream); - rc = ngx_stream_js_init_vm(s, 1); + rc = ngx_stream_js_init_vm(s, ngx_stream_js_session_proto_id); if (rc == NGX_ERROR) { return NGX_ERROR; @@ -875,7 +911,7 @@ ngx_stream_js_variable_set(ngx_stream_session_t *s, ngx_str_t value; ngx_stream_js_ctx_t *ctx; - rc = ngx_stream_js_init_vm(s, 1); + rc = ngx_stream_js_init_vm(s, ngx_stream_js_session_proto_id); if (rc == NGX_ERROR) { return NGX_ERROR; @@ -949,7 +985,7 @@ ngx_stream_js_variable_var(ngx_stream_session_t *s, static ngx_int_t -ngx_stream_js_init_vm(ngx_stream_session_t *s, unsigned inject_session) +ngx_stream_js_init_vm(ngx_stream_session_t *s, njs_int_t proto_id) { njs_int_t rc; njs_str_t key; @@ -1026,12 +1062,10 @@ ngx_stream_js_init_vm(ngx_stream_session_t *s, unsigned inject_session) return NGX_ERROR; } - if (inject_session) { - rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[0]), - ngx_stream_js_session_proto_id, s, 0); - if (rc != NJS_OK) { - return NGX_ERROR; - } + rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[0]), + proto_id, s, 0); + if (rc != NJS_OK) { + return NGX_ERROR; } return NGX_OK; @@ -1507,24 +1541,17 @@ ngx_stream_js_ext_set_return_value(njs_vm_t *vm, njs_value_t *args, static njs_int_t -ngx_stream_js_ext_variables(njs_vm_t *vm, njs_object_prop_t *prop, - njs_value_t *value, njs_value_t *setval, njs_value_t *retval) +ngx_stream_js_session_variables(njs_vm_t *vm, njs_object_prop_t *prop, + ngx_stream_session_t *s, njs_value_t *setval, njs_value_t *retval) { njs_int_t rc; njs_str_t val; ngx_str_t name; ngx_uint_t key; ngx_stream_variable_t *v; - ngx_stream_session_t *s; ngx_stream_core_main_conf_t *cmcf; ngx_stream_variable_value_t *vv; - s = njs_vm_external(vm, ngx_stream_js_session_proto_id, value); - if (s == NULL) { - njs_value_undefined_set(retval); - return NJS_DECLINED; - } - rc = njs_vm_prop_name(vm, prop, &val); if (rc != NJS_OK) { njs_value_undefined_set(retval); @@ -1601,6 +1628,38 @@ ngx_stream_js_ext_variables(njs_vm_t *vm, njs_object_prop_t *prop, } +static njs_int_t +ngx_stream_js_ext_variables(njs_vm_t *vm, njs_object_prop_t *prop, + njs_value_t *value, njs_value_t *setval, njs_value_t *retval) +{ + ngx_stream_session_t *s; + + s = njs_vm_external(vm, ngx_stream_js_session_proto_id, value); + if (s == NULL) { + njs_value_undefined_set(retval); + return NJS_DECLINED; + } + + return ngx_stream_js_session_variables(vm, prop, s, setval, retval); +} + + +static njs_int_t +ngx_stream_js_periodic_variables(njs_vm_t *vm, njs_object_prop_t *prop, + njs_value_t *value, njs_value_t *setval, njs_value_t *retval) +{ + ngx_stream_session_t *s; + + s = njs_vm_external(vm, ngx_stream_js_periodic_session_proto_id, value); + if (s == NULL) { + njs_value_undefined_set(retval); + return NJS_DECLINED; + } + + return ngx_stream_js_session_variables(vm, prop, s, setval, retval); +} + + static njs_host_event_t ngx_stream_js_set_timer(njs_external_ptr_t external, uint64_t delay, njs_vm_event_t vm_event) @@ -1770,6 +1829,13 @@ ngx_js_stream_init(njs_vm_t *vm) return NJS_ERROR; } + ngx_stream_js_periodic_session_proto_id = njs_vm_external_prototype(vm, + ngx_stream_js_ext_periodic_session, + njs_nitems(ngx_stream_js_ext_periodic_session)); + if (ngx_stream_js_periodic_session_proto_id < 0) { + return NJS_ERROR; + } + ngx_stream_js_session_flags_proto_id = njs_vm_external_prototype(vm, ngx_stream_js_ext_session_flags, njs_nitems(ngx_stream_js_ext_session_flags)); @@ -1885,7 +1951,7 @@ ngx_stream_js_periodic_handler(ngx_event_t *ev) s->health_check = 1; - rc = ngx_stream_js_init_vm(s, 0); + rc = ngx_stream_js_init_vm(s, ngx_stream_js_periodic_session_proto_id); if (rc != NGX_OK) { ngx_stream_js_periodic_destroy(s, periodic); @@ -1900,8 +1966,8 @@ ngx_stream_js_periodic_handler(ngx_event_t *ev) s->received++; - rc = ngx_js_invoke(ctx->vm, &periodic->method, &periodic->log, NULL, 0, - &ctx->retval); + rc = ngx_js_invoke(ctx->vm, &periodic->method, &periodic->log, + &ctx->args[0], 1, &ctx->retval); if (rc == NGX_AGAIN) { rc = NGX_OK; |