Skip to content

Commit 85fd76f

Browse files
authored
Merge pull request #6 from Bilb/feat-add-embedded-member-sending-state
feat: track member sending state as part of libsession
2 parents e11c1b6 + c901fb4 commit 85fd76f

File tree

5 files changed

+86
-74
lines changed

5 files changed

+86
-74
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"main": "index.js",
33
"name": "libsession_util_nodejs",
44
"description": "Wrappers for the Session Util Library",
5-
"version": "0.4.8",
5+
"version": "0.4.9",
66
"license": "GPL-3.0",
77
"author": {
88
"name": "Oxen Project",

src/groups/meta_group_wrapper.cpp

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,68 @@
99

1010
namespace session::nodeapi {
1111

12+
Napi::Object member_to_js(const Napi::Env& env, const member& info, const member::Status& status) {
13+
auto obj = Napi::Object::New(env);
14+
15+
obj["pubkeyHex"] = toJs(env, info.session_id);
16+
obj["name"] = toJs(env, info.name);
17+
obj["profilePicture"] = toJs(env, info.profile_picture);
18+
19+
switch (status) {
20+
// invite statuses
21+
case member::Status::invite_unknown:
22+
obj["memberStatus"] = toJs(env, "INVITE_UNKNOWN");
23+
break;
24+
case member::Status::invite_not_sent:
25+
obj["memberStatus"] = toJs(env, "INVITE_NOT_SENT");
26+
break;
27+
case member::Status::invite_sending:
28+
obj["memberStatus"] = toJs(env, "INVITE_SENDING");
29+
break;
30+
case member::Status::invite_failed: obj["memberStatus"] = toJs(env, "INVITE_FAILED"); break;
31+
case member::Status::invite_sent: obj["memberStatus"] = toJs(env, "INVITE_SENT"); break;
32+
case member::Status::invite_accepted:
33+
obj["memberStatus"] = toJs(env, "INVITE_ACCEPTED");
34+
break;
35+
36+
// promotion statuses
37+
case member::Status::promotion_unknown:
38+
obj["memberStatus"] = toJs(env, "PROMOTION_UNKNOWN");
39+
break;
40+
case member::Status::promotion_not_sent:
41+
obj["memberStatus"] = toJs(env, "PROMOTION_NOT_SENT");
42+
break;
43+
case member::Status::promotion_sending:
44+
obj["memberStatus"] = toJs(env, "PROMOTION_SENDING");
45+
break;
46+
case member::Status::promotion_failed:
47+
obj["memberStatus"] = toJs(env, "PROMOTION_FAILED");
48+
break;
49+
case member::Status::promotion_sent:
50+
obj["memberStatus"] = toJs(env, "PROMOTION_SENT");
51+
break;
52+
case member::Status::promotion_accepted:
53+
obj["memberStatus"] = toJs(env, "PROMOTION_ACCEPTED");
54+
break;
55+
56+
// removed statuses
57+
case member::Status::removed_unknown:
58+
obj["memberStatus"] = toJs(env, "REMOVED_UNKNOWN");
59+
break;
60+
case member::Status::removed: obj["memberStatus"] = toJs(env, "REMOVED_MEMBER"); break;
61+
case member::Status::removed_including_messages:
62+
obj["memberStatus"] = toJs(env, "REMOVED_MEMBER_AND_MESSAGES");
63+
break;
64+
65+
default: throw std::runtime_error{"Invalid member status got as an enum"};
66+
}
67+
68+
// we display the "crown" on top of the member's avatar when this field is true
69+
obj["nominatedAdmin"] = toJs(env, info.admin);
70+
71+
return obj;
72+
};
73+
1274
MetaGroupWrapper::MetaGroupWrapper(const Napi::CallbackInfo& info) :
1375
meta_group{std::move(MetaBaseWrapper::constructGroupWrapper(info, "MetaGroupWrapper"))},
1476
Napi::ObjectWrap<MetaGroupWrapper>{info} {}
@@ -388,26 +450,28 @@ Napi::Value MetaGroupWrapper::infoDestroy(const Napi::CallbackInfo& info) {
388450

389451
Napi::Value MetaGroupWrapper::memberGetAll(const Napi::CallbackInfo& info) {
390452
return wrapResult(info, [&] {
391-
std::vector<session::config::groups::member> allMembers;
453+
std::vector<Napi::Object> allMembersJs;
392454
for (auto& member : *this->meta_group->members) {
393-
allMembers.push_back(member);
455+
allMembersJs.push_back(
456+
member_to_js(info.Env(), member, meta_group->members->get_status(member)));
394457
}
395-
return allMembers;
458+
return allMembersJs;
396459
});
397460
}
398461

399462
Napi::Value MetaGroupWrapper::memberGetAllPendingRemovals(const Napi::CallbackInfo& info) {
400463
return wrapResult(info, [&] {
401-
std::vector<session::config::groups::member> allMembersRemoved;
464+
std::vector<Napi::Object> allMembersRemovedJs;
402465
for (auto& member : *this->meta_group->members) {
403-
auto memberStatus = member.status();
466+
auto memberStatus = this->meta_group->members->get_status(member);
404467
if (memberStatus == member::Status::removed_unknown ||
405468
memberStatus == member::Status::removed ||
406469
memberStatus == member::Status::removed_including_messages) {
407-
allMembersRemoved.push_back(member);
470+
allMembersRemovedJs.push_back(
471+
member_to_js(info.Env(), member, meta_group->members->get_status(member)));
408472
}
409473
}
410-
return allMembersRemoved;
474+
return allMembersRemovedJs;
411475
});
412476
}
413477

@@ -417,7 +481,11 @@ Napi::Value MetaGroupWrapper::memberGet(const Napi::CallbackInfo& info) {
417481
assertIsString(info[0]);
418482

419483
auto pubkeyHex = toCppString(info[0], "memberGet");
420-
return meta_group->members->get(pubkeyHex);
484+
auto existing = meta_group->members->get(pubkeyHex);
485+
486+
return existing ? member_to_js(
487+
info.Env(), *existing, meta_group->members->get_status(*existing))
488+
: info.Env().Null();
421489
});
422490
}
423491

@@ -427,7 +495,8 @@ Napi::Value MetaGroupWrapper::memberGetOrConstruct(const Napi::CallbackInfo& inf
427495
assertIsString(info[0]);
428496

429497
auto pubkeyHex = toCppString(info[0], "memberGetOrConstruct");
430-
return meta_group->members->get_or_construct(pubkeyHex);
498+
auto created = meta_group->members->get_or_construct(pubkeyHex);
499+
return member_to_js(info.Env(), created, meta_group->members->get_status(created));
431500
});
432501
}
433502

