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.
Files changed (52) hide show
  1. package/README.md +18 -207
  2. package/dist/gun-eth-protocol.cjs.js +11528 -0
  3. package/dist/gun-eth-protocol.esm.js +11503 -0
  4. package/dist/gun-eth-protocol.js +18 -0
  5. package/dist/gun-eth-protocol.react.js +11503 -0
  6. package/dist/gun-eth-protocol.umd.js +18 -0
  7. package/jsdoc.json +7 -0
  8. package/package.json +28 -25
  9. package/rollup.config.js +80 -0
  10. package/src/index.js +160 -512
  11. package/src/lib/authentication/index.js +13 -0
  12. package/src/lib/authentication/isAuthenticated.js +20 -0
  13. package/src/lib/authentication/login.js +25 -0
  14. package/src/lib/authentication/register.js +58 -0
  15. package/src/lib/blockchain/ethereum.js +74 -0
  16. package/src/lib/blockchain/shine.js +204 -0
  17. package/src/lib/certificates/friendsCertificates.js +92 -0
  18. package/src/lib/certificates/index.js +44 -0
  19. package/src/lib/certificates/messagingCertificates.js +94 -0
  20. package/src/lib/friends/acceptFriendRequest.js +69 -0
  21. package/src/lib/friends/addFriendRequest.js +49 -0
  22. package/src/lib/friends/friendRequests.js +51 -0
  23. package/src/lib/friends/friendsList.js +57 -0
  24. package/src/lib/friends/index.js +36 -0
  25. package/src/lib/friends/rejectFriendRequest.js +31 -0
  26. package/src/lib/messaging/chatsList.js +42 -0
  27. package/src/lib/messaging/createChat.js +132 -0
  28. package/src/lib/messaging/index.js +36 -0
  29. package/src/lib/messaging/messageList.js +106 -0
  30. package/src/lib/messaging/sendMessage.js +132 -0
  31. package/src/lib/messaging/sendVoiceMessage.js +119 -0
  32. package/src/lib/notes/createNote.js +41 -0
  33. package/src/lib/notes/deleteNote.js +12 -0
  34. package/src/lib/notes/getNote.js +25 -0
  35. package/src/lib/notes/getUserNote.js +59 -0
  36. package/src/lib/notes/index.js +8 -0
  37. package/src/lib/notes/updateNotes.js +35 -0
  38. package/src/lib/post/createPost.js +17 -0
  39. package/src/lib/post/decryptPost.js +14 -0
  40. package/src/lib/post/deletePost.js +13 -0
  41. package/src/lib/post/encryptPost,js +16 -0
  42. package/src/lib/post/getPost.js +36 -0
  43. package/src/lib/post/index.js +9 -0
  44. package/src/lib/post/updatePost.js +16 -0
  45. package/src/state/gun.js +33 -0
  46. package/types/types.d.ts +244 -0
  47. package/TUTORIAL.md +0 -103
  48. package/src/examples/eth2gun.html +0 -163
  49. package/src/examples/gun2eth.html +0 -164
  50. package/src/examples/shine.html +0 -256
  51. /package/src/{abis → lib/blockchain/abis}/SHINE.json +0 -0
  52. /package/src/{contracts → lib/blockchain/contracts}/SHINE.sol +0 -0
