Welcome! Log In Create A New Profile

Advanced

[njs] Modules: added a session object for js_periodic handler.

Dmitry Volyntsev
September 06, 2023 07:48PM
details: https://hg.nginx.org/njs/rev/0f1e76ab9d45
branches:
changeset: 2191:0f1e76ab9d45
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Tue Sep 05 18:15:14 2023 -0700
description:
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:

nginx/ngx_http_js_module.c | 115 +++++++++++++++++++++++++++++++++---------
nginx/ngx_stream_js_module.c | 112 +++++++++++++++++++++++++++++++++--------
nginx/t/js_periodic.t | 37 +++++++++++-
nginx/t/stream_js_periodic.t | 35 +++++++++++-
ts/ngx_http_js_module.d.ts | 22 ++++++++
ts/ngx_stream_js_module.d.ts | 22 ++++++++
6 files changed, 286 insertions(+), 57 deletions(-)

diffs (694 lines):

diff -r e3c442561889 -r 0f1e76ab9d45 nginx/ngx_http_js_module.c
--- a/nginx/ngx_http_js_module.c Tue Sep 05 09:17:10 2023 -0700
+++ b/nginx/ngx_http_js_module.c Tue Sep 05 18:15:14 2023 -0700
@@ -111,8 +111,7 @@ static ngx_int_t ngx_http_js_variable_se
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_js_variable_var(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
-static ngx_int_t ngx_http_js_init_vm(ngx_http_request_t *r,
- unsigned inject_request);
+static ngx_int_t ngx_http_js_init_vm(ngx_http_request_t *r, njs_int_t proto_id);
static void ngx_http_js_cleanup_ctx(void *data);

static njs_int_t ngx_http_js_ext_keys_header(njs_vm_t *vm, njs_value_t *value,
@@ -217,6 +216,9 @@ static njs_int_t ngx_http_js_ext_keys_he
static njs_int_t ngx_http_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_http_js_periodic_session_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_http_js_ext_subrequest(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
static ngx_int_t ngx_http_js_subrequest(ngx_http_request_t *r,
@@ -494,6 +496,7 @@ static ngx_http_output_body_filter_pt


static njs_int_t ngx_http_js_request_proto_id;
+static njs_int_t ngx_http_js_periodic_session_proto_id;


static njs_external_t ngx_http_js_ext_request[] = {
@@ -817,6 +820,38 @@ static njs_external_t ngx_http_js_ext_r
};


+static njs_external_t ngx_http_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_http_js_periodic_session_variables,
+ .magic32 = NGX_JS_BUFFER,
+ }
+ },
+
+ {
+ .flags = NJS_EXTERN_OBJECT,
+ .name.string = njs_str("variables"),
+ .u.object = {
+ .writable = 1,
+ .prop_handler = ngx_http_js_periodic_session_variables,
+ .magic32 = NGX_JS_STRING,
+ }
+ },
+};
+
+
static njs_vm_ops_t ngx_http_js_ops = {
ngx_http_js_set_timer,
ngx_http_js_clear_timer,
@@ -904,7 +939,7 @@ ngx_http_js_content_event_handler(ngx_ht
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http js content event handler");

- rc = ngx_http_js_init_vm(r, 1);
+ rc = ngx_http_js_init_vm(r, ngx_http_js_request_proto_id);

if (rc == NGX_ERROR || rc == NGX_DECLINED) {
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
@@ -1040,7 +1075,7 @@ ngx_http_js_header_filter(ngx_http_reque
return ngx_http_next_header_filter(r);
}

- rc = ngx_http_js_init_vm(r, 1);
+ rc = ngx_http_js_init_vm(r, ngx_http_js_request_proto_id);

if (rc == NGX_ERROR || rc == NGX_DECLINED) {
return NGX_ERROR;
@@ -1092,7 +1127,7 @@ ngx_http_js_body_filter(ngx_http_request
return ngx_http_next_body_filter(r, in);
}

- rc = ngx_http_js_init_vm(r, 1);
+ rc = ngx_http_js_init_vm(r, ngx_http_js_request_proto_id);

if (rc == NGX_ERROR || rc == NGX_DECLINED) {
return NGX_ERROR;
@@ -1206,7 +1241,7 @@ ngx_http_js_variable_set(ngx_http_reques
ngx_str_t value;
ngx_http_js_ctx_t *ctx;

- rc = ngx_http_js_init_vm(r, 1);
+ rc = ngx_http_js_init_vm(r, ngx_http_js_request_proto_id);

if (rc == NGX_ERROR) {
return NGX_ERROR;
@@ -1280,7 +1315,7 @@ ngx_http_js_variable_var(ngx_http_reques


static ngx_int_t
-ngx_http_js_init_vm(ngx_http_request_t *r, unsigned inject_request)
+ngx_http_js_init_vm(ngx_http_request_t *r, njs_int_t proto_id)
{
njs_int_t rc;
ngx_str_t exception;
@@ -1359,12 +1394,10 @@ ngx_http_js_init_vm(ngx_http_request_t *
return NGX_ERROR;
}

- if (inject_request) {
- rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->request),
- ngx_http_js_request_proto_id, r, 0);
- if (rc != NJS_OK) {
- return NGX_ERROR;
- }
+ rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->request),
+ proto_id, r, 0);
+ if (rc != NJS_OK) {
+ return NGX_ERROR;
}

return NGX_OK;
@@ -2904,24 +2937,17 @@ ngx_http_js_ext_keys_header_in(njs_vm_t


static njs_int_t
-ngx_http_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_http_js_request_variables(njs_vm_t *vm, njs_object_prop_t *prop,
+ ngx_http_request_t *r, njs_value_t *setval, njs_value_t *retval)
{
njs_int_t rc;
njs_str_t val, s;
ngx_str_t name;
ngx_uint_t key;
- ngx_http_request_t *r;
ngx_http_variable_t *v;
ngx_http_core_main_conf_t *cmcf;
ngx_http_variable_value_t *vv;

- r = njs_vm_external(vm, ngx_http_js_request_proto_id, value);
- if (r == 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);
@@ -3001,6 +3027,38 @@ ngx_http_js_ext_variables(njs_vm_t *vm,


static njs_int_t
+ngx_http_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_http_request_t *r;
+
+ r = njs_vm_external(vm, ngx_http_js_request_proto_id, value);
+ if (r == NULL) {
+ njs_value_undefined_set(retval);
+ return NJS_DECLINED;
+ }
+
+ return ngx_http_js_request_variables(vm, prop, r, setval, retval);
+}
+
+
+static njs_int_t
+ngx_http_js_periodic_session_variables(njs_vm_t *vm, njs_object_prop_t *prop,
+ njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
+{
+ ngx_http_request_t *r;
+
+ r = njs_vm_external(vm, ngx_http_js_periodic_session_proto_id, value);
+ if (r == NULL) {
+ njs_value_undefined_set(retval);
+ return NJS_DECLINED;
+ }
+
+ return ngx_http_js_request_variables(vm, prop, r, setval, retval);
+}
+
+
+static njs_int_t
ngx_http_js_promise_trampoline(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval)
{
@@ -4168,7 +4226,7 @@ ngx_http_js_periodic_handler(ngx_event_t
r->health_check = 1;
r->write_event_handler = ngx_http_js_periodic_write_event_handler;

- rc = ngx_http_js_init_vm(r, 0);
+ rc = ngx_http_js_init_vm(r, ngx_http_js_periodic_session_proto_id);

if (rc != NGX_OK) {
ngx_http_js_periodic_destroy(r, periodic);
@@ -4181,8 +4239,8 @@ ngx_http_js_periodic_handler(ngx_event_t

r->count++;

- 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->request, 1, &ctx->retval);

if (rc == NGX_AGAIN) {
rc = NGX_OK;
@@ -4482,6 +4540,13 @@ ngx_js_http_init(njs_vm_t *vm)
return NJS_ERROR;
}

+ ngx_http_js_periodic_session_proto_id = njs_vm_external_prototype(vm,
+ ngx_http_js_ext_periodic_session,
+ njs_nitems(ngx_http_js_ext_periodic_session));
+ if (ngx_http_js_periodic_session_proto_id < 0) {
+ return NJS_ERROR;
+ }
+
return NJS_OK;
}

diff -r e3c442561889 -r 0f1e76ab9d45 nginx/ngx_stream_js_module.c
--- a/nginx/ngx_stream_js_module.c Tue Sep 05 09:17:10 2023 -0700
+++ b/nginx/ngx_stream_js_module.c Tue Sep 05 18:15:14 2023 -0700
@@ -88,7 +88,7 @@ static ngx_int_t ngx_stream_js_variable_
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_r
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
};


+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_


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_s
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_ses
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_se
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_se


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
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_v


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
}


+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

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

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;
diff -r e3c442561889 -r 0f1e76ab9d45 nginx/t/js_periodic.t
--- a/nginx/t/js_periodic.t Tue Sep 05 09:17:10 2023 -0700
+++ b/nginx/t/js_periodic.t Tue Sep 05 18:15:14 2023 -0700
@@ -45,6 +45,12 @@ http {
js_shared_dict_zone zone=strings:32k;
js_shared_dict_zone zone=workers:32k type=number;

+ js_set $js_set test.js_set;
+ js_var $js_var JS-VAR;
+ map _ $map_var {
+ default "MAP-VAR";
+ }
+
server {
listen 127.0.0.1:8080;
server_name localhost;
@@ -57,6 +63,7 @@ http {
js_periodic test.fetch interval=40ms;
js_periodic test.multiple_fetches interval=1s;
js_periodic test.affinity interval=50ms worker_affinity=0101;
+ js_periodic test.vars interval=10s;

js_periodic test.fetch_exception interval=1s;
js_periodic test.tick_exception interval=1s;
@@ -99,6 +106,10 @@ http {
location /test_timeout_exception {
js_content test.test_timeout_exception;
}
+
+ location /test_vars {
+ js_content test.test_vars;
+ }
}
}

@@ -121,6 +132,10 @@ my $p0 = port(8080);
ngx.shared.strings.set('fetch', v + body);
}

+ function js_set() {
+ return 'JS-SET';
+ }
+
async function multiple_fetches() {
let reply = await ngx.fetch('http://127.0.0.1:$p0/fetch_ok');
let reply2 = await ngx.fetch('http://127.0.0.1:$p0/fetch_foo');
@@ -181,6 +196,12 @@ my $p0 = port(8080);
}, 1);
}

+ function vars(s) {
+ var v = s.variables;
+ ngx.shared.strings.set('vars',
+ `\${v.js_var}|\${v.js_set}|\${v.map_var}`);
+ }
+
function test_affinity(r) {
r.return(200, `[\${ngx.shared.workers.keys().toSorted()}]`);
}
@@ -211,14 +232,19 @@ my $p0 = port(8080);
r.return(200, ngx.shared.nums.get('timeout_exception') >= 2);
}

- export default { affinity, fetch, fetch_exception, file, multiple_fetches,
- overrun, test_affinity, test_fetch, test_file,
- test_multiple_fetches, test_tick, test_timeout_exception,
- test_timer, tick, tick_exception, timer, timer_exception,
+ function test_vars(r) {
+ r.return(200, ngx.shared.strings.get('vars'));
+ }
+
+ export default { affinity, fetch, fetch_exception, file, js_set,
+ multiple_fetches, overrun, vars, test_affinity, test_fetch,
+ test_file, test_multiple_fetches, test_tick,
+ test_timeout_exception, test_timer, test_vars, tick,
+ tick_exception, timer, timer_exception,
timeout_exception };
EOF

-$t->try_run('no js_periodic')->plan(8);
+$t->try_run('no js_periodic')->plan(9);

###############################################################################

@@ -232,6 +258,7 @@ like(http_get('/test_fetch'), qr/true/,
like(http_get('/test_multiple_fetches'), qr/true/, 'multiple fetch test');

like(http_get('/test_timeout_exception'), qr/true/, 'timeout exception test');
+like(http_get('/test_vars'), qr/JS-VAR\|JS-SET\|MAP-VAR/, 'vars test');

$t->stop();

diff -r e3c442561889 -r 0f1e76ab9d45 nginx/t/stream_js_periodic.t
--- a/nginx/t/stream_js_periodic.t Tue Sep 05 09:17:10 2023 -0700
+++ b/nginx/t/stream_js_periodic.t Tue Sep 05 18:15:14 2023 -0700
@@ -46,6 +46,12 @@ stream {
js_shared_dict_zone zone=strings:32k;
js_shared_dict_zone zone=workers:32k type=number;

+ js_set $js_set test.js_set;
+ js_var $js_var JS-VAR;
+ map _ $map_var {
+ default "MAP-VAR";
+ }
+
server {
listen 127.0.0.1:8080;

@@ -56,6 +62,7 @@ stream {
js_periodic test.fetch interval=40ms;
js_periodic test.multiple_fetches interval=1s;
js_periodic test.affinity interval=50ms worker_affinity=0101;
+ js_periodic test.vars interval=10s;

js_periodic test.fetch_exception interval=1s;
js_periodic test.tick_exception interval=1s;
@@ -108,6 +115,10 @@ my $p1 = port(8081);
let reply = await ngx.fetch('garbage');
}

+ function js_set() {
+ return 'JS-SET';
+ }
+
async function multiple_fetches() {
let reply = await ngx.fetch('http://127.0.0.1:$p1/fetch_ok');
let reply2 = await ngx.fetch('http://127.0.0.1:$p1/fetch_foo');
@@ -163,6 +174,12 @@ my $p1 = port(8081);
}, 1);
}

+ function vars(s) {
+ var v = s.variables;
+ ngx.shared.strings.set('vars',
+ `\${v.js_var}|\${v.js_set}|\${v.map_var}`);
+ }
+
function test(s) {
s.on('upload', function (data) {
if (data.length > 0) {
@@ -229,6 +246,15 @@ my $p1 = port(8081);

break;

+ case 'vars':
+ var vars = ngx.shared.strings.get('vars');
+ if (vars === 'JS-VAR|JS-SET|MAP-VAR') {
+ s.done();
+ return;
+ }
+
+ break;
+
default:
throw new Error(`Unknown test "\${data}"`);
}
@@ -238,13 +264,13 @@ my $p1 = port(8081);
});
}

- export default { affinity, fetch, fetch_exception, multiple_fetches, file,
- overrun, test, tick, tick_exception, timer,
- timer_exception, timeout_exception };
+ export default { affinity, fetch, fetch_exception, js_set, multiple_fetches,
+ file, overrun, test, tick, tick_exception, timer,
+ timer_exception, timeout_exception, vars };
EOF

$t->run_daemon(\&stream_daemon, port(8090));
-$t->try_run('no js_periodic')->plan(8);
+$t->try_run('no js_periodic')->plan(9);
$t->waitforsocket('127.0.0.1:' . port(8090));

###############################################################################
@@ -261,6 +287,7 @@ is(stream('127.0.0.1:' . port(8080))->io
'multiple_fetches', 'muliple fetches test');
is(stream('127.0.0.1:' . port(8080))->io('timeout_exception'),
'timeout_exception', 'timeout exception test');
+is(stream('127.0.0.1:' . port(8080))->io('vars'), 'vars', 'vars test');

$t->stop();

diff -r e3c442561889 -r 0f1e76ab9d45 ts/ngx_http_js_module.d.ts
--- a/ts/ngx_http_js_module.d.ts Tue Sep 05 09:17:10 2023 -0700
+++ b/ts/ngx_http_js_module.d.ts Tue Sep 05 18:15:14 2023 -0700
@@ -479,3 +479,25 @@ interface NginxHTTPRequest {
*/
warn(message: NjsStringOrBuffer): void;
}
+
+
+/**
+ * NginxPeriodicSession object is available as the first argument in the js_periodic handler.
+ * @since 0.8.1
+ */
+interface NginxPeriodicSession {
+ /**
+ * nginx variables as Buffers.
+ *
+ * @see variables
+ */
+ readonly rawVariables: NginxRawVariables;
+ /**
+ * nginx variables as strings.
+ *
+ * **Warning:** Bytes invalid in UTF-8 encoding may be converted into the replacement character.
+ *
+ * @see rawVariables
+ */
+ readonly variables: NginxVariables;
+}
diff -r e3c442561889 -r 0f1e76ab9d45 ts/ngx_stream_js_module.d.ts
--- a/ts/ngx_stream_js_module.d.ts Tue Sep 05 09:17:10 2023 -0700
+++ b/ts/ngx_stream_js_module.d.ts Tue Sep 05 18:15:14 2023 -0700
@@ -211,3 +211,25 @@ interface NginxStreamRequest {
*/
warn(message: NjsStringOrBuffer): void;
}
+
+
+/**
+ * NginxPeriodicSession object is available as the first argument in the js_periodic handler.
+ * @since 0.8.1
+ */
+interface NginxPeriodicSession {
+ /**
+ * nginx variables as Buffers.
+ *
+ * @see variables
+ */
+ readonly rawVariables: NginxRawVariables;
+ /**
+ * nginx variables as strings.
+ *
+ * **Warning:** Bytes invalid in UTF-8 encoding may be converted into the replacement character.
+ *
+ * @see rawVariables
+ */
+ readonly variables: NginxVariables;
+}
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Modules: added a session object for js_periodic handler.

Dmitry Volyntsev 354 September 06, 2023 07:48PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 115
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready