# owork.connect
**Repository Path**: fengssy/owork.connect
## Basic Information
- **Project Name**: owork.connect
- **Description**: 基于[数据传输协议]封装的客户端连接工具, 数据采用protobuf序列化, 内置websocket实现.
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-04-14
- **Last Updated**: 2022-09-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# owork.connect
## 介绍
基于[数据传输协议]封装的客户端连接工具, 数据采用protobuf序列化, 内置websocket实现.
### 数据传输协议
定义|说明
:-:|:-
传输方式|使用二进制传输
一个数据包|消息类型(ushort,2个字节)
+后面消息体长度(int,4个字节)
+消息体二进制数据
消息类型|为ushort类型,采用低位在前的方式转为byte[]
比如消息类型ushort值为10001,
二进制为00100111 00010001
存储为byte[]={00010001, 00100111}
即为:{17, 39}
消息体长度|为int类型,转换方式同消息类型
## 安装
npm i --save owork.connect
## 依赖
除了npm包依赖protobufjs之外, 还依赖外部实现:
./define/external.*.d.ts 需要外部实现的功能定义在这里了, 为了排除环境因素的设计
比如抽出ZWebsocket的定义,使用时可以根据不同的环境进行不同的定义,比如微信小程序,可以用微信的websocket类进行实现,H5就用原生的实现
./external/external.h5.* .js 为h5环境下的一套实现,可以参考使用
./external/external.node.* .js 为h5环境下的一套实现,可以参考使用
## 使用
### Client
#### 使用工厂来创建不同实现的客户端:
##### websocket作为客户端:
```javascript
ClientFactory.buildWebSocketClient()
```
### ProtobufHelper
**封装数据传输协议的序列化/反序列化操作, 以及一些拓展功能**
#### 1. pbjs: npm包,用来生成对应的proto类文件,自行百度资料
#### 2. 消息类型码映射为proto类
##### 2.1. 可自行实现类型码到proto类型的映射关系
```typescript
var protobufHelper = new ProtobufHelper(null, "proto里的包名",
(op) => 类型码op对应proto里的类, window或者global);
```
##### 2.2 也可用 [owork.connect.buildproto](https://www.npmjs.com/package/owork.connect.buildproto) 生成类型码的TS/JS类文件(仅支持windows)
### websocket例子:
```typescript
./test/websocket.js
```
### 搭配proto文件使用:
#### proto生成静态js的方式(推荐)
用参数: -t static-module -w commonjs
```bat
pbjs --no-create --no-verify --no-convert -t static-module -w commonjs -o ./输出.js ./输入.proto
```
nodejs环境的使用方式:
```typescript
import root from "./输出.js"
var protobufHelper = new ProtobufHelper(root, "proto里的命名空间" ,
(op) => MessageTypeCodes.CodeToName["Op_" + op], globalThis);
```
web环境的使用方式:
```html
```
#### 动态解析proto,或者json解析的方式
动态解析:
```javascript
protobuf.load("输入.proto", function(err, root) {
//用root传入ProtobufHelper构造的第一个参数
});
```
json解析方式1:
```javascript
protobuf.load("输入.json", function(err, root) {
//用root传入ProtobufHelper构造的第一个参数
});
```
json解析方式2:
```javascript
var jsonDescriptor = require("./输入.json");
//需要开启resolveJsonModule
//或者将pbjs生成的json内容加个前缀:"export const json=",然后生成的json改成js,采用模块化方式加载这个json对象
var root = protobuf.Root.fromJSON(jsonDescriptor);
//同样用这个root传入ProtobufHelper构造的第一个参数
```
更多请参考protobufjs官方文档: https://github.com/protobufjs/protobuf.js
## 更新日志
+ V0.0.7 默认改用编译好的js,同时提供各模块的声明文件
+ V0.0.6 ProtobufHelper全局注册使用globalThis作为默认值,补充sendRpc中的RpcId可用Long类型,将root开放传参,适用于多种环境
+ V0.0.5 补充源码地址
+ V0.0.4 分离命令行工具,减少依赖
+ V0.0.3 命令行工具升级,生成消息类型码js文件时会判断导出
+ V0.0.2 完成代码结构的重构,具备直接使用的能力,并包含单元测试(使用示例)
+ V0.0.1 初次上传的版本,基本功能,但代码零散
## 源码
https://gitee.com/fengssy/owork.connect