@@ -439,7 +508,7 @@ Napi::Value MetaGroupWrapper::memberConstructAndSet(const Napi::CallbackInfo& in
439508
auto pubkeyHex = toCppString(info[0], "memberConstructAndSet");
440509
auto created = meta_group->members->get_or_construct(pubkeyHex);
441510
meta_group->members->set(created);
442-
return created;
511+
return member_to_js(info.Env(), created, meta_group->members->get_status(created));
443512
});
444513
}
445514

src/groups/meta_group_wrapper.hpp

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -18,68 +18,7 @@ using session::config::NOT_REMOVED;
1818
using session::config::groups::member;
1919
using session::nodeapi::MetaGroup;
2020

21-
template <>
22-
struct toJs_impl<member> {
23-
Napi::Object operator()(const Napi::Env& env, const member& info) {
24-
auto obj = Napi::Object::New(env);
25-
26-
obj["pubkeyHex"] = toJs(env, info.session_id);
27-
obj["name"] = toJs(env, info.name);
28-
obj["profilePicture"] = toJs(env, info.profile_picture);
29-
30-
auto status = info.status();
31-
32-
switch (status) {
33-
// invite statuses
34-
case member::Status::invite_unknown:
35-
obj["memberStatus"] = toJs(env, "INVITE_UNKNOWN");
36-
break;
37-
case member::Status::invite_not_sent:
38-
obj["memberStatus"] = toJs(env, "INVITE_NOT_SENT");
39-
break;
40-
case member::Status::invite_failed:
41-
obj["memberStatus"] = toJs(env, "INVITE_FAILED");
42-
break;
43-
case member::Status::invite_sent: obj["memberStatus"] = toJs(env, "INVITE_SENT"); break;
44-
case member::Status::invite_accepted:
45-
obj["memberStatus"] = toJs(env, "INVITE_ACCEPTED");
46-
break;
47-
48-
// promotion statuses
49-
case member::Status::promotion_unknown:
50-
obj["memberStatus"] = toJs(env, "PROMOTION_UNKNOWN");
51-
break;
52-
case member::Status::promotion_not_sent:
53-
obj["memberStatus"] = toJs(env, "PROMOTION_NOT_SENT");
54-
break;
55-
case member::Status::promotion_failed:
56-
obj["memberStatus"] = toJs(env, "PROMOTION_FAILED");
57-
break;
58-
case member::Status::promotion_sent:
59-
obj["memberStatus"] = toJs(env, "PROMOTION_SENT");
60-
break;
61-
case member::Status::promotion_accepted:
62-
obj["memberStatus"] = toJs(env, "PROMOTION_ACCEPTED");
63-
break;
64-
65-
// removed statuses
66-
case member::Status::removed_unknown:
67-
obj["memberStatus"] = toJs(env, "REMOVED_UNKNOWN");
68-
break;
69-
case member::Status::removed: obj["memberStatus"] = toJs(env, "REMOVED_MEMBER"); break;
70-
case member::Status::removed_including_messages:
71-
obj["memberStatus"] = toJs(env, "REMOVED_MEMBER_AND_MESSAGES");
72-
break;
73-
74-
default: throw std::runtime_error{"Invalid member status got as an enum"};
75-
}
76-
77-
// we display the "crown" on top of the member's avatar when this field is true
78-
obj["nominatedAdmin"] = toJs(env, info.admin);
79-
80-
return obj;
81-
}
82-
};
21+
Napi::Object member_to_js(const Napi::Env& env, const member& info, const member::Status& status);
8322

