// Objective-C API for talking to terminalx/tsnetbridge/tsnetbridge Go package. // gobind -lang=objc terminalx/tsnetbridge/tsnetbridge // // File is generated by gobind. Do not edit. #ifndef __Tsnetbridge_H__ #define __Tsnetbridge_H__ @import Foundation; #include "ref.h" #include "Universe.objc.h" @class TsnetbridgeMoshRelay; @class TsnetbridgeNode; /** * MoshRelay 是一条 mosh-over-tsnet 的 UDP 中继: mosh-client 在本地把 UDP 包发到 127.0.0.1:,本中继逐包经 tsnet 转发到 tailnet 内 host:moshPort,回包再转回"最近一次上行的 client 源地址"(吸收 mosh 的 roaming/端口跳变)。 与 DialTCPFD 的差异:mosh 内部自建 UDP socket 并 connect(),无法注入外部 fd,故用 loopback relay。 */ @interface TsnetbridgeMoshRelay : NSObject { } @property(strong, readonly) _Nonnull id _ref; - (nonnull instancetype)initWithRef:(_Nonnull id)ref; - (nonnull instancetype)init; /** * Close 关闭中继(两条泵 goroutine 随即因 conn 关闭而退出)。 */ - (BOOL)close:(NSError* _Nullable* _Nullable)error; /** * LocalPort 返回 loopback relay 监听的端口(mosh_main 的 port 参数)。 */ - (long)localPort; @end /** * Node 包装一个嵌入式 tsnet 节点。gomobile 导出为引用型对象。 */ @interface TsnetbridgeNode : NSObject { } @property(strong, readonly) _Nonnull id _ref; - (nonnull instancetype)initWithRef:(_Nonnull id)ref; /** * NewNode 创建(不启动)一个 tsnet 节点。stateDir 唯一、hostname 展示在管理台。 */ - (nullable instancetype)init:(NSString* _Nullable)stateDir hostname:(NSString* _Nullable)hostname; /** * Close 释放节点。 */ - (BOOL)close:(NSError* _Nullable* _Nullable)error; /** * DialTCPFD 经 tsnet 连接 tailnet 内 host:port,返回一个已连接的 socket fd 供 libssh2 使用。 实现:tsnet.Dial 得到 net.Conn(netstack 虚拟连接,无真实 fd)→ socketpair(AF_UNIX) → 两条 goroutine 双向 io.Copy 泵 → 把 socketpair 的另一端 fd 返回给 Swift。 Swift 侧 close(fd) 会触发泵结束并关闭 tsConn。返回 -1 + error 表示失败。 */ - (BOOL)dialTCPFD:(NSString* _Nullable)hostOrIP port:(long)port timeoutMs:(long)timeoutMs ret0_:(int64_t* _Nullable)ret0_ error:(NSError* _Nullable* _Nullable)error; /** * PeersJSON 返回 tailnet 内其它节点列表(name/ip/online/os)的 JSON,用于选择连接目标。 */ - (NSString* _Nonnull)peersJSON; /** * SelfIP 返回本节点的 Tailscale IPv4(经 LocalClient().Status() 取;未就绪返回空串)。 */ - (NSString* _Nonnull)selfIP; /** * StartMoshRelay 建立中继并启动双向泵,返回句柄。Swift 用 LocalPort() 作为 mosh_main 的 port 参数、ip 传 "127.0.0.1"。失败返回 nil + error。timeoutMs 限制 tsnet UDP Dial 的建连等待。 */ - (TsnetbridgeMoshRelay* _Nullable)startMoshRelay:(NSString* _Nullable)host moshPort:(long)moshPort timeoutMs:(long)timeoutMs error:(NSError* _Nullable* _Nullable)error; /** * UpWithAuthKey 用 auth key 启动并等待 Running(timeoutMs 到则返回 error)。 gomobile 友好签名:基本类型入参、error 出参。 */ - (BOOL)upWithAuthKey:(NSString* _Nullable)authKey timeoutMs:(long)timeoutMs error:(NSError* _Nullable* _Nullable)error; @end /** * NewNode 创建(不启动)一个 tsnet 节点。stateDir 唯一、hostname 展示在管理台。 */ FOUNDATION_EXPORT TsnetbridgeNode* _Nullable TsnetbridgeNewNode(NSString* _Nullable stateDir, NSString* _Nullable hostname); #endif