From 1ad33ba4c8d5670e90c10e94a51fd9c35de05d33 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Thu, 12 May 2022 19:41:31 -0400 Subject: [PATCH] feat: adding gowaku functions to swift impl --- example/src/App.tsx | 13 +++-- ios/ReactNative.m | 121 ++++++++++++++++++++++++++++++++++++++++-- ios/ReactNative.swift | 116 ++++++++++++++++++++++++++++++++++++++-- src/index.tsx | 61 ++++++++++++--------- 4 files changed, 268 insertions(+), 43 deletions(-) diff --git a/example/src/App.tsx b/example/src/App.tsx index 50309f4..e467276 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,10 +1,7 @@ import * as React from 'react'; import { StyleSheet, View, Text } from 'react-native'; -import { defaultPubsubTopic, listenAddresses, newNode, onMessage, peerID, relayEnoughPeers, relayPublish, relaySubscribe, relayUnsubscribe, start, stop, WakuMessage, connect, peerCnt, peers } from '@waku/react-native'; - - - +import { defaultPubsubTopic, newNode, start, stop, peerID, relayEnoughPeers, listenAddresses, connect, peerCnt, peers, relayPublish, relayUnsubscribe, relaySubscribe, WakuMessage/*, onMessage*/ } from '@waku/react-native'; export default function App() { const [result, setResult] = React.useState(); @@ -12,17 +9,19 @@ export default function App() { React.useEffect(() => { (async () => { - await newNode(); // TODO: This must be called only once + await newNode(null); // TODO: This must be called only once await start(); // // TODO: This must be called only once console.log("The node ID:", await peerID()) await relaySubscribe() + /* + // TODO: this is only implemented in android for now onMessage(event => { console.log("Message Received: ", event) - }) + */ console.log("enoughPeers?", await relayEnoughPeers()) console.log("addresses", await listenAddresses()) @@ -46,7 +45,7 @@ export default function App() { console.log("The messageID", messageID) await relayUnsubscribe(); - + await stop(); // TODO: This must be called only once })(); diff --git a/ios/ReactNative.m b/ios/ReactNative.m index 8c9e138..0a875e7 100644 --- a/ios/ReactNative.m +++ b/ios/ReactNative.m @@ -2,13 +2,124 @@ @interface RCT_EXTERN_MODULE(ReactNative, NSObject) -RCT_EXTERN_METHOD(multiply:(float)a withB:(float)b - withResolver:(RCTPromiseResolveBlock)resolve - withRejecter:(RCTPromiseRejectBlock)reject) - - RCT_EXTERN_METHOD(defaultPubsubTopic: (RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject) +RCT_EXTERN_METHOD(newNode:(NSString *)config + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(start: + (RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(stop: + (RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(peerID: + (RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(relayEnoughPeers:(NSString *)topic + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(listenAddresses: + (RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(connect:(NSString *)address + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(peerCnt: + (RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(peers: + (RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(relaySubscribe:(NSString *)topic + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(relayUnsubscribe:(NSString *)topic + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(relayPublish:(NSString *)msg + withTopic:(NSString *)topic + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(relayPublishEncodeAsymmetric:(NSString *)msg + withTopic:(NSString *)topic + withPublicKey:(NSString *)publicKey + withOptionalSigningKey:(NSString *)optionalSigningKey + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(relayPublishEncodeSymmetric:(NSString *)msg + withTopic:(NSString *)topic + withSymmetricKey:(NSString *)symmetricKey + withOptionalSigningKey:(NSString *)optionalSigningKey + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(addPeer:(NSString *)addr + withProtocol:(NSString *)proto + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(connectPeerID:(NSString *)peerID + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(disconnect:(NSString *)peerID + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(lightpushPublish:(NSString *)msg + withTopic:(NSString *)topic + withPeerID:(NSString *)peerID + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(lightpushPublishEncodeAsymmetric:(NSString *)msg + withTopic:(NSString *)topic + withPeerID:(NSString *)peerID + withPublicKey:(NSString *)publicKey + withOptionalSigningKey:(NSString *)optionalSigningKey + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(lightpushPublishEncodeSymmetric:(NSString *)msg + withTopic:(NSString *)topic + withPeerID:(NSString *)peerID + withSymmetricKey:(NSString *)symmetricKey + withOptionalSigningKey:(NSString *)optionalSigningKey + withMs:(nonnull NSNumber *)ms + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(decodeSymmetric:(NSString *)msg + withSymmetricKey:(NSString *)symmetricKey + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(decodeAsymmetric:(NSString *)msg + withPrivateKey:(NSString *)privateKey + withResolver:(RCTPromiseResolveBlock)resolve + withRejecter:(RCTPromiseRejectBlock)reject) + @end diff --git a/ios/ReactNative.swift b/ios/ReactNative.swift index fac96dd..6fbbaf9 100644 --- a/ios/ReactNative.swift +++ b/ios/ReactNative.swift @@ -3,13 +3,119 @@ import Gowaku @objc(ReactNative) class ReactNative: NSObject { - @objc(multiply:withB:withResolver:withRejecter:) - func multiply(a: Float, b: Float, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { - resolve(a*b) - } - @objc(defaultPubsubTopic:withRejecter:) func defaultPubsubTopic(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { resolve(GowakuDefaultPubsubTopic()) } + + @objc(newNode:withResolver:withRejecter:) + func newNode(config: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuNewNode(config)) + } + + @objc(start:withRejecter:) + func start(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuStart()) + } + + @objc(stop:withRejecter:) + func stop(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuStop()) + } + + @objc(peerID:withRejecter:) + func peerID(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuPeerID()) + } + + @objc(relayEnoughPeers:withResolver:withRejecter:) + func relayEnoughPeers(topic: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuRelayEnoughPeers(topic)) + } + + @objc(listenAddresses:withRejecter:) + func listenAddresses(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuListenAddresses()) + } + + @objc(connect:withMs:withResolver:withRejecter:) + func connect(address: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuConnect(address, ms)) + } + + @objc(addPeer:withProtocol:withResolver:withRejecter:) + func addPeer(addr: String, proto: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuAddPeer(addr, proto)) + } + + @objc(connectPeerID:withMs:withResolver:withRejecter:) + func connectPeerID(peerID: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuConnect(peerID, ms)) + } + + @objc(disconnect:withResolver:withRejecter:) + func disconnect(peerID: String,resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuDisconnect(peerID)) + } + + @objc(peerCnt:withRejecter:) + func peerCnt(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuPeerCnt()) + } + + @objc(peers:withRejecter:) + func peers(_ resolve:RCTPromiseResolveBlock, withRejecter reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuPeers()) + } + + @objc(relaySubscribe:withResolver:withRejecter:) + func relaySubscribe(topic: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuRelaySubscribe(topic)) + } + + @objc(relayUnsubscribe:withResolver:withRejecter:) + func relayUnsubscribe(topic: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuRelayUnsubscribe(topic)) + } + + @objc(relayPublish:withTopic:withMs:withResolver:withRejecter:) + func relayPublish(msg: String, topic: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuRelayPublish(msg, topic, ms)) + } + + @objc(relayPublishEncodeAsymmetric:withTopic:withPublicKey:withOptionalSigningKey:withMs:withResolver:withRejecter:) + func relayPublishEncodeAsymmetric(msg: String, topic: String, publicKey: String, optionalSigningKey: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuRelayPublishEncodeAsymmetric(msg, topic, publicKey, optionalSigningKey, ms)) + } + + @objc(relayPublishEncodeSymmetric:withTopic:withSymmetricKey:withOptionalSigningKey:withMs:withResolver:withRejecter:) + func relayPublishEncodeSymmetric(msg: String, topic: String, symmetricKey: String, optionalSigningKey: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuRelayPublishEncodeSymmetric(msg, topic, symmetricKey, optionalSigningKey, ms)) + } + + @objc(lightpushPublish:withTopic:withPeerID:withMs:withResolver:withRejecter:) + func lightpushPublish(msg: String, topic: String, peerID: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuLightpushPublish(msg, topic, peerID, ms)) + } + + @objc(lightpushPublishEncodeAsymmetric:withTopic:withPeerID:withPublicKey:withOptionalSigningKey:withMs:withResolver:withRejecter:) + func lightpushPublishEncodeAsymmetric(msg: String, topic: String, peerID: String, publicKey: String, optionalSigningKey: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuLightpushPublishEncodeAsymmetric(msg, topic, peerID, publicKey, optionalSigningKey, ms)) + } + + @objc(lightpushPublishEncodeSymmetric:withTopic:withPeerID:withSymmetricKey:withOptionalSigningKey:withMs:withResolver:withRejecter:) + func lightpushPublishEncodeSymmetric(msg: String, topic: String, peerID: String, symmetricKey: String, optionalSigningKey: String, ms: Int, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuLightpushPublishEncodeSymmetric(msg, topic, peerID, symmetricKey, optionalSigningKey, ms)) + } + + @objc(decodeSymmetric:withSymmetricKey:withResolver:withRejecter:) + func decodeSymmetric(msg: String, symmetricKey: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuDecodeSymmetric(msg, symmetricKey)) + } + + @objc(decodeAsymmetric:withPrivateKey:withResolver:withRejecter:) + func decodeAsymmetric(msg: String, privateKey: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void { + resolve(GowakuDecodeAsymmetric(msg, privateKey)) + } + } diff --git a/src/index.tsx b/src/index.tsx index 5b67c7d..9bcc77e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,4 +1,4 @@ -import { NativeModules, Platform, NativeEventEmitter } from 'react-native'; +import { NativeModules, Platform /*, NativeEventEmitter */} from 'react-native'; import {decode, encode} from 'base-64' const LINKING_ERROR = @@ -18,24 +18,27 @@ const ReactNative = NativeModules.ReactNative } ); +export class WakuMessage { + payload: Uint8Array = new Uint8Array(); + contentTopic: String | null = ""; + version: Number | null = 0; + timestamp: Number | null = null; + + toJSON(){ + const b64encoded = encode(String.fromCharCode(...this.payload)); + return { + contentTopic: this.contentTopic, + version: this.version, + timestamp: this.timestamp, + payload: b64encoded + } + } + } + +/* +// TODO: this has been only implemented in android for now var eventEmitter = new NativeEventEmitter(NativeModules.ToastExample); -export class WakuMessage { - payload: Uint8Array = new Uint8Array(); - contentTopic: String | null = ""; - version: Number | null = 0; - timestamp: Number | null = null; - - toJSON(){ - const b64encoded = encode(String.fromCharCode(...this.payload)); - return { - contentTopic: this.contentTopic, - version: this.version, - timestamp: this.timestamp, - payload: b64encoded - } - } -} export function onMessage(cb: (arg0:any) => void) { eventEmitter.addListener("message", event => { @@ -49,6 +52,7 @@ export function onMessage(cb: (arg0:any) => void) { cb(signal); }) } +*/ export class Config { host: String | null = null @@ -116,10 +120,10 @@ export function relayPublish(msg: WakuMessage, topic: String = "", ms: Number = }); } -export function relayPublishEncodeAsymmetric(msg: WakuMessage, publicKey: String, topic: String = "", ms: Number = 0): Promise { +export function relayPublishEncodeAsymmetric(msg: WakuMessage, publicKey: String, optionalSigningKey: String = "", topic: String = "", ms: Number = 0): Promise { return new Promise(async (resolve, reject) => { let messageJSON = JSON.stringify(msg) - let response = JSON.parse(await ReactNative.relayPublishEncodeAsymmetric(messageJSON, topic, publicKey, ms)); + let response = JSON.parse(await ReactNative.relayPublishEncodeAsymmetric(messageJSON, topic, publicKey, optionalSigningKey, ms)); if(response.error){ reject(response.error); } else { @@ -128,10 +132,10 @@ export function relayPublishEncodeAsymmetric(msg: WakuMessage, publicKey: String }); } -export function relayPublishEncodeSymmetric(msg: WakuMessage, symmetricKey: String, topic: String = "", ms: Number = 0): Promise { +export function relayPublishEncodeSymmetric(msg: WakuMessage, symmetricKey: String, optionalSigningKey: String = "", topic: String = "", ms: Number = 0): Promise { return new Promise(async (resolve, reject) => { let messageJSON = JSON.stringify(msg) - let response = JSON.parse(await ReactNative.relayPublishEncodeAsymmetric(messageJSON, topic, symmetricKey, ms)); + let response = JSON.parse(await ReactNative.relayPublishEncodeAsymmetric(messageJSON, topic, symmetricKey, optionalSigningKey, ms)); if(response.error){ reject(response.error); } else { @@ -295,10 +299,15 @@ export function relayUnsubscribe(topic: String = ""): Promise { }); } + + + + + export function lightpushPublish(msg: WakuMessage, topic: String = "", peerID: String = "", ms: Number = 0): Promise { return new Promise(async (resolve, reject) => { let messageJSON = JSON.stringify(msg) - let response = JSON.parse(await ReactNative.relayPublish(messageJSON, topic, peerID, ms)); + let response = JSON.parse(await ReactNative.lightpushPublish(messageJSON, topic, peerID, ms)); if(response.error){ reject(response.error); } else { @@ -307,10 +316,10 @@ export function lightpushPublish(msg: WakuMessage, topic: String = "", peerID: S }); } -export function lightpushPublishEncAsymmetric(msg: WakuMessage, publicKey: String, topic: String = "", peerID: String = "", ms: Number = 0): Promise { +export function lightpushPublishEncAsymmetric(msg: WakuMessage, publicKey: String, optionalSigningKey: String = "", topic: String = "", peerID: String = "", ms: Number = 0): Promise { return new Promise(async (resolve, reject) => { let messageJSON = JSON.stringify(msg) - let response = JSON.parse(await ReactNative.relayPublishEncodeAsymmetric(messageJSON, topic, peerID, publicKey, ms)); + let response = JSON.parse(await ReactNative.lightpushPublishEncodeAsymmetric(messageJSON, topic, peerID, publicKey, optionalSigningKey, ms)); if(response.error){ reject(response.error); } else { @@ -319,10 +328,10 @@ export function lightpushPublishEncAsymmetric(msg: WakuMessage, publicKey: Strin }); } -export function lightpushPublishEncSymmetric(msg: WakuMessage, symmetricKey: String, topic: String = "", peerID: String = "", ms: Number = 0): Promise { +export function lightpushPublishEncSymmetric(msg: WakuMessage, symmetricKey: String, optionalSigningKey: String = "", topic: String = "", peerID: String = "", ms: Number = 0): Promise { return new Promise(async (resolve, reject) => { let messageJSON = JSON.stringify(msg) - let response = JSON.parse(await ReactNative.relayPublishEncodeAsymmetric(messageJSON, topic, peerID, symmetricKey, ms)); + let response = JSON.parse(await ReactNative.lightpushPublishEncodeAsymmetric(messageJSON, topic, peerID, symmetricKey, optionalSigningKey, ms)); if(response.error){ reject(response.error); } else {