# wpsjsrpcsdk.js

用于wpsjs加载项，web端前端页面的编写

目前支持：
* 单进程模式：用户窗口下仅启动一个wps客户端，所有操作都会反映到该wps客户端下
* 多进程模式：用户窗口下可以启动多个wps客户端，通过使用WpsClient对象调用接口，可以将操作发送到对应的wps客户端上，不同wps客户端互不影响
* 多用户模式（目前仅windows）：多个用户同时登陆一个服务器时，每个用户窗口下可以独立地通过web端操作wps客户端，不同用户的操作互不影响；支持单进程模式和多进程模式


# 接口使用
## 管理wps加载项：
`WpsAddonMgr.getAllConfig`
> 获取publish.xml的内容
> 
> @param {*} callBack 回调函数

`WpsAddonMgr.verifyStatus`
> 检查ribbon.xml文件是否有效
> 
> @param {*} element   参数对象
> 
> @param {*} callBack  回调函数

`WpsAddonMgr.enable`
> 启用加载项
> 
> @param {*} element   参数对象
> 
> @param {*} callBack  回调函数

`WpsAddonMgr.disable`
> 禁用加载项
> 
> @param {*} element   参数对象
> 
> @param {*} callBack  回调函数

## 单进程模式：
`WpsInvoke.InvokeAsHttp`
> 以http协议启动wps
> 
> @param {*} clientType    加载项类型， wps / wpp / et
> 
> @param {*} name          加载项名称
> 
> @param {*} func          客户端加载项要执行的方法
> 
> @param {*} param         客户端加载项执行方法的参数
> 
> @param {*} callback      回调函数
> 
> @param {*} showToFront   设置客户端是否显示到前面
> 
> @param {*} jsPluginsXml  设置加载项路径
> 
> @param {*} silentMode    是否是静默启动

`WpsInvoke.InvokeAsHttps`
> 以https协议启动wps
> 
> @param {*} clientType    加载项类型， wps / wpp / et
> 
> @param {*} name          加载项名称
> 
> @param {*} func          客户端加载项要执行的方法
> 
> @param {*} param         客户端加载项执行方法的参数
> 
> @param {*} callback      回调函数
> 
> @param {*} showToFront   设置客户端是否显示到前面
> 
> @param {*} jsPluginsXml  设置加载项路径
> 
> @param {*} silentMode    是否是静默启动

`WpsInvoke.RegWebNotify`
> 注册一个前端页面接收WPS传来消息的方法
> 
> @param {*} clientType wps | et | wpp
> 
> @param {*} name WPS加载项的名称
> 
> @param {*} callback 回调函数

`WpsInvoke.CreateXHR`
> 创建一个xhr对象

`WpsInvoke.IsClientRunning`
> 当前客户端是否在运行，使用WpsInvoke.IsClientRunning()进行调用
> 
> @param {string} clientType       加载项类型
> 
> @param {function} [callback]     回调函数，返回值如下：
> 
> "Client is running." 客户端正在运行
> 
> "Client is not running." 客户端没有运行

`WpsInvoke.ClientType`
> 加载项类型
> 
> wps / et / wpp


## 多进程模式：
`var wpsClient = new WpsClient(WpsInvoke.ClientType.wps)`
> @constructor WpsClient           wps客户端
> 
> @param {string} clientType       必传参数，加载项类型，有效值为"wps","wpp","et"；分别表示文字，演示，电子表格

`wpsClient.InvokeAsHttp`
> 以http启动
> 
> @param {string} name              加载项名称
> 
> @param {string} func              要调用的加载项中的函数行
> 
> @param {string} param             在加载项中执行函数func要传递的数据
> 
> @param {function({int, string})} callback        回调函数，status == 0 表示成功，失败请查看message信息
> 
> @param {bool} showToFront         设置wps是否显示到前面来
> 
> @return {string}                  返回值：
> 
> "Failed to send message to WPS." 发送消息失败；
> 
> "WPS Addon is not response." 加载项阻塞，函数执行失败

`wpsClient.InvokeAsHttps`
> 以https启动
> 
> @param {string} name              加载项名称
> 
> @param {string} func              要调用的加载项中的函数行
> 
> @param {string} param             在加载项中执行函数func要传递的数据
> 
> @param {function({int, string})} callback        回调函数，status == 0 表示成功，失败请查看message信息
> 
> @param {bool} showToFront         设置wps是否显示到前面来

`wpsClient.onMessage`
> 消息注册函数的回调函数

