From 9267453444d823a79896ea4d74a7512914f4081f Mon Sep 17 00:00:00 2001 From: Maxim Belov Date: Tue, 17 Sep 2024 13:11:23 +0300 Subject: [PATCH] feat(sockets-udp): add plugin --- .../plugins/sockets-udp/index.ts | 266 ++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 src/@awesome-cordova-plugins/plugins/sockets-udp/index.ts diff --git a/src/@awesome-cordova-plugins/plugins/sockets-udp/index.ts b/src/@awesome-cordova-plugins/plugins/sockets-udp/index.ts new file mode 100644 index 0000000000..9380fa9293 --- /dev/null +++ b/src/@awesome-cordova-plugins/plugins/sockets-udp/index.ts @@ -0,0 +1,266 @@ +import { Injectable } from '@angular/core'; +import { Plugin, Cordova, AwesomeCordovaNativePlugin, CordovaProperty } from '@awesome-cordova-plugins/core'; +import { Observable, fromEventPattern } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; + +/** + * @name SocketsUdp + * @description + * This plugin provides UDP sockets for Android and iOS. + * @usage + * ```typescript + * import { SocketsUdp } from '@awesome-cordova-plugins/sockets-udp/ngx'; + * + * constructor(private socketsUdp: SocketsUdp) { } + * + * ... + * + * this.platform.ready().then(() => { + * this.socketsUdp.getSockets() + * .then((result: any) => console.log(res)) + * .catch((error: any) => console.error(error)); + * }) + * + * ``` + */ +@Plugin({ + pluginName: 'SocketsUdp', + plugin: 'cordova-plugin-chrome-apps-sockets-udp', + pluginRef: 'chrome.sockets.udp', + repo: 'https://github.com/herdwatch-apps/cordova-plugin-chrome-apps-sockets-udp', + platforms: ['Android', 'iOS'], +}) +@Injectable() +export class SocketsUdp extends AwesomeCordovaNativePlugin { + @CordovaProperty() + onReceive: SocketUdpEvent; + + @CordovaProperty() + onReceiveError: SocketUdpEvent; + + /** + * + * @param properties + */ + @Cordova() + create(properties: { persistent?: number; name?: string; bufferSize?: number }): Promise { + return; + } + + /** + * + * @param socketId + * @param properties + */ + @Cordova() + update(socketId: number, properties: any): Promise { + return; + } + + /** + * + * @param socketId + * @param paused + */ + @Cordova() + setPaused(socketId: number, paused: boolean): Promise { + return; + } + + /** + * + * @param socketId + * @param address + * @param port + */ + @Cordova() + bind(socketId: number, address: string, port: number): Promise { + return; + } + + /** + * + * @param socketId + * @param data + * @param address + * @param port + */ + @Cordova() + send(socketId: number, data: ArrayBuffer, address: string, port: number): Promise { + return; + } + + /** + * + * @param socketId + */ + @Cordova() + close(socketId: number): Promise { + return; + } + + /** + * + * @param socketId + */ + @Cordova() + getInfo(socketId: number): Promise { + return; + } + + /** + * + */ + @Cordova() + getSockets(): Promise { + return; + } + + /** + * + * @param socketId + * @param enabled + */ + @Cordova() + setBroadcast(socketId: number, enabled: any): Promise { + return; + } + + /** + * + * @param socketId + * @param address + */ + @Cordova() + joinGroup(socketId: number, address: number): Promise { + return; + } + + /** + * + * @param socketId + * @param address + */ + @Cordova() + leaveGroup(socketId: number, address: string): Promise { + return; + } + + /** + * + * @param socketId + * @param ttl + */ + @Cordova() + setMulticastTimeToLive(socketId: number, ttl: any): Promise { + return; + } + + /** + * + * @param socketId + * @param enabled + */ + @Cordova() + setMulticastLoopbackMode(socketId: number, enabled: boolean): Promise { + return; + } + + /** + * + * @param socketId + */ + @Cordova() + getJoinedGroups(socketId: number): Promise { + return; + } + + /** + * Watch all incoming data event + */ + public onReceiveData(): Observable { + return fromEventPattern( + (eventHandler) => this.onReceive.addListener(eventHandler), + (errorEventHandler) => this.onReceive.removeListener(errorEventHandler) + ).pipe( + map((socketUdpDataInfo: SocketUdpDataInfo) => { + socketUdpDataInfo.dataAsString = socketUdpDataInfo.data + ? new TextDecoder().decode(socketUdpDataInfo.data).trim() + : null; + return socketUdpDataInfo; + }) + ); + } + + /** + * Watch socket incoming data + * @param socketId + */ + public onReceiveDataBySocketId(socketId: number): Observable { + return this.onReceiveData().pipe(filter((socketDataInfo) => socketDataInfo.socketId === socketId)); + } + + /** + * Watch all sockets incoming error event listener + */ + public onReceiveDataError(): Observable { + return fromEventPattern( + (eventHandler) => this.onReceiveError.addListener(eventHandler), + (errorEventHandler) => this.onReceiveError.removeListener(errorEventHandler) + ); + } + + /** + * Watch socket incoming error event listener + * @param socketId + */ + public onReceiveDataErrorBySocketId(socketId: number): Observable { + return this.onReceiveDataError().pipe(filter((socketUdpErrorInfo) => socketUdpErrorInfo.socketId === socketId)); + } +} + +export interface SocketUdpInfo { + socketId: number; + persistent?: boolean; + bufferSize?: number; + name?: string; + paused?: boolean; + localAddress?: string; + localPort?: number; + [key: string]: any; +} + +export interface SocketUdpDataInfo { + socketId: number; + data: ArrayBuffer; + dataAsString: string; + remoteAddress: string; + remotePort: number; +} + +export interface SocketUdpErrorInfo { + message: string; + resultCode: number; + socketId: number; +} + +interface SocketUdpEvent { + addListener(cb: (...args: any[]) => void): void; + + removeListener(cb: (...args: any[]) => void): void; + + fire(): void; + + hasListener(): boolean; + + hasListeners(): boolean; + + // Stub + addRules(): void; + + // Stub + getRules(): void; + + // Stub + removeRules(): void; +}