- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 Smart Mobile Studio 中包装 peerjs 库。
但是我不确定包装规则是什么。
我查看了 RTL 单元并试图从中推断出一些规则。
然而,一些问题仍然存在。
(function(exports){
var binaryFeatures = {};
binaryFeatures.useBlobBuilder = (function(){
...
})();
Peer.js
从一个看起来像匿名函数的东西开始,只有一个参数(导出)。
binaryFeatures
的以下包装是否正确?
type
JBinaryFeatures = class external 'binaryFeatures'
public
function useBlobBuilder: boolean; external 'useBlobBuilder';
function useArrayBufferView: boolean; external 'useArrayBufferView';
end;
接下来是函数“EventEmitter”,用作连接类(Peer/DataConnection 等)的原型(prototype)。
我如何告诉 SMS JPeer 继承自 JEventEmitter?
我试过:
JPeer = class{(TEventEmitter)} external 'Peer'
但是这是不合法的。
最后,Peer.js 中定义的一些类从未分配给变量,而是在某个类中动态实例化。
我是为这些类使用 external 'Object'
构造,还是根据 Peer.js
文件命名它们?
JNegotiator = class external 'Negotiator'
JNegotiator = class external 'Object'
下面是我尝试编写一个包装器和需要包装的 Peer.js 文件。
PeerWrapper.pas
unit PeerWrapper;
interface
{$R 'file:peer.js'}
uses
SmartCL.System;
type
JBinaryFeatures = class external 'binaryFeatures'
public
function useBlobBuilder: boolean; external 'useBlobBuilder';
function useArrayBufferView: boolean; external 'useArrayBufferView';
end;
// Parent class for the packing functions inside the connections.
// TBinaryPack = class external 'binaryPack'
// public
// function unpack(data: variant): variant; external 'unpack';
// function pack(data: variant): variant; external 'pack';
// end;
JReliable = class;
JUtil = class;
JPeer = class;
JDataConnection = class;
JMediaConnection = class;
//var
// FBlobBuilder: variant; external 'BlobBuilder';
// FBinaryFeatures: TBinaryFeatures; external 'binaryFeatures';
// //FBinaryPack: TBinaryPack;
// FReliable: TReliable; external 'reliable';
// FUtil: TUtil; external 'util';
// FPeer: TPeer; external 'Peer';
// FRTCSessionDescription: variant;
// FRTCPeerConnection: variant;
// FRTCIceCandidate: variant;
type
// Parent class for socket type connections.
JEventEmitter = class external 'eventEmitter'
public
constructor Create; external 'EventEmitter';
function addListener(&type, listener, scope, once: variant): TEventEmitter; external 'addListener';
function &on(&type, listener, scope, once: variant): TEventEmitter; external 'on';
function once(&type, listener, scope: variant): TEventEmitter; external 'once';
function removeListener(&type, listener, scope: variant): TEventEmitter; external 'removeListener';
function off(&type, listener, scope: variant): TEventEmitter; external 'off';
function removeAllListeners(&type: variant): TEventEmitter; external 'removeAllListeners';
function listeners(&type: variant): variant; external 'listeners';
function emit(&type: variant): boolean; external 'emit'; //vararg function
end;
JReliable = class external 'reliable'
public
constructor Create(dc, debug: variant); external 'Reliable';
procedure send(msg: variant); external 'send';
function higherBandwidthSDP(sdp: string): string; external 'higherBandwidthSDP';
function onmessage(msg: variant): variant; external 'onmessage';
end;
JUtil = class external 'util'
private
FCloud_host: string; external 'CLOUD_HOST';
FCloud_port: string; external 'CLOUD_PORT';
chunkedBrowsers: variant; external 'chunkedBrowsers';
chunkedMTU: integer; external 'chunkedMTU';
FLogLevel: integer; external 'logLevel';
FDefaultConfig: variant; external 'defaultConfig';
FDebug: boolean; external 'debug';
public
procedure setLogLevel(level: integer); external 'setLogLevel';
procedure setLogFunction(fn: variant); external 'setLogFunction';
function browser: string; external 'browser';
function supports: variant; external 'supports';
function validateId(id: string): boolean; external 'validateId';
function validateKey(key: string): boolean; external 'validateKey';
function unpack(data: variant): variant; external 'unpack';
function pack(data: variant): variant; external 'pack';
procedure log; external 'log';
procedure setZeroTimeout(global: variant); external 'setZeroTimeout';
function chunk(blob: variant): variant; external 'chunk';
procedure blobToArrayBuffer(blob: variant; callback: variant); external 'blobToArrayBuffer';
procedure blobToBinaryString(blob: variant; callback: variant); external 'blobToBinaryString';
function binaryStringToArrayBuffer(binary: variant): variant; external 'binaryStringToArrayBuffer';
function randomToken: string; external 'randomToken';
function isSecure: boolean; external 'isSecure';
property CloudHost: string read FCloud_host;
property CloudPort: string read FCloud_port;
property LogLevel: integer read FLogLevel;
property DefaultConfig: variant read FDefaultConfig;
property Debug: boolean read FDebug;
end;
JPeer = class{(TEventEmitter)} external 'Peer'
public
//inherited from EventEmitter
function addListener(&type, listener, scope, once: variant): TEventEmitter; external 'addListener';
function &on(&type, listener, scope, once: variant): TEventEmitter; external 'on';
function once(&type, listener, scope: variant): TEventEmitter; external 'once';
function removeListener(&type, listener, scope: variant): TEventEmitter; external 'removeListener';
function off(&type, listener, scope: variant): TEventEmitter; external 'off';
function removeAllListeners(&type: variant): TEventEmitter; external 'removeAllListeners';
function listeners(&type: variant): variant; external 'listeners';
function emit(&type: variant): boolean; external 'emit'; //vararg function
public
constructor Create(id: string; options: variant); external 'Peer';
function connect(peer: TPeer; options: variant): TDataConnection; external 'connect';
function call(peer: TPeer; stream: variant; options: variant): TMediaConnection; external 'call';
function getConnection(peer: TPeer; id: string): TEventEmitter; external 'getConnection';
procedure emitError(&type: variant; err: variant); external 'emitError';
procedure destroy; external 'destroy';
procedure disconnect; external 'disconnect';
procedure reconnect; external 'reconnect';
procedure listAllPeers(callback: variant); external 'listAllPeers';
end;
JDataConnection = class{(TEventEmitter)} external 'DataConnection'
public
//inherited from TEventEmitter
function addListener(&type, listener, scope, once: variant): TEventEmitter; external 'addListener';
function &on(&type, listener, scope, once: variant): TEventEmitter; external 'on';
function once(&type, listener, scope: variant): TEventEmitter; external 'once';
function removeListener(&type, listener, scope: variant): TEventEmitter; external 'removeListener';
function off(&type, listener, scope: variant): TEventEmitter; external 'off';
function removeAllListeners(&type: variant): TEventEmitter; external 'removeAllListeners';
function listeners(&type: variant): variant; external 'listeners';
function emit(&type: variant): boolean; external 'emit'; //vararg function
public
constructor Create(peer: TPeer; provider, options: variant); external 'Peer.connect.DataConnection';
procedure initialize(DataChannel: variant); external 'initialize';
procedure close; external 'close';
procedure send(data: variant; chunked: boolean); external 'send';
procedure handleMessage(message: variant); external 'handleMessage';
end;
JMediaConnection = class{(TEventEmitter)} external 'mediaConnection'
public
//inherited from EventEmitter
function addListener(&type, listener, scope, once: variant): TEventEmitter; external 'addListener';
function &on(&type, listener, scope, once: variant): TEventEmitter; external 'on';
function once(&type, listener, scope: variant): TEventEmitter; external 'once';
function removeListener(&type, listener, scope: variant): TEventEmitter; external 'removeListener';
function off(&type, listener, scope: variant): TEventEmitter; external 'off';
function removeAllListeners(&type: variant): TEventEmitter; external 'removeAllListeners';
function listeners(&type: variant): variant; external 'listeners';
function emit(&type: variant): boolean; external 'emit'; //vararg function
public
constructor Create(peer: TPeer; provider, options: variant); external 'Peer.call.MediaConnection';
procedure addStream(remoteStream: variant); external 'addStream';
procedure handleMessage(message: variant); external 'handleMessage';
procedure answer(stream: variant); external 'answer';
procedure close; external 'close';
end;
JNegotiator = class external 'Negotiator'
public
procedure startConnection(connection, options: variant); external 'startConnection';
procedure cleanup(connection: variant); external 'cleanup';
procedure handleSDP(&type, connection, sdp: variant); external 'handleSDP';
procedure handleCandidate(connection, ice: variant); external 'handleCandidate';
end;
JSocket = class{(TEventEmitter)} external 'Socket'
public
//inherited from EventEmitter
function addListener(&type, listener, scope, once: variant): TEventEmitter; external 'addListener';
function &on(&type, listener, scope, once: variant): TEventEmitter; external 'on';
function once(&type, listener, scope: variant): TEventEmitter; external 'once';
function removeListener(&type, listener, scope: variant): TEventEmitter; external 'removeListener';
function off(&type, listener, scope: variant): TEventEmitter; external 'off';
function removeAllListeners(&type: variant): TEventEmitter; external 'removeAllListeners';
function listeners(&type: variant): variant; external 'listeners';
function emit(&type: variant): boolean; external 'emit'; //vararg function
public
constructor Create(secure: boolean; host: string; port: integer; path, key: string); external 'Socket';
procedure start(id: string; token: string); external 'start';
procedure send(data: variant); external 'send';
procedure close; external 'close';
end;
implementation
end.
链接到 github 上的 peer.js
https://github.com/peers/peerjs/blob/master/lib/peer.js
我如何正确地包装这个文件中的类?
最佳答案
peerjs中的匿名函数用于创建私有(private)作用域。
在 Pascal 术语中,匿名函数内部的内容就像“实现”部分中的代码,而分配给“导出”的内容就是将公开的内容,有点像“接口(interface)”部分。
因此外部无法访问 binaryFeatures 变量(至少不能从该代码片段访问)。
与其从 JS 代码开始,不如从文档开始,查看代码只是为了填补文档中的漏洞/歧义。
此外,由于 JS 没有适当的可见性管理,“私有(private)”方法和字段是通过模糊和匿名函数的混合来模仿的。例如,peerjs 源代码中以“_”为前缀的方法旨在作为私有(private)/ protected 方法,因此您不应该公开它们,即使它们可以在 JS 中访问。
因此您可以从 Peer 对象开始,公开其方法,然后公开这些方法使用/需要的对象。
其他需要知道的事情:
所以
procedure start(id, token: string); external 'start';
和
procedure start(id, token: string);
是相同的,但是如果你“帕斯卡化”这个名字,它就变得必要了:
procedure Start(id, token: string); external 'start';
因为 JS 是区分大小写的
关于javascript - 如何将js类包装到短信中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469232/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!