@solarpunkltd/swarm-chat-js 5.1.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -11
- package/dist/index.js.map +1 -0
- package/dist/interfaces/chat.d.ts +8 -1
- package/dist/interfaces/chat.d.ts.map +1 -1
- package/dist/interfaces/chat.js +2 -0
- package/dist/interfaces/chat.js.map +1 -0
- package/dist/interfaces/index.js +3 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/message.js +7 -0
- package/dist/interfaces/message.js.map +1 -0
- package/dist/lib/constants.d.ts +1 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +11 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/core.d.ts +7 -3
- package/dist/lib/core.d.ts.map +1 -1
- package/dist/lib/core.js +225 -0
- package/dist/lib/core.js.map +1 -0
- package/dist/lib/history.d.ts +1 -1
- package/dist/lib/history.js +140 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/utils.d.ts +1 -1
- package/dist/lib/utils.js +205 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/scripts/mine.js +13 -0
- package/dist/scripts/mine.js.map +1 -0
- package/dist/utils/bee.d.ts +1 -1
- package/dist/utils/bee.js +64 -0
- package/dist/utils/bee.js.map +1 -0
- package/dist/utils/common.js +33 -0
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/error.js +20 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/eventEmitter.js +32 -0
- package/dist/utils/eventEmitter.js.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.js +187 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/waku/ProtoMessage.d.ts +6 -0
- package/dist/waku/ProtoMessage.d.ts.map +1 -0
- package/dist/waku/ProtoMessage.js +35 -0
- package/dist/waku/ProtoMessage.js.map +1 -0
- package/dist/waku/Waku.d.ts +18 -0
- package/dist/waku/Waku.d.ts.map +1 -0
- package/dist/waku/Waku.js +84 -0
- package/dist/waku/Waku.js.map +1 -0
- package/dist/waku/message.proto +33 -0
- package/package.json +7 -3
- package/dist/index.esm.js +0 -6535
- package/dist/swarm-chat-umd.js +0 -11
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BeeArgumentError, Bytes, FeedIndex, Identifier, PrivateKey, Reference, Span, } from '@ethersphere/bee-js';
|
|
2
|
+
import { Binary } from 'cafe-utility';
|
|
3
|
+
const ENCODER = new TextEncoder();
|
|
4
|
+
const MIN_PAYLOAD_SIZE = 1;
|
|
5
|
+
const MAX_PAYLOAD_SIZE = 4096;
|
|
6
|
+
const MAX_CHUNK_PAYLOAD_SIZE = 4096;
|
|
7
|
+
const SEGMENT_SIZE = 32;
|
|
8
|
+
export function makeFeedIdentifier(topic, index) {
|
|
9
|
+
index = typeof index === 'number' ? FeedIndex.fromBigInt(BigInt(index)) : index;
|
|
10
|
+
return new Identifier(Binary.keccak256(Binary.concatBytes(topic.toUint8Array(), index.toUint8Array())));
|
|
11
|
+
}
|
|
12
|
+
export function calculateChunkAddress(chunkContent) {
|
|
13
|
+
const span = chunkContent.slice(0, Span.LENGTH);
|
|
14
|
+
const payload = chunkContent.slice(Span.LENGTH);
|
|
15
|
+
const rootHash = calculateBmtRootHash(payload);
|
|
16
|
+
const chunkHash = Binary.keccak256(Binary.concatBytes(span, rootHash));
|
|
17
|
+
return new Reference(chunkHash);
|
|
18
|
+
}
|
|
19
|
+
function calculateBmtRootHash(payload) {
|
|
20
|
+
if (payload.length > MAX_CHUNK_PAYLOAD_SIZE) {
|
|
21
|
+
throw new BeeArgumentError(`payload size ${payload.length} exceeds maximum chunk payload size ${MAX_CHUNK_PAYLOAD_SIZE}`, payload);
|
|
22
|
+
}
|
|
23
|
+
const input = new Uint8Array(MAX_CHUNK_PAYLOAD_SIZE);
|
|
24
|
+
input.set(payload);
|
|
25
|
+
return Binary.log2Reduce(Binary.partition(input, SEGMENT_SIZE), (a, b) => Binary.keccak256(Binary.concatBytes(a, b)));
|
|
26
|
+
}
|
|
27
|
+
export function makeContentAddressedChunk(payloadBytes) {
|
|
28
|
+
if (!(payloadBytes instanceof Uint8Array)) {
|
|
29
|
+
payloadBytes = ENCODER.encode(payloadBytes);
|
|
30
|
+
}
|
|
31
|
+
if (payloadBytes.length < MIN_PAYLOAD_SIZE || payloadBytes.length > MAX_PAYLOAD_SIZE) {
|
|
32
|
+
throw new RangeError(`payload size ${payloadBytes.length} exceeds limits [${MIN_PAYLOAD_SIZE}, ${MAX_PAYLOAD_SIZE}]`);
|
|
33
|
+
}
|
|
34
|
+
const span = Span.fromBigInt(BigInt(payloadBytes.length));
|
|
35
|
+
const data = Binary.concatBytes(span.toUint8Array(), payloadBytes);
|
|
36
|
+
return {
|
|
37
|
+
data,
|
|
38
|
+
span,
|
|
39
|
+
payload: Bytes.fromSlice(data, Span.LENGTH),
|
|
40
|
+
address: calculateChunkAddress(data),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function makeSOCAddress(identifier, address) {
|
|
44
|
+
return new Reference(Binary.keccak256(Binary.concatBytes(identifier.toUint8Array(), address.toUint8Array())));
|
|
45
|
+
}
|
|
46
|
+
export function makeSingleOwnerChunk(chunk, identifier, signer) {
|
|
47
|
+
identifier = new Identifier(identifier);
|
|
48
|
+
signer = new PrivateKey(signer);
|
|
49
|
+
const address = makeSOCAddress(identifier, signer.publicKey().address());
|
|
50
|
+
const signature = signer.sign(Binary.concatBytes(identifier.toUint8Array(), chunk.address.toUint8Array()));
|
|
51
|
+
const data = Binary.concatBytes(identifier.toUint8Array(), signature.toUint8Array(), chunk.data);
|
|
52
|
+
const span = Span.fromSlice(chunk.data, 0);
|
|
53
|
+
const payload = Bytes.fromSlice(chunk.data, Span.LENGTH);
|
|
54
|
+
return {
|
|
55
|
+
data,
|
|
56
|
+
identifier,
|
|
57
|
+
signature,
|
|
58
|
+
span,
|
|
59
|
+
payload,
|
|
60
|
+
address,
|
|
61
|
+
owner: signer.publicKey().address(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=bee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bee.js","sourceRoot":"","sources":["../../src/utils/bee.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,EAEL,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EAET,IAAI,GAEL,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAetC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,KAAyB;IACxE,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhF,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAwB;IAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvE,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAmB;IAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QAC5C,MAAM,IAAI,gBAAgB,CACxB,gBAAgB,OAAO,CAAC,MAAM,uCAAuC,sBAAsB,EAAE,EAC7F,OAAO,CACR,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACrD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,YAAiC;IACzE,IAAI,CAAC,CAAC,YAAY,YAAY,UAAU,CAAC,EAAE,CAAC;QAC1C,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,gBAAgB,IAAI,YAAY,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACrF,MAAM,IAAI,UAAU,CAClB,gBAAgB,YAAY,CAAC,MAAM,oBAAoB,gBAAgB,KAAK,gBAAgB,GAAG,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;IAEnE,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAC3C,OAAO,EAAE,qBAAqB,CAAC,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAsB,EAAE,OAAmB;IACxE,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAY,EACZ,UAA4C,EAC5C,MAAwC;IAExC,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEzD,OAAO;QACL,IAAI;QACJ,UAAU;QACV,SAAS;QACT,IAAI;QACJ,OAAO;QACP,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ErrorHandler } from './error';
|
|
2
|
+
import { Logger } from './logger';
|
|
3
|
+
const logger = Logger.getInstance();
|
|
4
|
+
const errorHandler = ErrorHandler.getInstance();
|
|
5
|
+
export function sleep(delay) {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
setTimeout(resolve, delay);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function remove0x(hex) {
|
|
11
|
+
return (hex.startsWith('0x') ? hex.slice(2) : hex).toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
export async function retryAwaitableAsync(fn, retries = 3, delay = 250) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
fn()
|
|
16
|
+
.then(resolve)
|
|
17
|
+
.catch((error) => {
|
|
18
|
+
if (retries > 0) {
|
|
19
|
+
logger.info(`Retrying... Attempts left: ${retries}. Error: ${error.message}`);
|
|
20
|
+
setTimeout(() => {
|
|
21
|
+
retryAwaitableAsync(fn, retries - 1, delay)
|
|
22
|
+
.then(resolve)
|
|
23
|
+
.catch(reject);
|
|
24
|
+
}, delay);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
errorHandler.handleError(error, 'Utils.retryAwaitableAsync');
|
|
28
|
+
reject(error);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;AACpC,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;AAEhD,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAoB,EACpB,UAAkB,CAAC,EACnB,QAAgB,GAAG;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,EAAE,EAAE;aACD,IAAI,CAAC,OAAO,CAAC;aACb,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,8BAA8B,OAAO,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9E,UAAU,CAAC,GAAG,EAAE;oBACd,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC;yBACxC,IAAI,CAAC,OAAO,CAAC;yBACb,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC,EAAE,KAAK,CAAC,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;gBAC7D,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Logger } from './logger';
|
|
2
|
+
export class ErrorHandler {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.logger = Logger.getInstance();
|
|
5
|
+
}
|
|
6
|
+
static getInstance() {
|
|
7
|
+
if (!ErrorHandler.instance) {
|
|
8
|
+
ErrorHandler.instance = new ErrorHandler();
|
|
9
|
+
}
|
|
10
|
+
return ErrorHandler.instance;
|
|
11
|
+
}
|
|
12
|
+
handleError(error, context) {
|
|
13
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
14
|
+
const stackTrace = error instanceof Error ? error.stack : null;
|
|
15
|
+
this.logger.error(`Error in ${context || 'unknown context'}: ${errorMessage}`, {
|
|
16
|
+
stack: stackTrace,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,OAAO,YAAY;IAIvB;QAFQ,WAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEf,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,KAAc,EAAE,OAAgB;QAC1C,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACvF,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,iBAAiB,KAAK,YAAY,EAAE,EAAE;YAC7E,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class EventEmitter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.events = {};
|
|
4
|
+
this.on = this.on.bind(this);
|
|
5
|
+
this.off = this.off.bind(this);
|
|
6
|
+
this.cleanAll = this.cleanAll.bind(this);
|
|
7
|
+
this.emit = this.emit.bind(this);
|
|
8
|
+
}
|
|
9
|
+
on(event, listener) {
|
|
10
|
+
if (!this.events[event]) {
|
|
11
|
+
this.events[event] = [];
|
|
12
|
+
}
|
|
13
|
+
this.events[event].push(listener);
|
|
14
|
+
}
|
|
15
|
+
off(event, listener) {
|
|
16
|
+
if (!this.events[event])
|
|
17
|
+
return;
|
|
18
|
+
const index = this.events[event].indexOf(listener);
|
|
19
|
+
if (index > -1) {
|
|
20
|
+
this.events[event].splice(index, 1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
cleanAll() {
|
|
24
|
+
this.events = {};
|
|
25
|
+
}
|
|
26
|
+
emit(event, data) {
|
|
27
|
+
if (!this.events[event])
|
|
28
|
+
return;
|
|
29
|
+
this.events[event].forEach((listener) => listener(data));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=eventEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IAGvB;QAFQ,WAAM,GAAW,EAAE,CAAC;QAG1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEM,EAAE,CAAU,KAAa,EAAE,QAAqB;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,GAAG,CAAU,KAAa,EAAE,QAAqB;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAEM,IAAI,CAAU,KAAa,EAAE,IAAO;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO;QAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class Logger {
|
|
2
|
+
constructor() { }
|
|
3
|
+
static getInstance() {
|
|
4
|
+
if (!Logger.instance) {
|
|
5
|
+
Logger.instance = new Logger();
|
|
6
|
+
}
|
|
7
|
+
return Logger.instance;
|
|
8
|
+
}
|
|
9
|
+
formatMessage(level, ...args) {
|
|
10
|
+
const timestamp = new Date().toISOString();
|
|
11
|
+
return `[${timestamp}] [${level.toUpperCase()}] - ${args
|
|
12
|
+
.map((arg) => (typeof arg === 'object' ? JSON.stringify(arg) : arg))
|
|
13
|
+
.join(' ')}`;
|
|
14
|
+
}
|
|
15
|
+
log(...args) {
|
|
16
|
+
console.log(this.formatMessage('log', ...args));
|
|
17
|
+
}
|
|
18
|
+
info(...args) {
|
|
19
|
+
console.info(this.formatMessage('info', ...args));
|
|
20
|
+
}
|
|
21
|
+
warn(...args) {
|
|
22
|
+
console.warn(this.formatMessage('warn', ...args));
|
|
23
|
+
}
|
|
24
|
+
error(...args) {
|
|
25
|
+
console.error(this.formatMessage('error', ...args));
|
|
26
|
+
}
|
|
27
|
+
debug(...args) {
|
|
28
|
+
console.debug(this.formatMessage('debug', ...args));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,MAAM;IAGjB,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEO,aAAa,CAAC,KAAa,EAAE,GAAG,IAAW;QACjD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,OAAO,IAAI;aACrD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACnE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,GAAG,IAAW;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,GAAG,IAAW;QACjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,GAAG,IAAW;QACjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,GAAG,IAAW;QAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,GAAG,IAAW;QAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Signature } from '@ethersphere/bee-js';
|
|
2
|
+
import { Binary } from 'cafe-utility';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { MessageType } from '../interfaces/message';
|
|
5
|
+
import { Logger } from './logger';
|
|
6
|
+
const logger = Logger.getInstance();
|
|
7
|
+
export const CORE_MESSAGE_PROPERTIES = [
|
|
8
|
+
'id',
|
|
9
|
+
'targetMessageId',
|
|
10
|
+
'type',
|
|
11
|
+
'message',
|
|
12
|
+
'username',
|
|
13
|
+
'address',
|
|
14
|
+
'timestamp',
|
|
15
|
+
'signature',
|
|
16
|
+
'index',
|
|
17
|
+
'chatTopic',
|
|
18
|
+
'userTopic',
|
|
19
|
+
'additionalProps',
|
|
20
|
+
];
|
|
21
|
+
const MessageSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
id: z.string(),
|
|
24
|
+
targetMessageId: z.string().optional(),
|
|
25
|
+
type: z.nativeEnum(MessageType),
|
|
26
|
+
message: z.string(),
|
|
27
|
+
username: z.string(),
|
|
28
|
+
address: z.string(),
|
|
29
|
+
timestamp: z.number(),
|
|
30
|
+
signature: z.string(),
|
|
31
|
+
index: z.number(),
|
|
32
|
+
chatTopic: z.string(),
|
|
33
|
+
userTopic: z.string(),
|
|
34
|
+
additionalProps: z.record(z.any()).optional(),
|
|
35
|
+
})
|
|
36
|
+
.refine((data) => {
|
|
37
|
+
if (!data.additionalProps || Object.keys(data.additionalProps).length === 0) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const validation = validateAdditionalPropertiesInternal(data.additionalProps);
|
|
41
|
+
return validation.isValid;
|
|
42
|
+
}, {
|
|
43
|
+
message: 'Invalid additional properties in message',
|
|
44
|
+
});
|
|
45
|
+
const StateRefSchema = z.object({
|
|
46
|
+
reference: z.string(),
|
|
47
|
+
timestamp: z.number(),
|
|
48
|
+
});
|
|
49
|
+
const StatefulMessageSchema = z.object({
|
|
50
|
+
message: MessageSchema,
|
|
51
|
+
messageStateRefs: z.array(StateRefSchema).nullable(),
|
|
52
|
+
});
|
|
53
|
+
export function validateGsocMessage(message) {
|
|
54
|
+
const result = StatefulMessageSchema.safeParse(message);
|
|
55
|
+
if (!result.success) {
|
|
56
|
+
logger.warn('GSOC message validation failed:', result.error.format());
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (!validateUserSignature(message.message)) {
|
|
60
|
+
logger.warn('Invalid main message signature');
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
export function validateMessageState(messageState) {
|
|
66
|
+
if (!Array.isArray(messageState)) {
|
|
67
|
+
logger.warn('Message state must be an array');
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
for (const message of messageState) {
|
|
71
|
+
if (!validateMessageData(message)) {
|
|
72
|
+
logger.warn('Invalid message in message state:', message.id);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
export function validateMessageData(message) {
|
|
79
|
+
const result = MessageSchema.safeParse(message);
|
|
80
|
+
if (!result.success) {
|
|
81
|
+
logger.warn('Message data validation failed:', result.error.format());
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
if (!validateUserSignature(message)) {
|
|
85
|
+
logger.warn('Invalid message signature');
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
export function validateUserSignature(validatedUser) {
|
|
91
|
+
try {
|
|
92
|
+
const message = {
|
|
93
|
+
username: validatedUser.username,
|
|
94
|
+
address: validatedUser.address,
|
|
95
|
+
timestamp: validatedUser.timestamp,
|
|
96
|
+
message: validatedUser.message,
|
|
97
|
+
};
|
|
98
|
+
const ENCODER = new TextEncoder();
|
|
99
|
+
const digest = Binary.concatBytes(ENCODER.encode(`\x19Ethereum Signed Message:\n32`), Binary.keccak256(ENCODER.encode(JSON.stringify(message))));
|
|
100
|
+
const isValidSig = new Signature(validatedUser.signature).isValid(digest, validatedUser.address);
|
|
101
|
+
if (isValidSig) {
|
|
102
|
+
throw new Error('Signature verification failed!');
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
logger.warn('Error in validateUserSignature', error);
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function validateAdditionalPropertiesInternal(additionalProps) {
|
|
112
|
+
const errors = [];
|
|
113
|
+
if (additionalProps === null || additionalProps === undefined) {
|
|
114
|
+
return { isValid: true, errors: [] };
|
|
115
|
+
}
|
|
116
|
+
if (typeof additionalProps !== 'object' || Array.isArray(additionalProps)) {
|
|
117
|
+
errors.push('Additional properties must be a plain object');
|
|
118
|
+
return { isValid: false, errors };
|
|
119
|
+
}
|
|
120
|
+
for (const key of Object.keys(additionalProps)) {
|
|
121
|
+
if (CORE_MESSAGE_PROPERTIES.includes(key)) {
|
|
122
|
+
errors.push(`Property '${key}' is reserved and cannot be overridden`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const serialized = JSON.stringify(additionalProps);
|
|
126
|
+
const sizeInBytes = new TextEncoder().encode(serialized).length;
|
|
127
|
+
const MAX_SIZE = 1 * 1024;
|
|
128
|
+
if (sizeInBytes > MAX_SIZE) {
|
|
129
|
+
errors.push(`Additional properties too large: ${sizeInBytes} bytes (max: ${MAX_SIZE} bytes)`);
|
|
130
|
+
}
|
|
131
|
+
const MAX_DEPTH = 5;
|
|
132
|
+
function checkDepth(obj, depth = 0) {
|
|
133
|
+
if (depth > MAX_DEPTH)
|
|
134
|
+
return false;
|
|
135
|
+
if (typeof obj === 'object' && obj !== null && !Array.isArray(obj)) {
|
|
136
|
+
for (const value of Object.values(obj)) {
|
|
137
|
+
if (!checkDepth(value, depth + 1))
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
if (!checkDepth(additionalProps)) {
|
|
144
|
+
errors.push(`Additional properties nested too deeply (max depth: ${MAX_DEPTH})`);
|
|
145
|
+
}
|
|
146
|
+
for (const [key, value] of Object.entries(additionalProps)) {
|
|
147
|
+
if (key.length > 100) {
|
|
148
|
+
errors.push(`Property key '${key}' too long (max: 100 characters)`);
|
|
149
|
+
}
|
|
150
|
+
if (typeof value === 'string' && value.length > 1000) {
|
|
151
|
+
errors.push(`Property '${key}' value too long (max: 1000 characters)`);
|
|
152
|
+
}
|
|
153
|
+
if (typeof value === 'string') {
|
|
154
|
+
const dangerousPatterns = [
|
|
155
|
+
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
|
156
|
+
/javascript:/gi,
|
|
157
|
+
/data:text\/html/gi,
|
|
158
|
+
/vbscript:/gi,
|
|
159
|
+
/on\w+\s*=/gi,
|
|
160
|
+
];
|
|
161
|
+
for (const pattern of dangerousPatterns) {
|
|
162
|
+
if (pattern.test(value)) {
|
|
163
|
+
errors.push(`Property '${key}' contains potentially dangerous content`);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const MAX_PROPERTIES = 20;
|
|
170
|
+
if (Object.keys(additionalProps).length > MAX_PROPERTIES) {
|
|
171
|
+
errors.push(`Too many additional properties: ${Object.keys(additionalProps).length} (max: ${MAX_PROPERTIES})`);
|
|
172
|
+
}
|
|
173
|
+
return { isValid: errors.length === 0, errors };
|
|
174
|
+
}
|
|
175
|
+
export function validateAdditionalProperties(additionalProps) {
|
|
176
|
+
return validateAdditionalPropertiesInternal(additionalProps);
|
|
177
|
+
}
|
|
178
|
+
export function validateMessageWithAdditionalProperties(message) {
|
|
179
|
+
const result = MessageSchema.safeParse(message);
|
|
180
|
+
if (!result.success) {
|
|
181
|
+
const errors = result.error.issues.map((issue) => issue.path.length > 0 ? `${issue.path.join('.')}: ${issue.message}` : issue.message);
|
|
182
|
+
logger.warn('Message validation failed:', result.error.format());
|
|
183
|
+
return { isValid: false, errors };
|
|
184
|
+
}
|
|
185
|
+
return { isValid: true, errors: [] };
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtoMessage.d.ts","sourceRoot":"","sources":["../../src/waku/ProtoMessage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAkBrE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,gBAAgB,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAwBxE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import protobuf from 'protobufjs';
|
|
3
|
+
const { load } = protobuf;
|
|
4
|
+
let protoRoot = null;
|
|
5
|
+
let messagePayloadType = null;
|
|
6
|
+
async function initializeProtobuf() {
|
|
7
|
+
if (!protoRoot) {
|
|
8
|
+
protoRoot = await load(path.join(__dirname, '../waku/message.proto'));
|
|
9
|
+
protoRoot.resolveAll();
|
|
10
|
+
messagePayloadType = protoRoot.lookupType('MessagePayload');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function decodeMessagePayload(buffer) {
|
|
14
|
+
await initializeProtobuf();
|
|
15
|
+
if (!messagePayloadType)
|
|
16
|
+
throw new Error('MessagePayload type not initialized');
|
|
17
|
+
const reverseTypeMap = { 0: 'text', 1: 'thread', 2: 'reaction' };
|
|
18
|
+
try {
|
|
19
|
+
const decoded = messagePayloadType.decode(buffer);
|
|
20
|
+
const decodedObject = messagePayloadType.toObject(decoded);
|
|
21
|
+
const messageData = {
|
|
22
|
+
...decodedObject.message,
|
|
23
|
+
type: reverseTypeMap[decodedObject.message.type] ?? 'text',
|
|
24
|
+
};
|
|
25
|
+
const messageStateRefs = decodedObject.messageStateRefs || [];
|
|
26
|
+
return {
|
|
27
|
+
message: messageData,
|
|
28
|
+
messageStateRefs,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new Error(`Failed to decode message payload: ${error}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ProtoMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtoMessage.js","sourceRoot":"","sources":["../../src/waku/ProtoMessage.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,YAAY,CAAC;AAKlC,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;AAI1B,IAAI,SAAS,GAAgB,IAAI,CAAC;AAClC,IAAI,kBAAkB,GAAgB,IAAI,CAAC;AAE3C,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACtE,SAAS,CAAC,UAAU,EAAE,CAAC;QACvB,kBAAkB,GAAG,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkB;IAElB,MAAM,kBAAkB,EAAE,CAAC;IAC3B,IAAI,CAAC,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAEhF,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE3D,MAAM,WAAW,GAAgB;YAC/B,GAAG,aAAa,CAAC,OAAO;YACxB,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,IAAmC,CAAC,IAAI,MAAM;SAC1F,CAAC;QAEF,MAAM,gBAAgB,GAAsB,aAAa,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAEjF,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type LightNode } from '@waku/sdk';
|
|
2
|
+
import { MessageData } from '../interfaces/message.js';
|
|
3
|
+
export declare class Waku {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private wakuNode;
|
|
6
|
+
private readonly chatTopic;
|
|
7
|
+
private readonly onMessage;
|
|
8
|
+
private initPromise;
|
|
9
|
+
constructor(chatTopic: string, onMessage: (msg: MessageData) => void, node?: LightNode);
|
|
10
|
+
private init;
|
|
11
|
+
private createWakuLightNode;
|
|
12
|
+
private createWakuDecoder;
|
|
13
|
+
private subscribeToTopic;
|
|
14
|
+
private handleWakuMessage;
|
|
15
|
+
isReady(): Promise<boolean>;
|
|
16
|
+
stop(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Waku.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Waku.d.ts","sourceRoot":"","sources":["../../src/waku/Waku.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,KAAK,SAAS,EAAa,MAAM,WAAW,CAAC;AAGhH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,WAAW,CAAgB;gBAEvB,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;YAOxE,IAAI;YAMJ,mBAAmB;IAajC,OAAO,CAAC,iBAAiB;YAaX,gBAAgB;IAK9B,OAAO,CAAC,iBAAiB,CAWvB;IAMW,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAa3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAanC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createDecoder, createLightNode, Protocols } from '@waku/sdk';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { WAKU_CLUSTER_ID } from '../lib/constants.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
import { decodeMessagePayload } from '../waku/ProtoMessage.js';
|
|
6
|
+
export class Waku {
|
|
7
|
+
constructor(chatTopic, onMessage, node) {
|
|
8
|
+
this.logger = Logger.getInstance();
|
|
9
|
+
this.wakuNode = null;
|
|
10
|
+
this.handleWakuMessage = async ({ payload }) => {
|
|
11
|
+
try {
|
|
12
|
+
if (!payload)
|
|
13
|
+
return this.logger.warn('Received Waku message without payload');
|
|
14
|
+
const { message } = await decodeMessagePayload(payload);
|
|
15
|
+
if (!message?.id)
|
|
16
|
+
return this.logger.warn('Received invalid message structure via Waku');
|
|
17
|
+
this.onMessage(message);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
this.logger.error('Failed to decode Waku message:', error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
this.chatTopic = chatTopic;
|
|
24
|
+
this.onMessage = onMessage;
|
|
25
|
+
this.wakuNode = node || null;
|
|
26
|
+
this.initPromise = this.init();
|
|
27
|
+
}
|
|
28
|
+
async init() {
|
|
29
|
+
this.wakuNode = this.wakuNode ?? (await this.createWakuLightNode());
|
|
30
|
+
if (!(await this.subscribeToTopic()))
|
|
31
|
+
throw new Error('Failed to subscribe to Waku topic');
|
|
32
|
+
this.logger.info(`Subscribed to Waku topic: ${this.chatTopic}`);
|
|
33
|
+
}
|
|
34
|
+
async createWakuLightNode() {
|
|
35
|
+
const node = await createLightNode({
|
|
36
|
+
defaultBootstrap: true,
|
|
37
|
+
networkConfig: { clusterId: WAKU_CLUSTER_ID },
|
|
38
|
+
});
|
|
39
|
+
await node.start();
|
|
40
|
+
await node.waitForPeers([Protocols.LightPush, Protocols.Filter], 30000);
|
|
41
|
+
this.logger.info(`Waku node ready: ${node.libp2p.peerId.toString()}`);
|
|
42
|
+
return node;
|
|
43
|
+
}
|
|
44
|
+
createWakuDecoder(topicName) {
|
|
45
|
+
if (!topicName?.trim())
|
|
46
|
+
throw new Error('Topic name must be a non-empty string');
|
|
47
|
+
const hash = createHash('sha256').update(topicName).digest('hex');
|
|
48
|
+
const shardId = Number(BigInt('0x' + hash) % 8n);
|
|
49
|
+
return createDecoder(`solarpunk-msrs/1/${topicName}/proto`, {
|
|
50
|
+
clusterId: WAKU_CLUSTER_ID,
|
|
51
|
+
shardId,
|
|
52
|
+
pubsubTopic: `/waku/2/rs/${WAKU_CLUSTER_ID}/${shardId}`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async subscribeToTopic() {
|
|
56
|
+
if (!this.wakuNode?.isStarted())
|
|
57
|
+
throw new Error('Waku node is not running');
|
|
58
|
+
return this.wakuNode.filter.subscribe(this.createWakuDecoder(this.chatTopic), this.handleWakuMessage);
|
|
59
|
+
}
|
|
60
|
+
async isReady() {
|
|
61
|
+
try {
|
|
62
|
+
await this.initPromise;
|
|
63
|
+
return this.wakuNode?.isStarted() ?? false;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async stop() {
|
|
70
|
+
try {
|
|
71
|
+
await this.initPromise;
|
|
72
|
+
if (this.wakuNode) {
|
|
73
|
+
await this.wakuNode.stop();
|
|
74
|
+
this.wakuNode = null;
|
|
75
|
+
this.logger.info('Waku node stopped successfully');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.logger.error('Error stopping Waku node:', error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=Waku.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Waku.js","sourceRoot":"","sources":["../../src/waku/Waku.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
syntax = "proto3";
|
|
2
|
+
|
|
3
|
+
enum MessageType {
|
|
4
|
+
TEXT = 0;
|
|
5
|
+
THREAD = 1;
|
|
6
|
+
REACTION = 2;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
message MessageData {
|
|
10
|
+
string id = 1;
|
|
11
|
+
optional string targetMessageId = 2;
|
|
12
|
+
MessageType type = 3;
|
|
13
|
+
string message = 4;
|
|
14
|
+
string username = 5;
|
|
15
|
+
string address = 6;
|
|
16
|
+
uint64 timestamp = 7;
|
|
17
|
+
string signature = 8;
|
|
18
|
+
uint32 index = 9;
|
|
19
|
+
string chatTopic = 10;
|
|
20
|
+
string userTopic = 11;
|
|
21
|
+
optional string additionalProps = 12;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
message MessageStateRef {
|
|
25
|
+
string reference = 1;
|
|
26
|
+
uint64 timestamp = 2;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
message MessagePayload {
|
|
30
|
+
MessageData message = 1;
|
|
31
|
+
repeated MessageStateRef messageStateRefs = 2;
|
|
32
|
+
}
|
|
33
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solarpunkltd/swarm-chat-js",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "JS library for chatting on Swarm",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.esm.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
},
|
|
21
21
|
"author": "levente.kiss@solarpunk.buzz",
|
|
22
22
|
"scripts": {
|
|
23
|
-
"build": "tsc &&
|
|
23
|
+
"build": "rimraf dist && tsc && npm run copy-proto",
|
|
24
|
+
"copy-proto": "mkdir -p dist/waku && cp src/waku/message.proto dist/waku/",
|
|
24
25
|
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
25
26
|
"lint:fix": "npm run lint -- --fix",
|
|
26
27
|
"prepare": "npm run build",
|
|
@@ -31,7 +32,9 @@
|
|
|
31
32
|
"@ethersphere/bee-js": "^9.0.3",
|
|
32
33
|
"cafe-utility": "^27.12.1",
|
|
33
34
|
"uuid": "^11.0.3",
|
|
34
|
-
"zod": "^3.24.1"
|
|
35
|
+
"zod": "^3.24.1",
|
|
36
|
+
"@waku/sdk": "^0.0.35",
|
|
37
|
+
"protobufjs": "^7.5.4"
|
|
35
38
|
},
|
|
36
39
|
"devDependencies": {
|
|
37
40
|
"@types/node": "^22.7.5",
|
|
@@ -46,6 +49,7 @@
|
|
|
46
49
|
"eslint-plugin-react-refresh": "^0.4.5",
|
|
47
50
|
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
48
51
|
"prettier": "^2.8.8",
|
|
52
|
+
"rimraf": "^6.0.1",
|
|
49
53
|
"typescript": "^5.2.2",
|
|
50
54
|
"vite": "^5.0.8",
|
|
51
55
|
"vite-plugin-dts": "^4.2.4",
|