75 lines
2.4 KiB
C
75 lines
2.4 KiB
C
/**
|
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
* SPDX-License-Identifier: Apache-2.0.
|
|
*/
|
|
#include "mqtt_client.h"
|
|
#include "io.h"
|
|
|
|
static void s_mqtt_client_finalize(napi_env env, void *finalize_data, void *finalize_hint) {
|
|
|
|
(void)env;
|
|
(void)finalize_hint;
|
|
|
|
struct mqtt_nodejs_client *node_client = finalize_data;
|
|
AWS_ASSERT(node_client);
|
|
|
|
struct aws_allocator *allocator = node_client->native_client->allocator;
|
|
|
|
aws_mqtt_client_release(node_client->native_client);
|
|
aws_mem_release(allocator, node_client);
|
|
}
|
|
|
|
napi_value aws_napi_mqtt_client_new(napi_env env, napi_callback_info info) {
|
|
|
|
struct aws_allocator *allocator = aws_napi_get_allocator();
|
|
|
|
struct mqtt_nodejs_client *node_client = NULL;
|
|
|
|
size_t num_args = 1;
|
|
napi_value node_client_bootstrap;
|
|
AWS_NAPI_CALL(env, napi_get_cb_info(env, info, &num_args, &node_client_bootstrap, NULL, NULL), {
|
|
napi_throw_error(env, NULL, "Failed to retreive callback information");
|
|
return NULL;
|
|
});
|
|
if (num_args < 1) {
|
|
napi_throw_error(env, NULL, "aws_nodejs_mqtt_client_new needs at least 1 argument");
|
|
return NULL;
|
|
}
|
|
|
|
struct aws_client_bootstrap *client_bootstrap = NULL;
|
|
struct client_bootstrap_binding *client_bootstrap_binding = NULL;
|
|
napi_get_value_external(env, node_client_bootstrap, (void **)&client_bootstrap_binding);
|
|
|
|
if (client_bootstrap_binding != NULL) {
|
|
client_bootstrap = aws_napi_get_client_bootstrap(client_bootstrap_binding);
|
|
} else {
|
|
client_bootstrap = aws_napi_get_default_client_bootstrap();
|
|
}
|
|
|
|
node_client = aws_mem_acquire(allocator, sizeof(struct mqtt_nodejs_client));
|
|
AWS_FATAL_ASSERT(node_client);
|
|
AWS_ZERO_STRUCT(*node_client);
|
|
|
|
node_client->native_client = aws_mqtt_client_new(allocator, client_bootstrap);
|
|
if (node_client->native_client == NULL) {
|
|
napi_throw_error(env, NULL, "Failed to init client");
|
|
goto error;
|
|
}
|
|
|
|
napi_value node_external;
|
|
AWS_NAPI_CALL(env, napi_create_external(env, node_client, s_mqtt_client_finalize, NULL, &node_external), {
|
|
napi_throw_error(env, NULL, "Failed create n-api external");
|
|
goto error;
|
|
});
|
|
|
|
return node_external;
|
|
|
|
error:
|
|
if (node_client) {
|
|
aws_mqtt_client_release(node_client->native_client);
|
|
aws_mem_release(allocator, node_client);
|
|
}
|
|
|
|
return NULL;
|
|
}
|