Files
terminalX/artifacts/TsnetBridge.xcframework/ios-arm64/TsnetBridge.framework/Headers/Tsnetbridge.objc.h
kid 32520f09e0 feat: 完成 M2 mosh(LAN + tsnet 端到端验证)
- mosh(blinksh/ios C++)+protobuf-lite 交叉编译为 MoshCore.xcframework
  (CommonCrypto 后端、含 arm64 模拟器 slice;绕 autotools 用 CMake 直编 + 手写 config.h)
- tsnet 桥新增 UDP relay(StartMoshRelay:loopback↔tsnet.Dial 逐包搬运)
- MoshSession(pipe↔FILE*/pthread/SIGWINCH)+ MoshConnectScanner(TXCore,+4 单测=39)
- SSHTerminalModel 编排:SSH 引导 mosh-server→解析 MOSH CONNECT→relay→mosh 接管
- LAN 直连 + mosh-over-tsnet 均端到端验证通过,R1(tsnet UDP 数据报语义) 证伪

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-24 16:16:15 +08:00

88 lines
3.5 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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:<LocalPort>,本中继逐包经 tsnet 转发到
tailnet 内 host:moshPort回包再转回"最近一次上行的 client 源地址"(吸收 mosh 的 roaming/端口跳变)。
与 DialTCPFD 的差异mosh 内部自建 UDP socket 并 connect(),无法注入外部 fd故用 loopback relay。
*/
@interface TsnetbridgeMoshRelay : NSObject <goSeqRefInterface> {
}
@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 <goSeqRefInterface> {
}
@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.Connnetstack 虚拟连接,无真实 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 启动并等待 RunningtimeoutMs 到则返回 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