`wpsClient.StartWpsInSilentMode`
> 以静默模式启动客户端
> 
> @param {string} name                 必传参数，加载项名称
> 
> @param {function({int, string})} [callback]         回调函数，status == 0 表示成功，失败请查看message信息

`wpsClient.ShowToFront`
> 显示客户端到最前面
> 
> @param {string} name             必传参数，加载项名称
> 
> @param {function({int, string})} [callback]     回调函数

`wpsClient.CloseSilentClient`
> 关闭未显示出来的静默启动客户端
> 
> @param {string} name             必传参数，加载项名称
> 
> @param {function({int, string})} [callback]     回调函数

`wpsClient.IsClientRunning`
> 当前客户端是否在运行，使用WpsClient.IsClientRunning()进行调用
> 
> @param {function({int, string})} [callback]      回调函数，返回值如下：
> 
> "Client is running." 客户端正在运行
> 
> "Client is not running." 客户端没有运行

`wpsClient.jsPluginsXml`
> 设置加载项路径

## 多用户模式：
`EnableMultiUser()`
> 启用多用户模式

# 接口实现
`startWps`
> web端给加载项本地服务发请求的接口
> 
> 如果是非同步请求，先判断上一次请求是否完成
> 
> 绝大多数请求都建议采用同步请求，防止阻塞造成卡死
> 
> 请求发送后，成功得到响应时根据本地服务返回的内容，生成返回值返回给前端；status == 0 表示该次请求执行成功，status != 0 表示该次请求执行失败，通过访问message获得失败信息

`WpsStart`
> 启动wps客户端，加载项执行操作，无返回值

`WpsStartWrap`
> 加载项本地服务版本为空时，通过该接口启动wps

`WpsStartWrapExInner`
> 启动wps客户端，加载项执行操作，有返回值，支持浏览器触发

`WpsStartWrapVersionInner`
> 获取加载项本地服务的版本号
> 
> 1.0.0原始版本
> 
> 1.0.1版本支持多进程
> 
> 1.0.2版本支持多用户（目前仅windows）

`RegWebNotify`
> 向加载项本地服务发送接收客户端消息的注册请求
> 
> 分为单进程和多进程：
> 
> 单进程的请求不含有clientId，客户端发的消息，所有注册的请求都能收到
> 
> 多进程的请求含有clientId，客户端发的消息，只有当前客户端对应的WpsClient对象能收到
> f
> 同时，onload里有做一个容错处理：
> 
> 如果客户端发的消息是字符串化后的json对象，sdk可以解析成功，并将该对象返回给html，html根据需要获得自己想要的json数据
> 
> 如果客户端发的消息不是标准的json格式数据导致json解析失败，sdk也会将用户数据提取出来返回给html
> 
> 这里还有一个心跳包的机制，默认是开启的，只有当浏览器版本过低不支持worker时才会关闭。开发者可以通过手动注释掉
> ```js
> HeartBeatWorker = new Worker(codeToBlob(HeartBeatCode));
> ```
> 这一段代码来关闭心跳包。这里增加心跳包是为了让客户端发的消息不丢失，都能到达web端。

`GetUrlBase`
> 加载项本地服务监听的端口，http为58890，https为58891
> 
> 默认使用http协议
> 
> 如果要修改监听端口，需要同步修改oem.ini配置

`wpsclient.InvokeAsHttp`
> 以http启动多进程模式客户端
> 
> 回调函数里如果执行失败，会调用传进来的回调函数，然后return
> 
> 如果使用不支持多进程的wps客户端调用该接口，回调函数里会调用传进来的回调函数，并发送接收消息的注册请求，然后return

`wpsclient.InvokeAsHttps`
> 以https启动多进程模式客户端

`wpsclient.RegWebNotify`
> 多进程模式用来调用发送接收消息注册请求的接口
> 外部无需调用，`InvokeAsHttp`的回调函数里调用了

`wpsclient.OnRegWebNotify`
> 多进程模式用来调用消息注册函数的回调函数

`wpsclient.StartWpsInSilentMode`
> 以静默启动模式启动一个wps客户端，逻辑与`InvokeAsHttp`相同，只是增加了一个`silentMode = true`的标记

`wpsclient.ShowToFront`
> 将wps客户端显示到最前面

`wpsclient.CloseSilentClient`
> 关闭没有显现出来的静默启动客户端

`wpsclient.IsClientRunning`
> 判断客户端是否正在运行



