gun-eth 1.3.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +18 -207
- package/dist/gun-eth-protocol.cjs.js +11528 -0
- package/dist/gun-eth-protocol.esm.js +11503 -0
- package/dist/gun-eth-protocol.js +18 -0
- package/dist/gun-eth-protocol.react.js +11503 -0
- package/dist/gun-eth-protocol.umd.js +18 -0
- package/jsdoc.json +7 -0
- package/package.json +28 -25
- package/rollup.config.js +80 -0
- package/src/index.js +160 -512
- package/src/lib/authentication/index.js +13 -0
- package/src/lib/authentication/isAuthenticated.js +20 -0
- package/src/lib/authentication/login.js +25 -0
- package/src/lib/authentication/register.js +58 -0
- package/src/lib/blockchain/ethereum.js +74 -0
- package/src/lib/blockchain/shine.js +204 -0
- package/src/lib/certificates/friendsCertificates.js +92 -0
- package/src/lib/certificates/index.js +44 -0
- package/src/lib/certificates/messagingCertificates.js +94 -0
- package/src/lib/friends/acceptFriendRequest.js +69 -0
- package/src/lib/friends/addFriendRequest.js +49 -0
- package/src/lib/friends/friendRequests.js +51 -0
- package/src/lib/friends/friendsList.js +57 -0
- package/src/lib/friends/index.js +36 -0
- package/src/lib/friends/rejectFriendRequest.js +31 -0
- package/src/lib/messaging/chatsList.js +42 -0
- package/src/lib/messaging/createChat.js +132 -0
- package/src/lib/messaging/index.js +36 -0
- package/src/lib/messaging/messageList.js +106 -0
- package/src/lib/messaging/sendMessage.js +132 -0
- package/src/lib/messaging/sendVoiceMessage.js +119 -0
- package/src/lib/notes/createNote.js +41 -0
- package/src/lib/notes/deleteNote.js +12 -0
- package/src/lib/notes/getNote.js +25 -0
- package/src/lib/notes/getUserNote.js +59 -0
- package/src/lib/notes/index.js +8 -0
- package/src/lib/notes/updateNotes.js +35 -0
- package/src/lib/post/createPost.js +17 -0
- package/src/lib/post/decryptPost.js +14 -0
- package/src/lib/post/deletePost.js +13 -0
- package/src/lib/post/encryptPost,js +16 -0
- package/src/lib/post/getPost.js +36 -0
- package/src/lib/post/index.js +9 -0
- package/src/lib/post/updatePost.js +16 -0
- package/src/state/gun.js +33 -0
- package/types/types.d.ts +244 -0
- package/TUTORIAL.md +0 -103
- package/src/examples/eth2gun.html +0 -163
- package/src/examples/gun2eth.html +0 -164
- package/src/examples/shine.html +0 -256
- /package/src/{abis → lib/blockchain/abis}/SHINE.json +0 -0
- /package/src/{contracts → lib/blockchain/contracts}/SHINE.sol +0 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
import { gun, user } from "../../state/gun";
|
2
|
+
import { generateAddFriendCertificate } from "../certificates";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Invia una richiesta di amicizia a un utente specifico.
|
6
|
+
*
|
7
|
+
* @async
|
8
|
+
* @param {string} publicKey - La chiave pubblica dell'utente a cui inviare la richiesta di amicizia.
|
9
|
+
* @param {Function} [callback] - Funzione di callback opzionale chiamata al completamento dell'operazione.
|
10
|
+
* @returns {Promise<void>}
|
11
|
+
*/
|
12
|
+
let addFriendRequest = async (publicKey, callback = () => {}) => {
|
13
|
+
let addFriendRequestCertificate = await gun
|
14
|
+
.user(publicKey)
|
15
|
+
.get("certificates")
|
16
|
+
.get("friendRequests");
|
17
|
+
|
18
|
+
gun
|
19
|
+
.user(publicKey)
|
20
|
+
.get("friendRequests")
|
21
|
+
.set(
|
22
|
+
user.is.pub,
|
23
|
+
({ err }) => {
|
24
|
+
if (err)
|
25
|
+
return callback({
|
26
|
+
errMessage: err,
|
27
|
+
errCode: "friend-request-error",
|
28
|
+
success: undefined,
|
29
|
+
});
|
30
|
+
else {
|
31
|
+
generateAddFriendCertificate(
|
32
|
+
publicKey,
|
33
|
+
({ errMessage, errCode, success }) => {
|
34
|
+
if (errMessage) return callback({ errMessage, errCode, success });
|
35
|
+
else
|
36
|
+
return callback({
|
37
|
+
errMessage: undefined,
|
38
|
+
errCode: undefined,
|
39
|
+
success: "Friend request sent successfully.",
|
40
|
+
});
|
41
|
+
}
|
42
|
+
);
|
43
|
+
}
|
44
|
+
},
|
45
|
+
{ opt: { cert: addFriendRequestCertificate } }
|
46
|
+
);
|
47
|
+
};
|
48
|
+
|
49
|
+
export default addFriendRequest;
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { Observable } from "rxjs";
|
2
|
+
import { gun } from "../../state/gun";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Observable che gestisce le richieste di amicizia dell'utente corrente.
|
6
|
+
*
|
7
|
+
* @type {Observable}
|
8
|
+
* @description Questo Observable emette oggetti contenenti informazioni sulle richieste di amicizia.
|
9
|
+
* Ogni oggetto emesso può avere le seguenti proprietà:
|
10
|
+
* - key: La chiave della richiesta di amicizia
|
11
|
+
* - pub: La chiave pubblica dell'utente che ha inviato la richiesta
|
12
|
+
* - alias: L'alias dell'utente che ha inviato la richiesta
|
13
|
+
* - displayName: Il nome visualizzato dell'utente (se disponibile)
|
14
|
+
* - about: Informazioni aggiuntive sull'utente (se disponibili)
|
15
|
+
*
|
16
|
+
* Se non ci sono richieste di amicizia, l'Observable emetterà `undefined`.
|
17
|
+
*/
|
18
|
+
let friendRequests = new Observable((subscriber) => {
|
19
|
+
gun
|
20
|
+
.user()
|
21
|
+
.get("friendRequests")
|
22
|
+
.map(
|
23
|
+
(publicKey, key) => {
|
24
|
+
if (publicKey) {
|
25
|
+
gun.user(publicKey).once((_user) => {
|
26
|
+
if (_user && _user.info && _user.pub && _user.alias) {
|
27
|
+
gun.get(_user.info["#"]).on((data) => {
|
28
|
+
subscriber.next({
|
29
|
+
key,
|
30
|
+
pub: _user.pub,
|
31
|
+
alias: _user.alias,
|
32
|
+
displayName: data.displayName,
|
33
|
+
about: data.about || undefined,
|
34
|
+
});
|
35
|
+
});
|
36
|
+
} else if (_user && _user.pub && _user.alias) {
|
37
|
+
subscriber.next({
|
38
|
+
key,
|
39
|
+
pub: _user.pub,
|
40
|
+
alias: _user.alias,
|
41
|
+
});
|
42
|
+
}
|
43
|
+
});
|
44
|
+
} else {
|
45
|
+
subscriber.next(undefined);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
);
|
49
|
+
});
|
50
|
+
|
51
|
+
export default friendRequests;
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import { Observable } from "rxjs";
|
2
|
+
import { gun } from "../../state/gun";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Modulo per la gestione della lista degli amici.
|
6
|
+
* @module friendsList
|
7
|
+
*/
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Observable che gestisce la lista degli amici dell'utente corrente.
|
11
|
+
*
|
12
|
+
* @type {Observable}
|
13
|
+
* @description Questo Observable emette oggetti contenenti informazioni sugli amici dell'utente.
|
14
|
+
* Ogni oggetto emesso può avere le seguenti proprietà:
|
15
|
+
* - key: La chiave dell'amico
|
16
|
+
* - pub: La chiave pubblica dell'amico
|
17
|
+
* - alias: L'alias dell'amico
|
18
|
+
* - displayName: Il nome visualizzato dell'amico (se disponibile)
|
19
|
+
* - about: Informazioni aggiuntive sull'amico (se disponibili)
|
20
|
+
*
|
21
|
+
* Se non ci sono amici nella lista, l'Observable emetterà `undefined`.
|
22
|
+
*/
|
23
|
+
|
24
|
+
let friendsList = new Observable((subscriber) => {
|
25
|
+
gun
|
26
|
+
.user()
|
27
|
+
.get("friends")
|
28
|
+
.map(
|
29
|
+
(publicKey, key) => {
|
30
|
+
if (publicKey) {
|
31
|
+
gun.user(publicKey).once((_user) => {
|
32
|
+
if (_user && _user.info && _user.pub && _user.alias) {
|
33
|
+
gun.get(_user.info["#"]).on((data) => {
|
34
|
+
subscriber.next({
|
35
|
+
key,
|
36
|
+
pub: _user.pub,
|
37
|
+
alias: _user.alias,
|
38
|
+
displayName: data.displayName,
|
39
|
+
about: data.about || undefined,
|
40
|
+
});
|
41
|
+
});
|
42
|
+
} else if (_user && _user.pub && _user.alias) {
|
43
|
+
subscriber.next({
|
44
|
+
key,
|
45
|
+
pub: _user.pub,
|
46
|
+
alias: _user.alias,
|
47
|
+
});
|
48
|
+
}
|
49
|
+
});
|
50
|
+
} else {
|
51
|
+
subscriber.next(undefined);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
);
|
55
|
+
});
|
56
|
+
|
57
|
+
export default friendsList;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/**
|
2
|
+
* Modulo per la gestione delle amicizie
|
3
|
+
* @module friends
|
4
|
+
*/
|
5
|
+
|
6
|
+
import acceptFriendRequest from "./acceptFriendRequest";
|
7
|
+
import addFriendRequest from "./addFriendRequest";
|
8
|
+
import friendRequests from "./friendRequests";
|
9
|
+
import rejectFriendRequest from "./rejectFriendRequest";
|
10
|
+
import friendsList from "./friendsList";
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Funzioni esportate per la gestione delle amicizie
|
14
|
+
*/
|
15
|
+
export {
|
16
|
+
/**
|
17
|
+
* Aggiunge una richiesta di amicizia
|
18
|
+
*/
|
19
|
+
addFriendRequest,
|
20
|
+
/**
|
21
|
+
* Accetta una richiesta di amicizia
|
22
|
+
*/
|
23
|
+
acceptFriendRequest,
|
24
|
+
/**
|
25
|
+
* Rifiuta una richiesta di amicizia
|
26
|
+
*/
|
27
|
+
rejectFriendRequest,
|
28
|
+
/**
|
29
|
+
* Ottiene l'elenco delle richieste di amicizia
|
30
|
+
*/
|
31
|
+
friendRequests,
|
32
|
+
/**
|
33
|
+
* Ottiene l'elenco degli amici
|
34
|
+
*/
|
35
|
+
friendsList
|
36
|
+
};
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { gun } from "../../state/gun";
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Rifiuta una richiesta di amicizia.
|
5
|
+
*
|
6
|
+
* @param {string} key - La chiave della richiesta di amicizia da rifiutare.
|
7
|
+
* @param {Function} [callback] - Funzione di callback opzionale chiamata al completamento dell'operazione.
|
8
|
+
* @returns {void}
|
9
|
+
*/
|
10
|
+
let rejectFriendRequest = (key, callback = () => {}) => {
|
11
|
+
gun
|
12
|
+
.user()
|
13
|
+
.get("friendRequests")
|
14
|
+
.get(key)
|
15
|
+
.put(null, async ({ err }) => {
|
16
|
+
if (err)
|
17
|
+
return callback({
|
18
|
+
errMessage: err,
|
19
|
+
errCode: "reject-friend-request-failed",
|
20
|
+
success: undefined,
|
21
|
+
});
|
22
|
+
else
|
23
|
+
return callback({
|
24
|
+
errMessage: undefined,
|
25
|
+
errCode: undefined,
|
26
|
+
success: "Friend request removed successfully.",
|
27
|
+
});
|
28
|
+
});
|
29
|
+
};
|
30
|
+
|
31
|
+
export default rejectFriendRequest;
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { Observable } from "rxjs";
|
2
|
+
import { gun } from "../../state/gun";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Observable che fornisce una lista di chat aggiornata in tempo reale.
|
6
|
+
*
|
7
|
+
* @type {Observable}
|
8
|
+
* @description Questo Observable si sottoscrive ai cambiamenti nella lista delle chat dell'utente
|
9
|
+
* e emette un nuovo oggetto per ogni chat aggiornata. Ogni oggetto chat contiene:
|
10
|
+
* - roomId: l'identificatore univoco della stanza di chat
|
11
|
+
* - pub: la chiave pubblica associata alla chat
|
12
|
+
* - latestMessage: l'ultimo messaggio nella chat
|
13
|
+
*
|
14
|
+
* @example
|
15
|
+
* chatsList.subscribe(chat => {
|
16
|
+
* console.log('Chat aggiornata:', chat);
|
17
|
+
* });
|
18
|
+
*/
|
19
|
+
let chatsList = new Observable((subscriber) => {
|
20
|
+
gun
|
21
|
+
.user()
|
22
|
+
.get("chats")
|
23
|
+
.on((chats, _) => {
|
24
|
+
for (let publicKey in chats) {
|
25
|
+
try {
|
26
|
+
let chatDetails = JSON.parse(chats[publicKey]);
|
27
|
+
|
28
|
+
if (chatDetails) {
|
29
|
+
subscriber.next({
|
30
|
+
roomId: chatDetails.roomId,
|
31
|
+
pub: chatDetails.pub,
|
32
|
+
latestMessage: chatDetails.latestMessage,
|
33
|
+
});
|
34
|
+
}
|
35
|
+
} catch (err) {
|
36
|
+
// Gestione silenziosa degli errori di parsing
|
37
|
+
}
|
38
|
+
}
|
39
|
+
});
|
40
|
+
});
|
41
|
+
|
42
|
+
export default chatsList;
|
@@ -0,0 +1,132 @@
|
|
1
|
+
/**
|
2
|
+
* Modulo per la creazione di una nuova chat.
|
3
|
+
* @module createChat
|
4
|
+
*/
|
5
|
+
|
6
|
+
import { v4 } from "uuid";
|
7
|
+
import { gun } from "../../state/gun";
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Crea una nuova chat con un utente specificato.
|
11
|
+
*
|
12
|
+
* @async
|
13
|
+
* @function createChat
|
14
|
+
* @param {string} publicKey - La chiave pubblica dell'utente con cui creare la chat.
|
15
|
+
* @param {Function} [callback] - Funzione di callback opzionale chiamata al completamento dell'operazione.
|
16
|
+
* @returns {Promise<void>}
|
17
|
+
*
|
18
|
+
* @description
|
19
|
+
* Questa funzione crea una nuova chat tra l'utente corrente e un altro utente specificato dalla sua chiave pubblica.
|
20
|
+
* Verifica prima se la chat esiste già, poi controlla i certificati necessari e infine crea la chat per entrambi gli utenti.
|
21
|
+
*
|
22
|
+
* @example
|
23
|
+
* createChat("chiavePubblicaUtente", (result) => {
|
24
|
+
* if (result.success) {
|
25
|
+
* console.log("Chat creata:", result.chat);
|
26
|
+
* } else {
|
27
|
+
* console.error("Errore:", result.errMessage);
|
28
|
+
* }
|
29
|
+
* });
|
30
|
+
*/
|
31
|
+
let createChat = async (publicKey, callback = () => {}) => {
|
32
|
+
gun
|
33
|
+
.user()
|
34
|
+
.get("chats")
|
35
|
+
.get(publicKey)
|
36
|
+
.once(async (chatExists) => {
|
37
|
+
if (chatExists) {
|
38
|
+
return callback({
|
39
|
+
errMessage: "The chat already exists. Opening it now.",
|
40
|
+
errCode: "chat-already-exists",
|
41
|
+
chat: JSON.parse(chatExists),
|
42
|
+
success: undefined,
|
43
|
+
});
|
44
|
+
}
|
45
|
+
|
46
|
+
let friend = await gun.user(publicKey).once();
|
47
|
+
|
48
|
+
let userPub = await gun.user().pair().pub;
|
49
|
+
|
50
|
+
if (!userPub)
|
51
|
+
return callback({
|
52
|
+
errMessage: "Could not find pub.",
|
53
|
+
errCode: "failed-to-find-pub",
|
54
|
+
success: undefined,
|
55
|
+
});
|
56
|
+
|
57
|
+
if (!friend)
|
58
|
+
return callback({
|
59
|
+
errMessage: "Could not find friend.",
|
60
|
+
errCode: "failed-to-find-friend",
|
61
|
+
success: undefined,
|
62
|
+
});
|
63
|
+
|
64
|
+
let createChatsCertificate = await gun
|
65
|
+
.user(publicKey)
|
66
|
+
.get("certificates")
|
67
|
+
.get(userPub)
|
68
|
+
.get("chats");
|
69
|
+
|
70
|
+
if (!createChatsCertificate)
|
71
|
+
return callback({
|
72
|
+
errMessage: "Could not find friend certificate to create chat",
|
73
|
+
errCode: "failed-to-find-friend-chats-certificate",
|
74
|
+
success: undefined,
|
75
|
+
});
|
76
|
+
|
77
|
+
let roomId = v4();
|
78
|
+
|
79
|
+
gun
|
80
|
+
.user(publicKey)
|
81
|
+
.get("chats")
|
82
|
+
.get(userPub)
|
83
|
+
.put(
|
84
|
+
JSON.stringify({
|
85
|
+
pub: userPub,
|
86
|
+
roomId,
|
87
|
+
latestMessage: {},
|
88
|
+
}),
|
89
|
+
({ err }) => {
|
90
|
+
if (err)
|
91
|
+
return callback({
|
92
|
+
errMessage: err,
|
93
|
+
errCode: "chat-creation-error",
|
94
|
+
success: undefined,
|
95
|
+
});
|
96
|
+
else
|
97
|
+
gun
|
98
|
+
.user()
|
99
|
+
.get("chats")
|
100
|
+
.get(publicKey)
|
101
|
+
.put(
|
102
|
+
JSON.stringify({
|
103
|
+
pub: friend.pub,
|
104
|
+
roomId,
|
105
|
+
latestMessage: {},
|
106
|
+
}),
|
107
|
+
({ err }) => {
|
108
|
+
if (err)
|
109
|
+
return callback({
|
110
|
+
errMessage: err,
|
111
|
+
errCode: "chat-creation-error",
|
112
|
+
success: undefined,
|
113
|
+
});
|
114
|
+
else
|
115
|
+
return callback({
|
116
|
+
errMessage: undefined,
|
117
|
+
errCode: undefined,
|
118
|
+
chat: {
|
119
|
+
pub: friend.pub,
|
120
|
+
roomId,
|
121
|
+
},
|
122
|
+
success: "Created a chat with friend.",
|
123
|
+
});
|
124
|
+
}
|
125
|
+
);
|
126
|
+
},
|
127
|
+
{ opt: { cert: createChatsCertificate } }
|
128
|
+
);
|
129
|
+
});
|
130
|
+
};
|
131
|
+
|
132
|
+
export default createChat;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/**
|
2
|
+
* Modulo per la gestione dei messaggi e delle chat
|
3
|
+
* @module messaging
|
4
|
+
*/
|
5
|
+
|
6
|
+
import chatsList from "./chatsList";
|
7
|
+
import createChat from "./createChat";
|
8
|
+
import messageList from "./messageList";
|
9
|
+
import sendMessage from "./sendMessage";
|
10
|
+
import sendVoiceMessage from "./sendVoiceMessage";
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Funzioni esportate per la gestione dei messaggi e delle chat
|
14
|
+
*/
|
15
|
+
export {
|
16
|
+
/**
|
17
|
+
* Crea una nuova chat
|
18
|
+
*/
|
19
|
+
createChat,
|
20
|
+
/**
|
21
|
+
* Ottiene la lista delle chat
|
22
|
+
*/
|
23
|
+
chatsList,
|
24
|
+
/**
|
25
|
+
* Ottiene la lista dei messaggi di una chat
|
26
|
+
*/
|
27
|
+
messageList,
|
28
|
+
/**
|
29
|
+
* Invia un messaggio di testo
|
30
|
+
*/
|
31
|
+
sendMessage,
|
32
|
+
/**
|
33
|
+
* Invia un messaggio vocale
|
34
|
+
*/
|
35
|
+
sendVoiceMessage
|
36
|
+
};
|
@@ -0,0 +1,106 @@
|
|
1
|
+
import { Observable } from "rxjs";
|
2
|
+
import { gun } from "../../state/gun";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Crea un Observable che fornisce una lista di messaggi per una specifica chat.
|
6
|
+
*
|
7
|
+
* @function messageList
|
8
|
+
* @param {string} roomId - L'identificatore univoco della stanza di chat.
|
9
|
+
* @param {string} pub - La chiave pubblica dell'altro utente nella chat.
|
10
|
+
* @returns {Observable} Un Observable che emette oggetti contenenti messaggi iniziali e individuali.
|
11
|
+
*
|
12
|
+
* @description
|
13
|
+
* Questa funzione crea un Observable che si sottoscrive ai messaggi di una specifica chat.
|
14
|
+
* Decripta i messaggi utilizzando la chiave pubblica dell'altro utente e emette sia un array iniziale
|
15
|
+
* di messaggi che singoli messaggi man mano che vengono ricevuti.
|
16
|
+
*
|
17
|
+
* @example
|
18
|
+
* const messages$ = messageList('room123', 'publicKey123');
|
19
|
+
* messages$.subscribe(({ initial, individual }) => {
|
20
|
+
* if (initial) {
|
21
|
+
* console.log('Messaggi iniziali:', initial);
|
22
|
+
* } else if (individual) {
|
23
|
+
* console.log('Nuovo messaggio:', individual);
|
24
|
+
* }
|
25
|
+
* });
|
26
|
+
*/
|
27
|
+
let messageList = (roomId, pub) =>
|
28
|
+
new Observable(async (subscriber) => {
|
29
|
+
let userPair = await gun.user()._.sea;
|
30
|
+
let friend = await gun.user(pub);
|
31
|
+
|
32
|
+
gun
|
33
|
+
.user()
|
34
|
+
.get("messages")
|
35
|
+
.get(roomId)
|
36
|
+
.once((messages) => {
|
37
|
+
(async () => {
|
38
|
+
let initial = [];
|
39
|
+
|
40
|
+
for (let key in messages) {
|
41
|
+
let message = messages[key].toString();
|
42
|
+
|
43
|
+
let decryptSecretFriend = await SEA.secret(friend.epub, userPair);
|
44
|
+
let decryptedMessageFriend = await SEA.decrypt(
|
45
|
+
message,
|
46
|
+
decryptSecretFriend
|
47
|
+
);
|
48
|
+
|
49
|
+
if (decryptedMessageFriend) {
|
50
|
+
let individual = {
|
51
|
+
...decryptedMessageFriend,
|
52
|
+
encrypted: true,
|
53
|
+
};
|
54
|
+
|
55
|
+
let exists =
|
56
|
+
initial.filter((current) => current.id === individual.id)[0] !==
|
57
|
+
undefined;
|
58
|
+
|
59
|
+
console.log(exists);
|
60
|
+
|
61
|
+
if (!exists) initial.push(individual);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
subscriber.next({ initial, individual: undefined });
|
66
|
+
|
67
|
+
gun
|
68
|
+
.user()
|
69
|
+
.get("messages")
|
70
|
+
.get(roomId)
|
71
|
+
.map()
|
72
|
+
.once(async (message) => {
|
73
|
+
if (message.toString().startsWith("SEA")) {
|
74
|
+
let decryptSecretFriend = await SEA.secret(
|
75
|
+
friend.epub,
|
76
|
+
userPair
|
77
|
+
);
|
78
|
+
let decryptedMessageFriend = await SEA.decrypt(
|
79
|
+
message,
|
80
|
+
decryptSecretFriend
|
81
|
+
);
|
82
|
+
|
83
|
+
if (decryptedMessageFriend) {
|
84
|
+
let individual = {
|
85
|
+
...decryptedMessageFriend,
|
86
|
+
encrypted: true,
|
87
|
+
};
|
88
|
+
|
89
|
+
let exists =
|
90
|
+
initial.filter(
|
91
|
+
(current) => current.id === individual.id
|
92
|
+
)[0] !== undefined;
|
93
|
+
|
94
|
+
if (!exists)
|
95
|
+
return subscriber.next({
|
96
|
+
initial: undefined,
|
97
|
+
individual,
|
98
|
+
});
|
99
|
+
}
|
100
|
+
}
|
101
|
+
});
|
102
|
+
})();
|
103
|
+
});
|
104
|
+
});
|
105
|
+
|
106
|
+
export default messageList;
|
@@ -0,0 +1,132 @@
|
|
1
|
+
/**
|
2
|
+
* Invia un messaggio crittografato a un amico.
|
3
|
+
*
|
4
|
+
* @param {string} roomId - L'ID della stanza di chat.
|
5
|
+
* @param {string} publicKey - La chiave pubblica del destinatario.
|
6
|
+
* @param {string} message - Il contenuto del messaggio da inviare.
|
7
|
+
* @param {function} callback - Funzione di callback chiamata al completamento dell'operazione.
|
8
|
+
* @returns {void}
|
9
|
+
*/
|
10
|
+
import { SEA } from "gun";
|
11
|
+
import { v4 } from "uuid";
|
12
|
+
import { gun } from "../../state/gun";
|
13
|
+
|
14
|
+
let sendMessage = (roomId, publicKey, message, callback = () => {}) => {
|
15
|
+
(async (callback = () => {}) => {
|
16
|
+
// Ottiene la chiave pubblica e la coppia di chiavi dell'utente corrente
|
17
|
+
let userPub = await gun.user().pair().pub;
|
18
|
+
let userPair = await gun.user()._.sea;
|
19
|
+
let friend = await gun.user(publicKey);
|
20
|
+
|
21
|
+
// Verifica se la chiave pubblica dell'utente è disponibile
|
22
|
+
if (!userPub)
|
23
|
+
return callback({
|
24
|
+
errMessage: "Impossibile trovare la chiave pubblica.",
|
25
|
+
errCode: "failed-to-find-pub",
|
26
|
+
success: undefined,
|
27
|
+
});
|
28
|
+
|
29
|
+
// Ottiene il certificato per creare messaggi
|
30
|
+
let createMessagesCertificate = await gun
|
31
|
+
.user(publicKey)
|
32
|
+
.get("certificates")
|
33
|
+
.get(userPub)
|
34
|
+
.get("messages");
|
35
|
+
|
36
|
+
// Verifica se il certificato per creare messaggi è disponibile
|
37
|
+
if (!createMessagesCertificate)
|
38
|
+
return callback({
|
39
|
+
errMessage: "Impossibile trovare il certificato dell'amico per creare il messaggio",
|
40
|
+
errCode: "failed-to-find-friend-messages-certificate",
|
41
|
+
success: undefined,
|
42
|
+
});
|
43
|
+
|
44
|
+
// Ottiene il certificato per aggiornare i metadati della chat
|
45
|
+
let updateMetaCertificate = await gun
|
46
|
+
.user(publicKey)
|
47
|
+
.get("certificates")
|
48
|
+
.get(userPub)
|
49
|
+
.get("chats");
|
50
|
+
|
51
|
+
// Verifica se il certificato per aggiornare i metadati della chat è disponibile
|
52
|
+
if (!updateMetaCertificate)
|
53
|
+
return callback({
|
54
|
+
errMessage: "Impossibile trovare il certificato dell'amico per aggiungere metadati alla chat",
|
55
|
+
errCode: "failed-to-find-friend-chats-certificate",
|
56
|
+
success: undefined,
|
57
|
+
});
|
58
|
+
|
59
|
+
// Genera un ID univoco per il messaggio e ottiene il timestamp corrente
|
60
|
+
let messageId = v4();
|
61
|
+
let timeSent = Date.now();
|
62
|
+
|
63
|
+
// Crea un segreto condiviso e crittografa il messaggio
|
64
|
+
let secret = await SEA.secret(friend.epub, userPair);
|
65
|
+
let encryptedMessage = await SEA.encrypt(
|
66
|
+
JSON.stringify({
|
67
|
+
id: messageId,
|
68
|
+
content: message,
|
69
|
+
timeSent,
|
70
|
+
sender: userPub,
|
71
|
+
type: "text",
|
72
|
+
}),
|
73
|
+
secret
|
74
|
+
);
|
75
|
+
|
76
|
+
// Aggiorna l'ultimo messaggio nella chat dell'utente corrente
|
77
|
+
gun
|
78
|
+
.user()
|
79
|
+
.get("chats")
|
80
|
+
.get(roomId)
|
81
|
+
.get("latestMessage")
|
82
|
+
.put(encryptedMessage);
|
83
|
+
|
84
|
+
// Aggiorna l'ultimo messaggio nella chat dell'amico
|
85
|
+
gun
|
86
|
+
.user(publicKey)
|
87
|
+
.get("chats")
|
88
|
+
.get(roomId)
|
89
|
+
.get("latestMessage")
|
90
|
+
.put(encryptedMessage, null, { opt: { cert: updateMetaCertificate } });
|
91
|
+
|
92
|
+
// Salva il messaggio crittografato per l'utente corrente
|
93
|
+
gun
|
94
|
+
.user()
|
95
|
+
.get("messages")
|
96
|
+
.get(roomId)
|
97
|
+
.set(encryptedMessage, ({ err }) => {
|
98
|
+
if (err)
|
99
|
+
return callback({
|
100
|
+
errMessage: err,
|
101
|
+
errCode: "message-creation-error",
|
102
|
+
success: undefined,
|
103
|
+
});
|
104
|
+
else
|
105
|
+
// Salva il messaggio crittografato per l'amico
|
106
|
+
gun
|
107
|
+
.user(publicKey)
|
108
|
+
.get("messages")
|
109
|
+
.get(roomId)
|
110
|
+
.set(
|
111
|
+
encryptedMessage,
|
112
|
+
({ err }) => {
|
113
|
+
if (err)
|
114
|
+
return callback({
|
115
|
+
errMessage: err,
|
116
|
+
errCode: "message-creation-error",
|
117
|
+
success: undefined,
|
118
|
+
});
|
119
|
+
else
|
120
|
+
return callback({
|
121
|
+
errMessage: undefined,
|
122
|
+
errCode: undefined,
|
123
|
+
success: "Messaggio creato con successo con l'amico.",
|
124
|
+
});
|
125
|
+
},
|
126
|
+
{ opt: { cert: createMessagesCertificate } }
|
127
|
+
);
|
128
|
+
});
|
129
|
+
})(callback);
|
130
|
+
};
|
131
|
+
|
132
|
+
export default sendMessage;
|