summaryrefslogtreecommitdiff
path: root/test/addons-napi/3_callbacks/binding.c
blob: 10e7318bcecb40ab1d860bc1f888c22be3492a99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <node_api.h>

#define NAPI_CALL(env, theCall)                                                \
  if ((theCall) != napi_ok) {                                                  \
    const napi_extended_error_info* error;                                     \
    napi_get_last_error_info((env), &error);                                   \
    const char* errorMessage = error->error_message;                           \
    errorMessage = errorMessage ? errorMessage : "empty error message";        \
    napi_throw_error((env), errorMessage);                                     \
    return;                                                                    \
  }

void RunCallback(napi_env env, napi_callback_info info) {
  napi_value args[1];
  NAPI_CALL(env, napi_get_cb_args(env, info, args, 1));

  napi_value cb = args[0];

  napi_value argv[1];
  NAPI_CALL(env, napi_create_string_utf8(env, "hello world", -1, argv));

  napi_value global;
  NAPI_CALL(env, napi_get_global(env, &global));

  NAPI_CALL(env, napi_call_function(env, global, cb, 1, argv, NULL));
}

void RunCallbackWithRecv(napi_env env, napi_callback_info info) {
  napi_value args[2];
  NAPI_CALL(env, napi_get_cb_args(env, info, args, 2));

  napi_value cb = args[0];
  napi_value recv = args[1];

  NAPI_CALL(env, napi_call_function(env, recv, cb, 0, NULL, NULL));
}

#define DECLARE_NAPI_METHOD(name, func)                          \
  { name, func, 0, 0, 0, napi_default, 0 }

void Init(napi_env env, napi_value exports, napi_value module, void* priv) {
  napi_status status;
  napi_property_descriptor desc[2] = {
      DECLARE_NAPI_METHOD("RunCallback", RunCallback),
      DECLARE_NAPI_METHOD("RunCallbackWithRecv", RunCallbackWithRecv),
  };
  status = napi_define_properties(env, exports, 2, desc);
  if (status != napi_ok) return;
}

NAPI_MODULE(addon, Init)