8423
template <>
8524
struct toJs_impl<Keys::swarm_auth> {

types/groups/groupmembers.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ declare module 'libsession_util_nodejs' {
1717
*
1818
* **Invite statuses**
1919
* - INVITE_UNKNOWN: fallback invite case
20+
* - INVITE_SENDING : when we are actively sending the invite (not synced)
2021
* - INVITE_NOT_SENT: as soon as we've scheduled that member to be invited, but before we've tried sending the invite message
2122
* - INVITE_FAILED: we know the invite failed to be sent to the member
2223
* - INVITE_SENT: we know the invite has been sent to the member
2324
* - INVITE_ACCEPTED: regular member
2425
*
2526
* **Promotion statuses**
2627
* - PROMOTION_UNKNOWN: promotion fallback case
28+
* - PROMOTION_SENDING : when we are actively sending the promotion (not synced)
2729
* - PROMOTION_NOT_SENT: as soon as we've scheduled that guy to be an admin, but before we've tried sending the promotion message
2830
* - PROMOTION_FAILED: we know the promotion failed to be sent to the member
2931
* - PROMOTION_SENT: we know the promotion message was sent to the member
@@ -36,11 +38,13 @@ declare module 'libsession_util_nodejs' {
3638
*/
3739
type MemberStateGroupV2 =
3840
| 'INVITE_UNKNOWN'
41+
| 'INVITE_SENDING'
3942
| 'INVITE_NOT_SENT'
4043
| 'INVITE_FAILED'
4144
| 'INVITE_SENT'
4245
| 'INVITE_ACCEPTED'
4346
| 'PROMOTION_UNKNOWN'
47+
| 'PROMOTION_SENDING'
4448
| 'PROMOTION_NOT_SENT'
4549
| 'PROMOTION_FAILED'
4650
| 'PROMOTION_SENT'

0 commit comments

Comments
 (0)