# 版本改动
version 1.0.1
- 支持加载项管理

version 1.0.2
- 重命名为wpsjsrpcsdk.js

version 1.0.3
- 修改入口文件

version 1.0.4
- 引入注册监听报错
- 获取插件信息失败重试修改为3次

version 1.0.5
- xhr对象创建修改

version 1.0.6
- 添加wps置顶参数，showtofront

version 1.0.7
- 支持多进程
- 实现自动发送注册请求
- 增加静默启动
- 增加判断客户端是否在运行
- 区别服务器版本

version 1.0.8
- 不支持多进程的wps客户端提示升级客户端

version 1.0.9
- 增加注册超时
- 支持多个加载项同时注册消息

version 1.0.10
- 处理sdk在ie11下的注册问题

version 1.0.11
- 统一url的调用入口

version 1.0.12
- 处理一个url调用错误

version 1.0.13
- 支持消息队列
- 增加心跳包，防止消息被清

version 1.0.14
- 心跳包的创建兼容ie10

version 1.0.15
- 保证非原生加载也能执行InitSdk
- 版本号获取之后，增加自定义协议的启动逻辑

version 1.0.16
- 支持多用户，兼容老版本
- 注册请求添加json解析失败的容错机制
- 接口添加注释
- 多进程接口兼容单进程客户端，保证接口可用，但实际上启动的是单进程客户端

version 1.0.17
- 增加多用户模式的开关，默认关闭多用户模式；想要支持多用户模式，html页面调用一次EnableMultiUser();即可

version 1.0.18
- 关闭多用户模式时，自定义协议去掉参数serverId，兼容linux

version 1.0.19
- 对安全提示弹框的优化，用户点击取消，不再发送注册请求；多进程下不再启动客户端，直接返回

version 1.0.20
- 多进程接口兼容单进程客户端

version 1.0.21
- 给自定义协议加个标记，同一时间保证只执行一次自定义协议

version 1.0.22
- 单进程模式增加静默启动参数
- 默认采用http协议
- 多进程模式全部改为同步请求，通过前端页面来控制避免启动同时启动多个客户端
- 多进程模式支持通过标记single转为单进程模式
- 加载项发送json数据时，直接将json对象返回给前端，前端自行取用json对象里的数据
- 重新处理一下json格式错误时的容错代码
- 增加根据状态码和错误信息返回对应的json数据
- 统一sdk返回的数据格式；加载项执行成功返回{status : 0, response ： responseStr}；加载项执行失败返回{status : 1/2/3/4, message ： errorMsg}；

version 1.0.23
- 注册消息的请求直接发，不要有延时了

version 1.0.24
- publish模式不用多用户时，不要带有serverId
- 开放加载项管理disableAll接口

version 1.0.25
- 重新整理初始化sdk获取服务版本号的流程

version 1.0.26
- 注册消息的请求根据状态码直接返回
- 将msgid的判断改成undefined，处理msgid==0时直接把消息返回给html的情况

version 1.0.27
- 去掉多余的错误判断，仅在有msgId的情况下才去手动解析json数据里data的值

version 1.0.28
- 开放加载项管理接口disableall，用于卸载所有加载项
- 加载项管理相关请求去掉超时
- 加载项管理相关请求增加时间戳，避免重复请求直接返回406报错
- 单进程客户端不处理WPSInnerMessage_quit消息，继续发送注册请求
- 多用户下子进程退出会返回消息"Subserver not available."，此时执行操作会调用自定义协议启动加载项本地服务
- 用户发送json数据，统一返回给前端json字符串，不再返回json对象

version 1.0.29
- 处理serverVersion被覆盖的问题，当返回值为Subserver not available.时，不去修改serverVersion的值，减少自定义协议的弹框

version 1.0.30
- 处理asknotify收到的消息为空的场景，将判断改为data不为未定义，原判断在data未空时不会直接返回data
- 处理多进程runparams返回值为空的场景，此时会导致json解析出错；手动解析出clientId和data的值，并将data的值返回

version 1.0.31
- 多用户下加载项的返回值统一为base64编码，sdk对收到的值进行解码
- 通过服务版本号1.0.3区分是否需要进行解码；同时对之前的版本处理json解析出错的情况 - 如发空值，发字符串
- 统一参数对象为wpsclient

version 1.1.31
- 新增websocket通讯，在http多次请求失败下，采用websocket协议请求，避免高版本浏览器对本地云服务请求的安全拦截