@@ -0,0 +1,13 @@
1
+ import { gun } from "../../state/gun";
2
+ import { checkAuth, isAuthenticated } from "./isAuthenticated";
3
+ import loginUser from "./login";
4
+ import registerUser from "./register";
5
+
6
+ let logout = () => {
7
+ gun.user().leave();
8
+
9
+ isAuthenticated.next(false);
10
+ };
11
+
12
+ export { checkAuth, isAuthenticated, loginUser, registerUser, logout };
13
+
@@ -0,0 +1,20 @@
1
+ import { Subject } from "rxjs";
2
+ import { gun, user } from "../../state/gun";
3
+
4
+ /**
5
+ * This contains a subscribable function that will return a boolean of whether or not the user is authenticated or not.
6
+ */
7
+ let isAuthenticated = new Subject();
8
+
9
+ /**
10
+ * This function will check and see whether the user is authenticated or not.
11
+ */
12
+ let checkAuth = () => {
13
+ if (user.is) return isAuthenticated.next(true);
14
+ else return isAuthenticated.next(false);
15
+ };
16
+
17
+ gun.on("auth", () => isAuthenticated.next(true));
18
+
19
+ export { isAuthenticated, checkAuth };
20
+
@@ -0,0 +1,25 @@
1
+ import { user } from "../../state/gun";
2
+
3
+ /**
4
+ * This function will authenticate a user who has registered.
5
+ *
6
+ * @param {Object} credentials The users authentication credentials that they used when registering.
7
+ * @param credentials.username
8
+ * @param credentials.password
9
+ *
10
+ * @param {Function} callback The callback function returns error messages or a success message.
11
+ */
12
+ let loginUser = (credentials = {}, callback = () => {}) => {
13
+ user.auth(credentials.username, credentials.password, ({ err, pub }) => {
14
+ if (err) return callback({ errMessage: err, errCode: "gun-auth-error" });
15
+ else
16
+ return callback({
17
+ errMessage: undefined,
18
+ errCode: undefined,
19
+ pub,
20
+ message: "Successfully authenticated user.",
21
+ });
22
+ });
23
+ };
24
+
25
+ export default loginUser;
@@ -0,0 +1,58 @@
1
+ import { gun, user } from "../../state/gun";
2
+
3
+ /**
4
+ * This function will check to see if the email is already in use.
5
+ *
6
+ * @param {string} username
7
+ * @returns Promise<boolean>
8
+ */
9
+ let checkUsernameInUse = async (username) => {
10
+ let user = await gun.get(`~@${username}`);
11
+
12
+ return user !== undefined;
13
+ };
14
+
15
+ /**
16
+ * This function will create a user.
17
+ *
18
+ * @param {Object} credentials The users authentication credentials that they want to use when logging in.
19
+ * @param credentials.username
20
+ * @param credentials.password
21
+ *
22
+ * @param {Function} callback The callback function returns error messages or a success message.
23
+ */
24
+ let registerUser = (credentials = {}, callback = () => {}) => {
25
+ console.log("Credentials", credentials);
26
+ console.log("Registering user...");
27
+ (async () => {
28
+ if (await checkUsernameInUse(credentials.username))
29
+ return callback({
30
+ errMessage: "Username in use.",
31
+ errCode: "username-inuse",
32
+ });
33
+ else {
34
+ user.create(credentials.username, credentials.password, ({ err, pub }) => {
35
+ if (err)
36
+ return callback({ errMessage: err, errCode: "gun-auth-error" });
37
+ else
38
+ return callback({
39
+ errMessage: undefined,
40
+ errCode: undefined,
41
+ pub,
42
+ message: "Successfully created user.",
43
+ });
44
+ });
45
+ }
46
+ })();
47
+ };
48
+
49
+ function str2ab(str) {
50
+ var buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char
51
+ var bufView = new Uint16Array(buf);
52
+ for (var i = 0, strLen = str.length; i < strLen; i++) {
53
+ bufView[i] = str.charCodeAt(i);
54
+ }
55
+ return buf;
56
+ }
57
+
58
+ export default registerUser;
@@ -0,0 +1,74 @@
1
+ import { ethers } from 'ethers';
2
+
3
+ let rpcUrl = "";
4
+ let privateKey = "";
5
+
6
+ /**
7
+ * @typedef {Object} Window
8
+ * @property {any} ethereum
9
+ */
10
+
11
+ /**
12
+ * Sets the configuration for standalone mode
13
+ * @param {string} newRpcUrl - The new RPC URL
14
+ * @param {string} newPrivateKey - The new private key
15
+ */
16
+ export function setStandaloneConfig(newRpcUrl, newPrivateKey) {
17
+ rpcUrl = newRpcUrl;
18
+ privateKey = newPrivateKey;
19
+ }
20
+
21
+ /**
22
+ * Gets a signer for Ethereum transactions
23
+ * @returns {Promise<ethers.Signer>} A signer object
24
+ * @throws {Error} If no valid Ethereum provider is found
25
+ */
26
+ export async function getSigner() {
27
+ if (rpcUrl && privateKey) {
28
+ const provider = new ethers.JsonRpcProvider(rpcUrl);
29
+ return new ethers.Wallet(privateKey, provider);
30
+ } else if (typeof window !== "undefined" && typeof /** @type {any} */(window).ethereum !== "undefined") {
31
+ await window.ethereum.request({ method: "eth_requestAccounts" });
32
+ const provider = new ethers.BrowserProvider(window.ethereum);
33
+ return provider.getSigner();
34
+ } else {
35
+ throw new Error("No valid Ethereum provider found");
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Gets an Ethereum provider
41
+ * @returns {Promise<ethers.Provider>} An Ethereum provider
42
+ * @throws {Error} If no valid Ethereum provider is found
43
+ */
44
+ export async function getProvider() {
45
+ if (rpcUrl && privateKey) {
46
+ return new ethers.JsonRpcProvider(rpcUrl);
47
+ } else if (typeof window !== "undefined" && typeof window.ethereum !== "undefined") {
48
+ return new ethers.BrowserProvider(window.ethereum);
49
+ } else {
50
+ throw new Error("No valid Ethereum provider found");
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Gets the ENS name for a given Ethereum address
56
+ * @param {string} address - The Ethereum address to look up
57
+ * @returns {Promise<string|null>} The ENS name if found, null otherwise
58
+ */
59
+ export async function getEnsName(address) {
60
+ const provider = await getProvider();
61
+ try {
62
+ const ensName = await provider.lookupAddress(address);
63
+ if (ensName) {
64
+ console.log(`The ENS name for address ${address} is: ${ensName}`);
65
+ return ensName;
66
+ } else {
67
+ console.log(`No ENS name found for address ${address}`);
68
+ return null;
69
+ }
70
+ } catch (error) {
71
+ console.error("Error while looking up ENS name:", error);
72
+ return null;
73
+ }
74
+ }
@@ -0,0 +1,204 @@
1
+ import { SHINE_ABI, SHINE_OPTIMISM_SEPOLIA } from "../utils/utils.js";
2
+
3
+ /**
4
+ * @typedef {Object} ShineResult
5
+ * @property {boolean} ok - Indicates if the operation was successful
6
+ * @property {string} message - A descriptive message about the operation result
7
+ * @property {number} [timestamp] - The timestamp of the verified data (if applicable)
8
+ * @property {string} [updater] - The address of the last updater (if applicable)
9
+ * @property {Object} [latestRecord] - The latest record from the blockchain (if applicable)
10
+ * @property {string} [nodeId] - The ID of the newly created node (for write operations)
11
+ * @property {string} [txHash] - The transaction hash (for write operations)
12
+ */
13
+
14
+ /**
15
+ * Creates a SHINE (Secure Hybrid Information and Node Ecosystem) plugin for Gun
16
+ * @param {any} Gun - The Gun instance
17
+ * @param {any} ethers - The ethers.js library
18
+ * @param {Function} getSigner - Function to get the signer
19
+ * @param {Function} getProvider - Function to get the provider
20
+ * @returns {Function} The SHINE plugin function
21
+ */
22
+ export function shine(Gun, ethers, getSigner, getProvider) {
23
+ /**
24
+ * The SHINE plugin function
25
+ * @param {string} chain - The blockchain network to use
26
+ * @param {string} [nodeId] - The ID of the node to verify (for read operations)
27
+ * @param {Object} [data] - The data to write (for write operations)
28
+ * @param {Function} callback - The callback function to handle the result
29
+ * @returns {Object} The Gun instance
30
+ * @this {any}
31
+ */
32
+
33
+ return function (chain, nodeId, data = null, callback = () => {}) {
34
+ console.log("SHINE plugin called with:", { chain, nodeId, data });
35
+
36
+ if (typeof callback !== "function") {
37
+ callback = () => {};
38
+ console.error("Callback must be a function");
39
+ return this;
40
+ }
41
+
42
+ const gun = this;
43
+ let SHINE_CONTRACT_ADDRESS;
44
+
45
+ if (chain === "optimismSepolia") {
46
+ SHINE_CONTRACT_ADDRESS = SHINE_OPTIMISM_SEPOLIA;
47
+ } else {
48
+ throw new Error("Chain not supported");
49
+ }
50
+
51
+ /**
52
+ * Verifies data on-chain
53
+ * @param {string} nodeId - The ID of the node to verify
54
+ * @param {string} contentHash - The content hash to verify
55
+ * @returns {Promise<{isValid: boolean, timestamp: number, updater: string}>} The verification result
56
+ */
57
+ const verifyOnChain = async (nodeId, contentHash) => {
58
+ console.log("Verifying on chain:", { nodeId, contentHash });
59
+ const signer = await getSigner();
60
+ const contract = new ethers.Contract(
61
+ SHINE_CONTRACT_ADDRESS,
62
+ SHINE_ABI,
63
+ signer
64
+ );
65
+ const [isValid, timestamp, updater] = await contract.verifyData(
66
+ ethers.toUtf8Bytes(nodeId),
67
+ contentHash
68
+ );
69
+ console.log("Verification result:", { isValid, timestamp, updater });
70
+ return { isValid, timestamp, updater };
71
+ };
72
+
73
+ /**
74
+ * Writes data on-chain
75
+ * @param {string} nodeId - The ID of the node to write
76
+ * @param {string} contentHash - The content hash to write
77
+ * @returns {Promise<any>} The transaction object
78
+ */
79
+ const writeOnChain = async (nodeId, contentHash) => {
80
+ console.log("Writing on chain:", { nodeId, contentHash });
81
+ const signer = await getSigner();
82
+ const contract = new ethers.Contract(
83
+ SHINE_CONTRACT_ADDRESS,
84
+ SHINE_ABI,
85
+ signer
86
+ );
87
+ const tx = await contract.updateData(
88
+ ethers.toUtf8Bytes(nodeId),
89
+ contentHash
90
+ );
91
+ console.log("Transaction sent:", tx.hash);
92
+ const receipt = await tx.wait();
93
+ console.log("Transaction confirmed:", receipt);
94
+ return tx;
95
+ };
96
+
97
+ /**
98
+ * Gets the latest record from the blockchain
99
+ * @param {string} nodeId - The ID of the node to retrieve
100
+ * @returns {Promise<{contentHash: string, timestamp: number, updater: string}>} The latest record
101
+ */
102
+ const getLatestRecord = async (nodeId) => {
103
+ const signer = await getSigner();
104
+ const contract = new ethers.Contract(
105
+ SHINE_CONTRACT_ADDRESS,
106
+ SHINE_ABI,
107
+ signer
108
+ );
109
+ const [contentHash, timestamp, updater] = await contract.getLatestRecord(
110
+ ethers.toUtf8Bytes(nodeId)
111
+ );
112
+ console.log("Latest record from blockchain:", {
113
+ nodeId,
114
+ contentHash,
115
+ timestamp,
116
+ updater,
117
+ });
118
+ return { contentHash, timestamp, updater };
119
+ };
120
+
121
+ // SHINE process
122
+ if (nodeId && !data) {
123
+ gun.get(nodeId).once(async (existingData) => {
124
+ if (!existingData) {
125
+ if (callback) callback({ err: "Node not found in GunDB" });
126
+ return;
127
+ }
128
+
129
+ console.log("existingData", existingData);
130
+
131
+ const contentHash = existingData._contentHash;
132
+ console.log("contentHash", contentHash);
133
+
134
+ if (!contentHash) {
135
+ if (callback)
136
+ callback({ err: "No content hash found for this node" });
137
+ return;
138
+ }
139
+
140
+ try {
141
+ const { isValid, timestamp, updater } = await verifyOnChain(
142
+ nodeId,
143
+ contentHash
144
+ );
145
+ const latestRecord = await getLatestRecord(nodeId);
146
+
147
+ if (isValid) {
148
+ if (callback)
149
+ callback({
150
+ ok: true,
151
+ message: "Data verified on blockchain",
152
+ timestamp,
153
+ updater,
154
+ latestRecord,
155
+ });
156
+ } else {
157
+ if (callback)
158
+ callback({
159
+ ok: false,
160
+ message: "Data not verified on blockchain",
161
+ latestRecord,
162
+ });
163
+ }
164
+ } catch (error) {
165
+ if (callback) callback({ err: error.message });
166
+ }
167
+ });
168
+ } else if (data && !nodeId) {
169
+ const newNodeId = Gun.text.random();
170
+ const dataString = JSON.stringify(data);
171
+ const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
172
+
173
+ gun
174
+ .get(newNodeId)
175
+ .put({ ...data, _contentHash: contentHash }, async (ack) => {
176
+ console.log("ack", ack);
177
+ if (ack.err) {
178
+ if (callback) callback({ err: "Error saving data to GunDB" });
179
+ return;
180
+ }
181
+
182
+ try {
183
+ const tx = await writeOnChain(newNodeId, contentHash);
184
+ if (callback)
185
+ callback({
186
+ ok: true,
187
+ message: "Data written to GunDB and blockchain",
188
+ nodeId: newNodeId,
189
+ txHash: tx.hash,
190
+ });
191
+ } catch (error) {
192
+ if (callback) callback({ err: error.message });
193
+ }
194
+ });
195
+ } else {
196
+ if (callback)
197
+ callback({
198
+ err: "Invalid input. Provide either nodeId or data, not both.",
199
+ });
200
+ }
201
+
202
+ return gun;
203
+ };
204
+ }
@@ -0,0 +1,92 @@
1
+ import { SEA } from "gun";
2
+ import { gun } from "../../state/gun";
3
+
4
+ /**
5
+ * Genera un certificato per le richieste di amicizia.
6
+ * @param {Function} callback - Funzione di callback chiamata al completamento dell'operazione.
7
+ * @returns {Promise<void>}
8
+ */
9
+ let generateFriendRequestsCertificate = async (callback = () => {}) => {
10
+ let certificateExists = await gun
11
+ .user()
12
+ .get("certificates")
13
+ .get("friendRequests")
14
+ .once();
15
+
16
+ if (certificateExists) return;
17
+
18
+ let certificate = await SEA.certify(
19
+ ["*"],
20
+ [{ "*": "friendRequests" }],
21
+ await gun.user().pair(),
22
+ null
23
+ );
24
+
25
+ gun
26
+ .user()
27
+ .get("certificates")
28
+ .get("friendRequests")
29
+ .put(certificate, ({ err }) => {
30
+ if (err)
31
+ return callback({
32
+ errMessage: err,
33
+ errCode: "gun-put-error",
34
+ success: undefined,
35
+ });
36
+ else
37
+ return callback({
38
+ errMessage: undefined,
39
+ errCode: undefined,
40
+ certificate,
41
+ success: "Generated new friend requests certificate.",
42
+ });
43
+ });
44
+ };
45
+
46
+ /**
47
+ * Genera un certificato per aggiungere un amico.
48
+ * @param {string} publicKey - Chiave pubblica dell'amico da aggiungere.
49
+ * @param {Function} callback - Funzione di callback chiamata al completamento dell'operazione.
50
+ * @returns {Promise<void>}
51
+ */
52
+ let generateAddFriendCertificate = async (publicKey, callback = () => {}) => {
53
+ let certificateExists = await gun
54
+ .user()
55
+ .get("certificates")
56
+ .get(publicKey)
57
+ .get("addFriend")
58
+ .once();
59
+
60
+ if (certificateExists) return;
61
+
62
+ let certificate = await SEA.certify(
63
+ [publicKey],
64
+ [{ "*": "friends" }],
65
+ await gun.user().pair(),
66
+ null
67
+ );
68
+
69
+ gun
70
+ .user()
71
+ .get("certificates")
72
+ .get(publicKey)
73
+ .get("addFriend")
74
+ .put(certificate, ({ err }) => {
75
+ if (err)
76
+ return callback({
77
+ errMessage: err,
78
+ errCode: "gun-put-error",
79
+ success: undefined,
80
+ });
81
+ else
82
+ return callback({
83
+ errMessage: undefined,
84
+ errCode: undefined,
85
+ certificate,
86
+ success:
87
+ "Generated certificate for requested friend to add user back.",
88
+ });
89
+ });
90
+ };
91
+
92
+ export { generateFriendRequestsCertificate, generateAddFriendCertificate };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Modulo per la gestione dei certificati nell'applicazione.
3
+ * @module certificates
4
+ */
5
+
6
+ import {
7
+ generateAddFriendCertificate,
8
+ generateFriendRequestsCertificate
9
+ } from "./friendsCertificates";
10
+ import {
11
+ createChatsCertificate,
12
+ createMessagesCertificate
13
+ } from "./messagingCertificates";
14
+
15
+ /**
16
+ * Genera un certificato per aggiungere un amico.
17
+ * @function
18
+ * @param {string} publicKey - Chiave pubblica dell'amico da aggiungere.
19
+ * @param {Function} [callback] - Funzione di callback opzionale.
20
+ */
21
+ export { generateAddFriendCertificate };
22
+
23
+ /**
24
+ * Genera un certificato per le richieste di amicizia.
25
+ * @function
26
+ * @param {Function} [callback] - Funzione di callback opzionale.
27
+ */
28
+ export { generateFriendRequestsCertificate };
29
+
30
+ /**
31
+ * Crea un certificato per le chat con un utente specifico.
32
+ * @function
33
+ * @param {string} publicKey - Chiave pubblica dell'utente.
34
+ * @param {Function} [callback] - Funzione di callback opzionale.
35
+ */
36
+ export { createChatsCertificate };
37
+
38
+ /**
39
+ * Crea un certificato per i messaggi con un utente specifico.
40
+ * @function
41
+ * @param {string} publicKey - Chiave pubblica dell'utente.
42
+ * @param {Function} [callback] - Funzione di callback opzionale.
43
+ */
44
+ export { createMessagesCertificate };
@@ -0,0 +1,94 @@
1
+ import { SEA } from "gun";
2
+ import { gun } from "../../state/gun";
3
+
4
+ /**
5
+ * Crea un certificato per le chat con un utente specifico.
6
+ * @param {string} publicKey - La chiave pubblica dell'utente per cui creare il certificato.
7
+ * @param {function} [callback] - Funzione di callback opzionale chiamata al completamento dell'operazione.
8
+ * @returns {Promise<void>}
9
+ */
10
+ let createChatsCertificate = async (publicKey, callback = () => {}) => {
11
+ let certificateExists = await gun
12
+ .user()
13
+ .get("certificates")
14
+ .get(publicKey)
15
+ .get("chats")
16
+ .once();
17
+
18
+ if (certificateExists) return;
19
+
20
+ let certificate = await SEA.certify(
21
+ [publicKey],
22
+ [{ "*": "chats" }],
23
+ await gun.user().pair(),
24
+ null
25
+ );
26
+
27
+ gun
28
+ .user()
29
+ .get("certificates")
30
+ .get(publicKey)
31
+ .get("chats")
32
+ .put(certificate, ({ err }) => {
33
+ if (err)
34
+ return callback({
35
+ errMessage: err,
36
+ errCode: "chats-certificate-creation-error",
37
+ success: undefined,
38
+ });
39
+ else
40
+ return callback({
41
+ errMessage: undefined,
42
+ errCode: undefined,
43
+ certificate,
44
+ success: "Generated new chats certificate.",
45
+ });
46
+ });
47
+ };
48
+
49
+ /**
50
+ * Crea un certificato per i messaggi con un utente specifico.
51
+ * @param {string} publicKey - La chiave pubblica dell'utente per cui creare il certificato.
52
+ * @param {function} [callback] - Funzione di callback opzionale chiamata al completamento dell'operazione.
53
+ * @returns {Promise<void>}
54
+ */
55
+ let createMessagesCertificate = async (publicKey, callback = () => {}) => {
56
+ let certificateExists = await gun
57
+ .user()
58
+ .get("certificates")
59
+ .get(publicKey)
60
+ .get("messages")
61
+ .once();
62
+
63
+ if (certificateExists) return;
64
+
65
+ let certificate = await SEA.certify(
66
+ [publicKey],
67
+ [{ "*": "messages" }],
68
+ await gun.user().pair(),
69
+ null
70
+ );
71
+
72
+ gun
73
+ .user()
74
+ .get("certificates")
75
+ .get(publicKey)
76
+ .get("messages")
77
+ .put(certificate, ({ err }) => {
78
+ if (err)
79
+ return callback({
80
+ errMessage: err,
81
+ errCode: "messages-certificate-creation-error",
82
+ success: undefined,
83
+ });
84
+ else
85
+ return callback({
86
+ errMessage: undefined,
87
+ errCode: undefined,
88
+ certificate,
89
+ success: "Generated new messages certificate.",
90
+ });
91
+ });
92
+ };
93
+
94
+ export { createChatsCertificate, createMessagesCertificate };
@@ -0,0 +1,69 @@
1
+ import { gun, user } from "../../state/gun";
2
+
3
+ /**
4
+ * Accetta una richiesta di amicizia.
5
+ * @param {Object} params - Parametri della funzione.
6
+ * @param {string} params.key - Chiave della richiesta di amicizia.
7
+ * @param {string} params.publicKey - Chiave pubblica dell'utente che ha inviato la richiesta.
8
+ * @param {Function} [callback] - Funzione di callback opzionale.
9
+ * @returns {void}
10
+ */
11
+ let acceptFriendRequest = ({ key, publicKey }, callback = () => {}) => {
12
+ gun
13
+ .user()
14
+ .get("friendRequests")
15
+ .get(key)
16
+ .put(null, async ({ err }) => {
17
+ if (err)
18
+ return callback({
19
+ errMessage: err,
20
+ errCode: "accept-friend-request-failed",
21
+ success: undefined,
22
+ });
23
+ else {
24
+ let addFriendCertificate = await gun
25
+ .user(publicKey)
26
+ .get("certificates")
27
+ .get(user.is.pub)
28
+ .get("addFriend");
29
+
30
+ gun
31
+ .user(publicKey)
32
+ .get("friends")
33
+ .set(
34
+ user.is.pub,
35
+ ({ err }) => {
36
+ if (err)
37
+ return callback({
38
+ errMessage: err,
39
+ errCode: "add-friend-failed",
40
+ success: undefined,
41
+ });
42
+ else
43
+ gun
44
+ .user()
45
+ .get("friends")
46
+ .set(publicKey, ({ err }) => {
47
+ if (err)
48
+ return callback({
49
+ errMessage: err,
50
+ errCode: "add-friend-failed",
51
+ success: undefined,
52
+ });
53
+ else
54
+ return callback({
55
+ errMessage: undefined,
56
+ errCode: undefined,
57
+ success: "Added friend successfully.",
58
+ });
59
+ });
60
+ },
61
+ {
62
+ opt: { cert: addFriendCertificate },
63
+ }
64
+ );
65
+ }
66
+ });
67
+ };
68
+
69
+ export default acceptFriendRequest;