1#include <js_native_api.h>
2#include "../common.h"
3#include "../entry_point.h"
4
5napi_deferred deferred = NULL;
6
7static napi_value createPromise(napi_env env, napi_callback_info info) {
8  napi_value promise;
9
10  // We do not overwrite an existing deferred.
11  if (deferred != NULL) {
12    return NULL;
13  }
14
15  NODE_API_CALL(env, napi_create_promise(env, &deferred, &promise));
16
17  return promise;
18}
19
20static napi_value
21concludeCurrentPromise(napi_env env, napi_callback_info info) {
22  napi_value argv[2];
23  size_t argc = 2;
24  bool resolution;
25
26  NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
27  NODE_API_CALL(env, napi_get_value_bool(env, argv[1], &resolution));
28  if (resolution) {
29    NODE_API_CALL(env, napi_resolve_deferred(env, deferred, argv[0]));
30  } else {
31    NODE_API_CALL(env, napi_reject_deferred(env, deferred, argv[0]));
32  }
33
34  deferred = NULL;
35
36  return NULL;
37}
38
39static napi_value isPromise(napi_env env, napi_callback_info info) {
40  napi_value promise, result;
41  size_t argc = 1;
42  bool is_promise;
43
44  NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, &promise, NULL, NULL));
45  NODE_API_CALL(env, napi_is_promise(env, promise, &is_promise));
46  NODE_API_CALL(env, napi_get_boolean(env, is_promise, &result));
47
48  return result;
49}
50
51EXTERN_C_START
52napi_value Init(napi_env env, napi_value exports) {
53  napi_property_descriptor descriptors[] = {
54    DECLARE_NODE_API_PROPERTY("createPromise", createPromise),
55    DECLARE_NODE_API_PROPERTY("concludeCurrentPromise", concludeCurrentPromise),
56    DECLARE_NODE_API_PROPERTY("isPromise", isPromise),
57  };
58
59  NODE_API_CALL(env, napi_define_properties(
60      env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors));
61
62  return exports;
63}
64EXTERN_C_END
65