diff --git a/src/ssb.js.c b/src/ssb.js.c index 8aa42bd0..bf5edc80 100644 --- a/src/ssb.js.c +++ b/src/ssb.js.c @@ -203,20 +203,51 @@ static JSValue _tf_ssb_addIdentity(JSContext* context, JSValueConst this_val, in return result; } +typedef struct _delete_identity_t +{ + char id[k_id_base64_len]; + bool deleted; + JSValue promise[2]; + char user[]; +} delete_identity_t; + +static void _tf_ssb_delete_identity_work(tf_ssb_t* ssb, void* user_data) +{ + delete_identity_t* work = user_data; + work->deleted = tf_ssb_db_identity_delete(ssb, work->user, work->id); +} + +static void _tf_ssb_delete_identity_after_work(tf_ssb_t* ssb, int status, void* user_data) +{ + delete_identity_t* work = user_data; + JSContext* context = tf_ssb_get_context(ssb); + JSValue result = work->deleted ? JS_TRUE : JS_FALSE; + JSValue error = JS_Call(context, work->promise[0], JS_UNDEFINED, 1, &result); + JS_FreeValue(context, result); + tf_util_report_error(context, error); + JS_FreeValue(context, error); + JS_FreeValue(context, work->promise[0]); + JS_FreeValue(context, work->promise[1]); + tf_free(work); +} + static JSValue _tf_ssb_deleteIdentity(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) { tf_ssb_t* ssb = JS_GetOpaque(this_val, _tf_ssb_classId); JSValue result = JS_UNDEFINED; if (ssb) { - const char* user = JS_ToCString(context, argv[0]); + size_t user_length = 0; + const char* user = JS_ToCStringLen(context, &user_length, argv[0]); const char* id = JS_ToCString(context, argv[1]); if (id && user) { - if (tf_ssb_db_identity_delete(ssb, user, *id == '@' ? id + 1 : id)) - { - result = JS_TRUE; - } + delete_identity_t* work = tf_malloc(sizeof(delete_identity_t) + user_length + 1); + *work = (delete_identity_t) { 0 }; + snprintf(work->id, sizeof(work->id), "%s", *id == '@' ? id + 1 : id); + memcpy(work->user, user, user_length + 1); + result = JS_NewPromiseCapability(context, work->promise); + tf_ssb_run_work(ssb, _tf_ssb_delete_identity_work, _tf_ssb_delete_identity_after_work, work); } JS_FreeCString(context, id); JS_FreeCString(context, user);