suanpan_node_sdk 2.0.0-beta.8 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +662 -70
  2. package/dist/api/index.d.ts +12 -0
  3. package/dist/api/index.js +55 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/core/common/constant.d.ts +6 -0
  6. package/dist/{constant.js → core/common/constant.js} +7 -2
  7. package/dist/core/common/constant.js.map +1 -0
  8. package/dist/{common → core/common}/exec.d.ts +0 -0
  9. package/dist/{common → core/common}/exec.js +0 -0
  10. package/dist/core/common/exec.js.map +1 -0
  11. package/dist/core/common/log.d.ts +3 -0
  12. package/dist/core/common/log.js +16 -0
  13. package/dist/core/common/log.js.map +1 -0
  14. package/dist/core/event/index.d.ts +6 -0
  15. package/dist/core/event/index.js +11 -0
  16. package/dist/core/event/index.js.map +1 -0
  17. package/dist/core/logkit/index.d.ts +33 -0
  18. package/dist/core/logkit/index.js +126 -0
  19. package/dist/core/logkit/index.js.map +1 -0
  20. package/dist/core/message/channel.d.ts +7 -0
  21. package/dist/core/message/channel.js +3 -0
  22. package/dist/core/message/channel.js.map +1 -0
  23. package/dist/core/message/channelFactory.d.ts +4 -0
  24. package/dist/core/message/channelFactory.js +11 -0
  25. package/dist/core/message/channelFactory.js.map +1 -0
  26. package/dist/core/message/index.d.ts +6 -0
  27. package/dist/core/message/index.js +19 -0
  28. package/dist/core/message/index.js.map +1 -0
  29. package/dist/core/message/message.d.ts +19 -0
  30. package/dist/core/message/message.js +60 -0
  31. package/dist/core/message/message.js.map +1 -0
  32. package/dist/core/message/messageBuilder.d.ts +12 -0
  33. package/dist/core/message/messageBuilder.js +51 -0
  34. package/dist/core/message/messageBuilder.js.map +1 -0
  35. package/dist/core/message/messageChain.d.ts +9 -0
  36. package/dist/core/message/messageChain.js +30 -0
  37. package/dist/core/message/messageChain.js.map +1 -0
  38. package/dist/core/message/messageListener.d.ts +4 -0
  39. package/dist/core/message/messageListener.js +12 -0
  40. package/dist/core/message/messageListener.js.map +1 -0
  41. package/dist/core/message/mq/index.d.ts +9 -0
  42. package/dist/core/message/mq/index.js +51 -0
  43. package/dist/core/message/mq/index.js.map +1 -0
  44. package/dist/core/message/mq/redis.d.ts +10 -0
  45. package/dist/core/message/mq/redis.js +92 -0
  46. package/dist/core/message/mq/redis.js.map +1 -0
  47. package/dist/core/parameter/commandArgs.d.ts +2 -0
  48. package/dist/core/parameter/commandArgs.js +23 -0
  49. package/dist/core/parameter/commandArgs.js.map +1 -0
  50. package/dist/core/parameter/environment.d.ts +84 -0
  51. package/dist/core/parameter/environment.js +102 -0
  52. package/dist/core/parameter/environment.js.map +1 -0
  53. package/dist/core/parameter/index.d.ts +7 -0
  54. package/dist/core/parameter/index.js +34 -0
  55. package/dist/core/parameter/index.js.map +1 -0
  56. package/dist/{script → core/script}/script-babel/babel.d.ts +0 -0
  57. package/dist/{script → core/script}/script-babel/babel.js +0 -0
  58. package/dist/core/script/script-babel/babel.js.map +1 -0
  59. package/dist/{script → core/script}/script-babel/plugin.d.ts +0 -0
  60. package/dist/{script → core/script}/script-babel/plugin.js +0 -0
  61. package/dist/core/script/script-babel/plugin.js.map +1 -0
  62. package/dist/{script → core/script}/script-constant.d.ts +0 -0
  63. package/dist/{script → core/script}/script-constant.js +0 -0
  64. package/dist/core/script/script-constant.js.map +1 -0
  65. package/dist/{script → core/script}/script-context.d.ts +1 -1
  66. package/dist/{script → core/script}/script-context.js +1 -1
  67. package/dist/core/script/script-context.js.map +1 -0
  68. package/dist/{script → core/script}/script-front.d.ts +0 -0
  69. package/dist/{script → core/script}/script-front.js +0 -0
  70. package/dist/core/script/script-front.js.map +1 -0
  71. package/dist/{script → core/script}/script-insert.d.ts +0 -0
  72. package/dist/{script → core/script}/script-insert.js +1 -1
  73. package/dist/core/script/script-insert.js.map +1 -0
  74. package/dist/{script → core/script}/script-manager.d.ts +0 -0
  75. package/dist/{script → core/script}/script-manager.js +2 -2
  76. package/dist/core/script/script-manager.js.map +1 -0
  77. package/dist/{script → core/script}/script-storage.d.ts +1 -1
  78. package/dist/{script → core/script}/script-storage.js +2 -2
  79. package/dist/core/script/script-storage.js.map +1 -0
  80. package/dist/{script → core/script}/script-support.d.ts +0 -0
  81. package/dist/{script → core/script}/script-support.js +1 -1
  82. package/dist/core/script/script-support.js.map +1 -0
  83. package/dist/{script → core/script}/script-template.d.ts +0 -0
  84. package/dist/{script → core/script}/script-template.js +0 -0
  85. package/dist/core/script/script-template.js.map +1 -0
  86. package/dist/{port.d.ts → core/service/port.d.ts} +1 -0
  87. package/dist/{port.js → core/service/port.js} +23 -8
  88. package/dist/core/service/port.js.map +1 -0
  89. package/dist/{latestStorage → core/storage}/minio.d.ts +7 -3
  90. package/dist/{latestStorage → core/storage}/minio.js +54 -14
  91. package/dist/core/storage/minio.js.map +1 -0
  92. package/dist/{latestStorage → core/storage}/oss.d.ts +5 -1
  93. package/dist/{latestStorage → core/storage}/oss.js +54 -3
  94. package/dist/core/storage/oss.js.map +1 -0
  95. package/dist/core/storage/storage.d.ts +37 -0
  96. package/dist/{latestStorage → core/storage}/storage.js +3 -15
  97. package/dist/core/storage/storage.js.map +1 -0
  98. package/dist/core/storage/storageFlusher.d.ts +12 -0
  99. package/dist/core/storage/storageFlusher.js +53 -0
  100. package/dist/core/storage/storageFlusher.js.map +1 -0
  101. package/dist/core/storage/storageLogger.d.ts +14 -0
  102. package/dist/core/storage/storageLogger.js +100 -0
  103. package/dist/core/storage/storageLogger.js.map +1 -0
  104. package/dist/core/storage/storagePath.d.ts +16 -0
  105. package/dist/core/storage/storagePath.js +50 -0
  106. package/dist/core/storage/storagePath.js.map +1 -0
  107. package/dist/core/storage/wrapperStorage.d.ts +6 -0
  108. package/dist/{latestStorage → core/storage}/wrapperStorage.js +5 -5
  109. package/dist/core/storage/wrapperStorage.js.map +1 -0
  110. package/dist/core/utils/flusher.d.ts +18 -0
  111. package/dist/core/utils/flusher.js +63 -0
  112. package/dist/core/utils/flusher.js.map +1 -0
  113. package/dist/core/utils/index.d.ts +55 -0
  114. package/dist/core/utils/index.js +238 -0
  115. package/dist/core/utils/index.js.map +1 -0
  116. package/dist/core/utils/number.d.ts +2 -0
  117. package/dist/core/utils/number.js +20 -0
  118. package/dist/core/utils/number.js.map +1 -0
  119. package/dist/{common → core/utils}/retry.d.ts +0 -0
  120. package/dist/{common → core/utils}/retry.js +0 -0
  121. package/dist/core/utils/retry.js.map +1 -0
  122. package/dist/core/utils/support.d.ts +3 -0
  123. package/dist/core/utils/support.js +28 -0
  124. package/dist/core/utils/support.js.map +1 -0
  125. package/dist/{web → core/web}/app.d.ts +0 -0
  126. package/dist/{web → core/web}/app.js +2 -2
  127. package/dist/core/web/app.js.map +1 -0
  128. package/dist/{web → core/web}/server.d.ts +0 -0
  129. package/dist/{web → core/web}/server.js +10 -10
  130. package/dist/core/web/server.js.map +1 -0
  131. package/dist/main.d.ts +5 -88
  132. package/dist/main.js +9 -37
  133. package/dist/main.js.map +1 -1
  134. package/dist/types/conmonTypes.d.ts +21 -0
  135. package/dist/types/conmonTypes.js +17 -0
  136. package/dist/types/conmonTypes.js.map +1 -0
  137. package/dist/types/index.d.ts +3 -0
  138. package/dist/types/index.js +16 -0
  139. package/dist/types/index.js.map +1 -0
  140. package/dist/types/{storage-types.d.ts → storageTypes.d.ts} +23 -9
  141. package/dist/types/{storage-types.js → storageTypes.js} +1 -1
  142. package/dist/types/storageTypes.js.map +1 -0
  143. package/dist/types/streamTypes.d.ts +21 -0
  144. package/dist/types/streamTypes.js +3 -0
  145. package/dist/types/streamTypes.js.map +1 -0
  146. package/package.json +5 -2
  147. package/dist/arguments.d.ts +0 -72
  148. package/dist/arguments.js +0 -69
  149. package/dist/arguments.js.map +0 -1
  150. package/dist/commandArgs.d.ts +0 -10
  151. package/dist/commandArgs.js +0 -18
  152. package/dist/commandArgs.js.map +0 -1
  153. package/dist/common/exec.js.map +0 -1
  154. package/dist/common/file.d.ts +0 -1
  155. package/dist/common/file.js +0 -18
  156. package/dist/common/file.js.map +0 -1
  157. package/dist/common/log.d.ts +0 -3
  158. package/dist/common/log.js +0 -11
  159. package/dist/common/log.js.map +0 -1
  160. package/dist/common/retry.js.map +0 -1
  161. package/dist/common/streamUtility.d.ts +0 -7
  162. package/dist/common/streamUtility.js +0 -42
  163. package/dist/common/streamUtility.js.map +0 -1
  164. package/dist/common/util.d.ts +0 -45
  165. package/dist/common/util.js +0 -175
  166. package/dist/common/util.js.map +0 -1
  167. package/dist/constant.d.ts +0 -1
  168. package/dist/constant.js.map +0 -1
  169. package/dist/dyParameter.d.ts +0 -5
  170. package/dist/dyParameter.js +0 -34
  171. package/dist/dyParameter.js.map +0 -1
  172. package/dist/eventLogger.d.ts +0 -29
  173. package/dist/eventLogger.js +0 -123
  174. package/dist/eventLogger.js.map +0 -1
  175. package/dist/global.d.ts +0 -9
  176. package/dist/global.js +0 -39
  177. package/dist/global.js.map +0 -1
  178. package/dist/latestStorage/minio.js.map +0 -1
  179. package/dist/latestStorage/oss.js.map +0 -1
  180. package/dist/latestStorage/path.d.ts +0 -9
  181. package/dist/latestStorage/path.js +0 -30
  182. package/dist/latestStorage/path.js.map +0 -1
  183. package/dist/latestStorage/storage.d.ts +0 -27
  184. package/dist/latestStorage/storage.js.map +0 -1
  185. package/dist/latestStorage/wrapperStorage.d.ts +0 -7
  186. package/dist/latestStorage/wrapperStorage.js.map +0 -1
  187. package/dist/mq.d.ts +0 -55
  188. package/dist/mq.js +0 -158
  189. package/dist/mq.js.map +0 -1
  190. package/dist/parameter.d.ts +0 -14
  191. package/dist/parameter.js +0 -94
  192. package/dist/parameter.js.map +0 -1
  193. package/dist/port.js.map +0 -1
  194. package/dist/previousStorage/local.d.ts +0 -12
  195. package/dist/previousStorage/local.js +0 -90
  196. package/dist/previousStorage/local.js.map +0 -1
  197. package/dist/previousStorage/minio.d.ts +0 -10
  198. package/dist/previousStorage/minio.js +0 -201
  199. package/dist/previousStorage/minio.js.map +0 -1
  200. package/dist/previousStorage/oss.d.ts +0 -27
  201. package/dist/previousStorage/oss.js +0 -153
  202. package/dist/previousStorage/oss.js.map +0 -1
  203. package/dist/previousStorage/storage.d.ts +0 -21
  204. package/dist/previousStorage/storage.js +0 -21
  205. package/dist/previousStorage/storage.js.map +0 -1
  206. package/dist/script/script-babel/babel.js.map +0 -1
  207. package/dist/script/script-babel/plugin.js.map +0 -1
  208. package/dist/script/script-constant.js.map +0 -1
  209. package/dist/script/script-context.js.map +0 -1
  210. package/dist/script/script-front.js.map +0 -1
  211. package/dist/script/script-insert.js.map +0 -1
  212. package/dist/script/script-manager.js.map +0 -1
  213. package/dist/script/script-storage.js.map +0 -1
  214. package/dist/script/script-support.js.map +0 -1
  215. package/dist/script/script-template.js.map +0 -1
  216. package/dist/socketSever.d.ts +0 -1
  217. package/dist/socketSever.js +0 -47
  218. package/dist/socketSever.js.map +0 -1
  219. package/dist/staticServer.d.ts +0 -5
  220. package/dist/staticServer.js +0 -30
  221. package/dist/staticServer.js.map +0 -1
  222. package/dist/types/storage-types.js.map +0 -1
  223. package/dist/web/app.js.map +0 -1
  224. package/dist/web/server.js.map +0 -1
package/README.md CHANGED
@@ -1,96 +1,688 @@
1
- ## 简介
2
- 目前 Node Sdk
1
+ # Table of contents
2
+ - [Introduction](#introduction)
3
+ - [Install](#install)
4
+ - [Quick Start](#quick-start)
5
+ - [Features](#features)
6
+ - [API Reference](#api-reference)
7
+ - [Parameter](#parameter)
8
+ - [.get([key])](#getkey)
9
+ - [Message](#message)
10
+ - [constructor(headers, payload)](#constructorheaders-payload)
11
+ - [headers](#headers)
12
+ - [payload](#payload)
13
+ - [MessageListener](#messagelistener)
14
+ - [.onMessage(messageHandler)](#onmessagemessagehandler)
15
+ - [MessageChannelFactory](#messagechannelfactory)
16
+ - [.createMessageChannel()](#createmessagechannel)
17
+ - [MessageChannel](#messagechannel)
18
+ - [.receiveMessage()](#receivemessage)
19
+ - [.sendMessage(message)](#sendmessagemessage)
20
+ - [MessageHandler](#messagehandler)
21
+ - [MessageChain](#messagechain)
22
+ - [constructor](#constructor)
23
+ - [.send(payload)](#sendpayload)
24
+ - [MessageBuilder](#messagebuilder)
25
+ - [.fromMessagePayload(message)](#frommessagepayloadmessage)
26
+ - [.fromMessageHeaders(message)](#frommessageheadersmessage)
27
+ - [.withPayload(payload)](#withpayloadpayload)
28
+ - [.setHeader(key, value)](#setheaderkey-value)
29
+ - [.setHeaderIfAbsent(key, value)](#setheaderifabsentkey-value)
30
+ - [.build()](#build)
31
+ - [Storage](#storage)
32
+ - [.append(objectName, content)](#appendobjectname-content)
33
+ - [.putObject(objectName, data)](#putobjectobjectname-data)
34
+ - [.listObjects(prefix, recursive)](#listobjectsprefix-recursive)
35
+ - [.fGetObject(objectName, filePath)](#fgetobjectobjectname-filepath)
36
+ - [.fPutObject(objectName, filePath)](#fputobjectobjectname-filepath)
37
+ - [.deleteObject(objectName)](#deleteobjectobjectname)
38
+ - [.deleteMultiObjects(objectNames)](#deletemultiobjectsobjectnames)
39
+ - [.checkObjectNameExist(objectName)](#checkobjectnameexistobjectname)
40
+ - [.getObjectToJSON(objectName)](#getobjecttojsonobjectname)
41
+ - [.getObjectToString(objectName)](#getobjecttostringobjectname)
42
+ - [.getObjectToBuffer(objectName)](#getobjecttobufferobjectname)
43
+ - [.getObjectToStream(objectName)](#getobjecttostreamobjectname)
44
+ - [StoragePath](#storagepath)
45
+ - [constructor([options])](#constructoroptions)
46
+ - [.getUserPath([userId])](#getuserpathuserid)
47
+ - [.getAppPath([appId])](#getapppathappid)
48
+ - [.getComponentPath([componentId])](#getcomponentpathcomponentid)
49
+ - [.getNodePath([nodeId])](#getnodepathnodeid)
50
+ - [.getAppLogPath(userId)](#getapplogpathuserid)
51
+ - [.getNodeLogPath(userId)](#getnodelogpathuserid-nodeid)
52
+ - [.getAppTempDir(userId)](#getapptempdiruserid)
53
+ - [ObjectStorageLogger](#objectstoragelogger)
54
+ - [constructor(options)](#constructoroptions-1)
55
+ - [.info(message[, flush])](#infomessage-flush)
56
+ - [.debug(message[, flush])](#debugmessage-flush)
57
+ - [.warn(message[, flush])](#warnmessage-flush)
58
+ - [.error(message[, flush])](#errormessage-flush)
59
+ - [EventLogger](#eventlogger)
60
+ - [.info(message)](#infomessage)
61
+ - [.debug(message)](#debugmessage)
62
+ - [.warn(message)](#warnmessage)
63
+ - [.error(message)](#errormessage)
64
+ - [Type Reference](#type-reference)
65
+ - [MessageHeaders](#messageheaders)
66
+ - [LogLevel](#loglevel)
67
+ - [StorageLoggerOptions](#storageloggeroptions)
68
+ - [Platform](#platform)
69
+ # Introduction
70
+ 算盘组件之间通过 Redis 消息队列进行消息通信,SDK 对 Redis 提供的 Stream API 进行了封装,提供了发送消息/对象存储等方法。
71
+ ![image.png](https://cdn.nlark.com/yuque/0/2021/png/502931/1630910242408-c966cd0d-34fe-4bf9-ac47-ac72d50cfe42.png#clientId=u685e5f8c-6bda-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=320&id=ube246cc1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=682&originWidth=1494&originalType=binary&ratio=1&rotation=0&showTitle=false&size=122605&status=done&style=none&taskId=ubb851989-49e6-45e1-a536-f14880aa017&title=&width=702)
3
72
 
4
- - 支持消息收发
5
- - 读取组件的右面板参数
6
- - Event Log Sender
7
- - 支持 oss 类型的 storage 功能 [beta]
73
+ [1.x 版本文档](https://github.com/xuelang-group/suanpan-node-sdk/blob/master/docs/1.x.x-version.md)
8
74
 
9
- [SDK 目录约定](https://xuelangyun.yuque.com/suanpan_doc/public/bokg7z)
75
+ [SDK 目录约定](https://xuelangyun.yuque.com/suanpan_doc/public/bokg7z)
76
+ # Install
10
77
 
11
- ## Installation
12
- ```powershell
13
- npm install suanpan_node_sdk -S
14
- // or beta
15
- npm install suanpan_node_sdk@beta -S
78
+ Make sure you have Node 10 or greater installed.
79
+ Get the library:
80
+ ```shell
81
+ $ npm install suanpan_node_sdk --save
16
82
  ```
17
- ## Docker
18
- 可以使用基础镜像 node_sdk_base:latest
19
- latest可替换为指定的SDK版本号
20
- 例如:
83
+ # Quick Start
84
+
85
+ ```typescript
86
+ import { MessageListener, MessageHandler } from 'suanpan_node_sdk';
87
+
88
+ const messageHandler: MessageHandler = (message, chain) => {
89
+ const headers = message.headers;
90
+ const payload = message.payload;
91
+
92
+ const requestId = headers.requestId;
93
+ const timestamp = headers.timestamp;
94
+
95
+ /** Business logic here */
96
+
97
+ chain.send({ // 发送消息
98
+ out1: 'xxxx',
99
+ out2: true,
100
+ out3: { success: true, result: [1, 2, 3] }
101
+ });
102
+ }
103
+
104
+ MessageListener.onMessage(messageHandler);
21
105
  ```
22
- ARG ARCH="amd64"
23
- FROM registry.cn-shanghai.aliyuncs.com/shuzhi-$ARCH/node_sdk_base:latest
106
+ # Features
107
+
108
+ - [获取右面板参数](#parameter)
109
+ - [流计算消息接受与发送](#messagelistener)
110
+ - [对象(OSS/MINIO)存储 API](#storage)
111
+ - [Logkit 结构化日志存储(EventLogger)](#eventlogger)
112
+ - [对象存储日志收集器(ObjectStorageLogger)](#objectstoragelogger)
113
+
114
+ # API Reference
115
+ ## Parameter
116
+
117
+ 获取配置参数,以及内置一些常用参数,例如:AppId,NodeId 等
118
+ ### .get([key])
119
+ Parameter Class 提供一个**静态方法** `.get([key])` 获取配置参数。
120
+
121
+ **parameters**:
122
+
123
+ - `key {string}`:参数名称。如果 key 为空,则获取“全部”配置参数。
124
+
125
+ **example**:
126
+ ```typescript
127
+ import { Parameter, JSONObject } from 'suanpan_node_sdk';
128
+ /**
129
+ * 内置参数
130
+ */
131
+ const userId = Parameter.UserId
132
+ const appId = Parameter.AppId;
133
+ const nodeId = Parameter.NodeId;
134
+ const componentId = Parameter.ComponentId;
135
+
136
+ /**
137
+ * 获取“单个”配置参数
138
+ */
139
+ const paramValue = Parameter.get<string>('paramKey');
140
+
141
+ /**
142
+ * 获取“全部”配置参数
143
+ */
144
+ const params = Parameter.get<JSONObject>();
24
145
  ```
146
+ ## Message
147
+
148
+ Message entity object. The constructor includes headers and payload. The message’s payload Object can not be set after the initial creation. However, the mutability of the header values themselves (or the payload Object) is intentionally left as a decision for the framework user.
149
+ #### constructor(headers, payload)
150
+ ##### headers
151
+
152
+ - headers { [MessageHeaders](#messageHeaders) } - Represents a collection of message headers for a message. **The built-in read-only headers are:**
153
+ - `requestId`:An identifier for this message instance.
154
+ - `timestamp`:The time the message was created. Changes each time a message is mutated.
155
+ ##### payload
156
+
157
+ - payload {Object} - The data type of payload should strictly comply with the input / output port conventions of suanpan, such as: `{ in1: 111 }, { out1: 222 }`. The content wrapped by the message can be any Javascript type, and because the interface is parameterized, you can retrieve the payload in a type-safe fashion.
158
+
159
+
25
160
 
26
- 基础镜像中 suanpan_node_sdk 通过全局安装
27
- 本地开发可以通过`npm install -D suanpan_node_sdk`来提供代码提示
161
+ **example:**
162
+ ```typescript
163
+ import { Message } from 'suanpan_node_sdk';
28
164
 
29
- ## 功能列表
30
- ### 1. 获得右面板配置参数(parameter)
31
- ```javascript
32
- const sp = require('suanpan_node_sdk').sp
33
- const spParameter = sp.parameter
34
- console.log(spParameter)
165
+ const customHeader = {
166
+ 'x-stream-id': 'xxxx'
167
+ };
168
+
169
+ const payload = {
170
+ out1: 100
171
+ };
172
+ const message = new Message(customHeader, payload);
173
+ ```
174
+ ## MessageListener
175
+
176
+ 流计算消息监听类,`MessageListener` 提供一个静态方法 `onMessage` 来处理发送的消息。
177
+ ### .onMessage(messageHandler)
178
+ **parameters:**
179
+
180
+ - messageHandler { [MessageHandler](#messageHandler) }:消息处理回调函数。
181
+
182
+ **example** 参照 [**Quick Start**](#quick-Start)
183
+ **​**
184
+
185
+ ## MessageChannelFactory
186
+
187
+ 消息双向管道工厂类,`MessageChannelFactory` 提供一个静态方法 `createMessageChannel` 返回 `MessageChannel` 消息双向管道实例。
188
+ ### .createMessageChannel()
189
+ **return:**
190
+
191
+ - [**MessageChannel**](#messageChannel)
192
+
193
+ **example:**
194
+ ```typescript
195
+ import { MessageChannelFactory } from 'suanpan_node_sdk';
196
+
197
+ (async () => {
198
+ const channel = MessageChannelFactory.createMessageChannel();
199
+ channel.receiveMessage().then(message => {
200
+ /** Business logic here */
201
+ });
202
+ })();
203
+ ```
204
+ ## MessageChannel
205
+
206
+ 消息双向通道**接口**,支撑流计算消息的**接收和发送。不支持用户显示创建,仅能从 MessageChannelFactory 创建**
207
+ ### .receiveMessage()
208
+ 接收消息,用户可以返回的 Message 自定义消息的处理逻辑。
209
+ **return:**
210
+
211
+ - Promise<[**Message**](#message)>
212
+ ### .sendMessage(message)
213
+ **parameters:**
214
+
215
+ - message { [Message](#message)} - 消息实例
216
+
217
+ ### MessageHandler
218
+
219
+ MessageHandler 是 Node SDK 定义的消息处理程序(此处仅表示函数类型),它作为回调函数注册到 channel 中。函数定义如下:
220
+ ```typescript
221
+ type MessageHandler = (message: Message, chain: MessageChain) => void | Promise<void>;
35
222
  ```
223
+ 函数参数 parameters 定义中包含:
224
+
225
+ - message { [Message](#message) } - 传递的消息实体
226
+ - chain { [MessageChain](#messageChain) } - 消息链,用于发送同源消息(组件的同步/异步机制)
227
+
228
+ **example**:
229
+ ```typescript
230
+ import { MessageHandler } from 'suanpan_node_sdk';
231
+
232
+ const messageHandler: MessageHandler = (message, chain) => {
233
+ const headers = message.headers;
234
+ const payload = message.payload;
36
235
 
37
- ### 2. 发送消息与接受消息
38
- #### 构建发送包
39
- ```javascript
40
- let msgPackOut = {
41
- out1: "a", //将发送 "a" 到第一个消息出口
42
- out2: "b", //将发送 "b" 到第二个消息出口
236
+ const requestId = headers.requestId;
237
+ const timestamp = headers.timestamp;
238
+
239
+ /** Business logic here */
240
+
241
+ chain.send({ // 发送消息
242
+ out1: 'xxxx',
243
+ out2: true,
244
+ out3: { success: true, result: [1, 2, 3] }
245
+ });
43
246
  }
44
247
  ```
45
- `msgPackOut` 对象的 `key` 由 `out` 与数字拼接而成的 key,表示第 N 个消息出口
46
- `msgPackOut` 对象的 `value` 表示发送到对应出口的数据(value 必须是字符串)
47
-
48
- #### 监听 call 事件
49
- 每当有新消息到达组件,则会触发Call事件
50
- ```javascript
51
- sp.onCall((req, res) => {
52
- let msgPackIn = req.msg
53
- console.log(msgPackIn)
54
- // msgPackIn结构如下
55
- //{in1:"a"}
56
- // key(inN) 表示第N个消息入口, value是字符串
57
-
58
- // doSomething here
59
- res.send(msgPackOut) // 调用 res.send 发送数据包到下游节点
60
- })
248
+ ## MessageChain
249
+
250
+ 消息链,用于发送同源消息(组件的同步/异步机制)
251
+ ### constructor
252
+
253
+ - message { [Message](#message)} - 消息实体,包含 `headers` 和 `payload` 两部分
254
+ - channel { [MessageChannel](#messageChannel) } - 消息传输双向管道
255
+ ### .send(payload)
256
+ **parameters:**
257
+
258
+ - payload { Object } - The data type of payload should strictly comply with the output port conventions of suanpan, such as: `{ out1: 111 }, { out2: 222 }`
259
+
260
+ **example:**
261
+ ```typescript
262
+ import { MessageChain, MessageBuilder, MessageChannelFactory } from 'suanpan_node_sdk';
263
+
264
+ (async () => {
265
+
266
+ const requestMessage = MessageBuilder
267
+ .withPayload({ in1: 'sss'})
268
+ .setHeaderIfAbsent('requestId', 'uuid')
269
+ .setHeaderIfAbsent('x-stream-id', '12345')
270
+ .build();
271
+
272
+ const messageChannel = MessageChannelFactory.createMessageChannel();
273
+ const chain = new MessageChain(requestMessage, messageChannel);
274
+
275
+ chain.send({ out1: 1234 })
276
+ })();
277
+ ```
278
+ ## MessageBuilder
279
+
280
+ 消息建造者。双向消息管道传输媒介 Message 的建造者,并提供多种静态方法帮助用户构建自定义消息。
281
+ ### .fromMessagePayload(message)
282
+ 提取并仅保留 message payload,返回当前建造者实例。
283
+
284
+ **parameters:**
285
+
286
+ - message { [Message](#message) } - 消息实例
287
+
288
+ **return:**
289
+
290
+ - [MessageBuilder](#messageBuilder)
291
+
292
+
293
+
294
+ ### .fromMessageHeaders(message)
295
+ 提取并仅保留 message headers,返回当前建造者实例。
296
+
297
+ **parameters:**
298
+
299
+ - message { [Message](#message) } - 消息实例
300
+
301
+ **return:**
302
+
303
+ - [MessageBuilder](#messageBuilder)
304
+
305
+
306
+
307
+ ### .withPayload(payload)
308
+ 添加消息 payload,返回当前建造者实例。
309
+
310
+ **parameters:**
311
+
312
+ - [payload](#payload)
313
+
314
+ **return:**
315
+
316
+ - [MessageBuilder](#messageBuilder)
317
+
318
+ ### .setHeader(key, value)
319
+ 添加消息 header,返回当前建造者实例。
320
+
321
+ **parameters:**
322
+
323
+ - key {string} - header key's name
324
+ - value {string} - header key's value
325
+
326
+ **return:**
327
+
328
+ - [MessageBuilder](#messageBuilder)
329
+
330
+
331
+ ### .setHeaderIfAbsent(key, value)
332
+ 用法同 [.setHeader](#.setHeader(key,-value)),消息 header key'name 不存在时添加
333
+
334
+
335
+ ### .build()
336
+ 生成消息 Message 实例。
337
+ **return:**
338
+
339
+ - [Message](#message)
340
+
341
+
342
+
343
+ ## Storage
344
+
345
+ Storage 是对对象存储(目前支持 Aliyun OSS以及开源 Minio)API 的封装。
346
+ ### .append(objectName, content)
347
+ Append an object to the bucket, it's almost same as [putObject](#.putObject(objectName,-data)), but it can add content to existing object rather than override it.
348
+ **parameters**:
349
+
350
+ - objectName {string} - Name store on OSS
351
+ - content {string} - What would you like to add to bucket
352
+
353
+ **example**:
354
+ ```typescript
355
+ import { Storage } from 'suanpan_node_sdk';
356
+
357
+ (async () => {
358
+ await Storage.Instance.append('/studio/userId/appId/nodeId/log.txt', 'redis subscribed.');
359
+ })();
61
360
  ```
361
+ ### .putObject(objectName, data)
362
+ Uploads an object from a stream/Buffer/string.
363
+ **parameters**:
364
+
365
+ - objectName {string} - Name store on OSS
366
+ - data {String | Buffer | ReadStream} - object data
62
367
 
63
- #### 主动发送信息
64
- ```powershell
65
- sp.sendMessage(msgPackOut)
368
+ **example**:
369
+ ```typescript
370
+ import { Storage } from 'suanpan_node_sdk';
371
+
372
+ (async () => {
373
+ await Storage.Instance.putObject('/studio/userId/appId/nodeId/data.js', 'const f = () => { console.log("a")}');
374
+ })();
66
375
  ```
376
+ ### .listObjects(prefix[, recursive][, maxKeys])
377
+ List objects in the bucket.
378
+ **parameters**:
67
379
 
68
- ### 3. EventLogger Sender
69
- 提供 log 格式化的存储形式持久化在数据库中,app 释放后仍然保留,用于不同用户查看修改错误,用户重新部署后清除。logkit 能够直接运行在算盘 Server 中,也可以单独运行。架构图:
70
- ![image.png](https://cdn.nlark.com/yuque/0/2021/png/502931/1615780837866-0a9141e8-3da1-4fff-98aa-cc4ace5e7aed.png#align=left&display=inline&height=384&margin=%5Bobject%20Object%5D&name=image.png&originHeight=836&originWidth=1044&size=78619&status=done&style=none&width=480)
71
- Node Sdk 提供 event log(内部使用 socketio 作为接口的基础协议)接口单向传输到 logkit。
380
+ - `prefix {string}` - Name prefix store on OSS,such as `/studio/userId/appId/nodeId`
381
+ - `recursive {boolean}` - Default:true。Recursively find all objects under “prefix”
382
+ - `maxKeys {Number}` - Max objects, default is 100, limit to 1000
72
383
 
73
- 代码示例:
74
- ```javascript
75
- let { sp, EventLogger } = require('suanpan_node_sdk');
384
+ **example:**
385
+ ```typescript
386
+ import { Storage, ObjectItem } from 'suanpan_node_sdk';
76
387
 
77
- const eventLogger = EventLogger.Instance;
388
+ (async () => {
389
+ const objects: ObjectItem[] = await Storage.Instance.listObjects('/studio/userId/appId/nodeId/', true, 200);
390
+ })();
391
+ ```
392
+ ### .fGetObject(objectName, filePath)
393
+ Downloads and saves the object as a file in the local filesystem.
394
+ **parameters**:
78
395
 
79
- sp.onCall((req, res) => {
396
+ - `objectName {string}` - Name store on OSS
397
+ - `filePath {string}` - Path on the local filesystem to which the object data will be written.
80
398
 
81
- if (!req.msg) {
82
- // 发送 event log
83
- eventLogger.warn('received message is empty.');
399
+ **example:**
400
+ ```typescript
401
+ import { Storage } from 'suanpan_node_sdk';
402
+
403
+ (async () => {
404
+ await Storage.Instance.fGetObject('/studio/userId/appId/nodeId/coco.ts', '/tmp/coco.ts');
405
+ })();
406
+ ```
407
+ ### .fPutObject(objectName, filePath)
408
+ Uploads contents from a file to objectName.
409
+ **parameters**:
410
+
411
+ - `objectName {string}` - Name store on OSS
412
+ - `filePath {string}` - Path of the file to be uploaded.
413
+
414
+ **example:**
415
+ ```typescript
416
+ import { Storage } from 'suanpan_node_sdk';
417
+
418
+ (async () => {
419
+ await Storage.Instance.fPutObject('/studio/userId/appId/nodeId/coco.ts', '/tmp/coco.ts');
420
+ })();
421
+ ```
422
+ ### .deleteObject(objectName)
423
+ Removes an object. If delete object not exists, will also delete success.
424
+ **parameters**:
425
+
426
+ - `objectName {string}` - Name store on OSS
427
+
428
+ **example:**
429
+ ```typescript
430
+ import { Storage } from 'suanpan_node_sdk';
431
+
432
+ (async () => {
433
+ await Storage.Instance.deleteObject('/studio/userId/appId/nodeId/coco.ts');
434
+ })();
435
+ ```
436
+ ### .deleteMultiObjects(objectNames)
437
+ Removes multiple objects.
438
+ **parameters**:
439
+
440
+ - `objectNames {string[]}` - List of objects in the bucket to be removed. such as`['objectname1','objectname2']`
441
+
442
+ **example:**
443
+ ```typescript
444
+ import { Storage } from 'suanpan_node_sdk';
445
+
446
+ (async () => {
447
+ const objectList = ['/studio/userId/appId/nodeId/coco1.ts', '/studio/userId/appId/nodeId/coco2.ts'];
448
+ await Storage.Instance.deleteMultiObjects(objectList);
449
+ })();
450
+ ```
451
+ ### .checkObjectNameExist(objectName)
452
+ Check whether the object exists,Returns true if it exists, otherwise false
453
+ **parameters**:
454
+
455
+ - `objectName {string}` - Name store on OSS
456
+
457
+ **example:**
458
+ ```typescript
459
+ import { Storage } from 'suanpan_node_sdk';
460
+
461
+ (async () => {
462
+ const exist = await Storage.Instance.checkObjectNameExist('/studio/not.json');
463
+ if (exist) {
464
+ // do something
84
465
  }
466
+ })();
467
+ ```
468
+ ### .getObjectToJSON(objectName)
469
+ Get an object to JSON object
470
+ **parameters**:
85
471
 
86
- res.send({
87
- out1: 'hello world this send in call'
88
- });
472
+ - `objectName {string}` - Name store on OSS
473
+
474
+ **example:**
475
+ ```typescript
476
+ import { Storage } from 'suanpan_node_sdk';
477
+
478
+ (async () => {
479
+ const json = await Storage.Instance.getObjectToJSON('/studio/not.json');
480
+ })();
481
+ ```
482
+ ### .getObjectToString(objectName)
483
+ Get an object to string.
484
+ **parameters**:
485
+
486
+ - `objectName {string}` - Name store on OSS
487
+
488
+ **example:**
489
+ ```typescript
490
+ import { Storage } from 'suanpan_node_sdk';
491
+
492
+ (async () => {
493
+ const str = await Storage.Instance.getObjectToString('/studio/log.txt');
494
+ })();
495
+ ```
496
+ ### .getObjectToBuffer(objectName)
497
+ Get an object to Buffer.
498
+ **parameters**:
499
+
500
+ - `objectName {string}` - Name store on OSS
501
+
502
+ **example:**
503
+ ```typescript
504
+ import { Storage } from 'suanpan_node_sdk';
505
+
506
+ (async () => {
507
+ const buf = await Storage.Instance.getObjectToBuffer('/studio/log.txt');
508
+ })();
509
+ ```
510
+ ### .getObjectToStream(objectName)
511
+ Get an object to read stream.
512
+
513
+ **parameters:**
514
+
515
+ - `objectName {string}` - Name store on OSS
516
+
517
+ **example:**
518
+ ```typescript
519
+ import { Storage } from 'suanpan_node_sdk';
520
+
521
+ (async () => {
522
+ const stream = await Storage.Instance.getObjectToStream('/studio/demo.txt');
523
+ stream.pipe(fs.createWriteStream('some file.txt'));
524
+ })();
525
+ ```
526
+ ## StoragePath
527
+
528
+ 对象存储路径工具类。
529
+ ### constructor([options])
530
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
531
+ | --- | --- | --- | --- |
532
+ | userId | string | 否 | 用户 Id |
533
+ | appId | string | 否 | 项目 Id |
534
+ | componentId | string | 否 | 组件 Id |
535
+ | nodeId | string | 否 | 节点 Id |
536
+
537
+ ### .getUserPath([userId])
538
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
539
+ | --- | --- | --- | --- |
540
+ | userId | string | 否 | 默认使用当前用户 Id |
541
+
542
+ ### .getAppPath([appId])
543
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
544
+ | --- | --- | --- | --- |
545
+ | appId | string | 否 | 默认使用当前项目Id |
546
+
547
+ ### .getComponentPath([componentId])
548
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
549
+ | --- | --- | --- | --- |
550
+ | componentId | string | 否 | 默认使用当前组件 Id |
551
+
552
+ ### .getNodePath([nodeId])
553
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
554
+ | --- | --- | --- | --- |
555
+ | nodeId | string | 否 | 默认使用当前节点 Id |
556
+
557
+ ### .getAppLogPath([userId][, appId])
558
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
559
+ | --- | --- | --- | --- |
560
+ | userId | string | 否 | 默认使用当前用户 Id |
561
+ | appId | string | 否 | 默认使用当前项目Id |
562
+
563
+ ### .getNodeLogPath([userId][, appId][, nodeId])
564
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
565
+ | --- | --- | --- | --- |
566
+ | userId | string | 否 | 默认使用当前用户 Id |
567
+ | appId | string | 否 | 默认使用当前项目 Id |
568
+ | nodeId | string | 否 | 默认使用当前节点 Id |
569
+
570
+ ### .getAppTempDir([userId][, appId])
571
+ | 参数名 | 参数类型 | 是否必填 | 说明 |
572
+ | --- | --- | --- | --- |
573
+ | userId | string | 否 | 默认使用当前用户 Id |
574
+ | appId | string | 否 | 默认使用当前项目 Id |
575
+
576
+ ## ObjectStorageLogger
577
+
578
+ 对象存储日志收集器
579
+ ### constructor([options](#storageLoggerOptions))
580
+ | **属性名** | **类型** | **是否必填** | **说明** |
581
+ | --- | --- | --- | --- |
582
+ | storagePath | string | **是** | 完整对象存储路径 objectName,例如:`/studio/userId/appId/nodeId/log-2021-1014.txt` |
583
+ | console | boolean | 否 | 默认 false。开启后日志将会 print 到标准输入输出 |
584
+ | level | [Loglevel](#logLevel) | 否 | 默认 1 (debug)。日志等级 |
585
+ | maxItems | number | 否 | 默认 1。表示缓存长度。当日志积累条数 >= maxItems 时,将会触发 flush 操作,将日志上传到对象存储。 |
586
+ | flushInterval | number | 否 | 默认 0,单位 ms。即实时将日志保存到对象存储中。如果想控制每隔 1s 钟收集一次。设置其值为:1000 |
587
+
588
+ ### .info(message[, flush])
589
+ ### .debug(message[, flush])
590
+ ### .warn(message[, flush])
591
+ ### .error(message[, flush])
592
+ **parameters**:
593
+
594
+ - `message {string}` - 日志内容
595
+ - `flush {boolean}` - 默认:false。flush 为 true 时将会立即刷新日志到对象存储。
596
+
597
+ **example:**
598
+ ```typescript
599
+ import { StoragePath, ObjectStorageLogger } from 'suanpan_node_sdk';
600
+
601
+ const storagePath = new StoragePath();
602
+
603
+ const storageLogger = new ObjectStorageLogger({
604
+ storagePath: storagePath.getNodeLogPath() + '/log.txt'
89
605
  });
606
+
607
+ storageLogger.info('append this log');
608
+ ```
609
+ ## EventLogger
610
+
611
+ - EventLogger 提供日志的结构化存储(持久化在数据库中),模版释放后仍然保留,用于不同用户查看修改错误,用户重新部署后清除。logkit 能够直接运行在算盘 Server 中,也可以单独运行。
612
+ - EventLogger(内部使用 socketio 作为接口的基础协议)单向传输到 logkit。用户可以自己将业务日志通过 EventLogger 发送到算盘 logkit。
613
+ - EventLogger 默认情况下:用户代码(MessageHandler)运行时 Error,将会自动触发 EventLogger 的 error 事件,将结构化错误信息发送到 logkit。
614
+ ### .info(message)
615
+ ### .debug(message)
616
+ ### .warn(message)
617
+ ### .error(message)
618
+ **parameters**:
619
+
620
+ - `message {string}` - logkit 日志内容
621
+
622
+ **example:**
623
+
624
+ ```typescript
625
+ import { EventLogger, MessageListener, MessageHandler } from 'suanpan_node_sdk';
626
+
627
+ const messageHandler: MessageHandler = (message, chain) => {
628
+ const headers = message.headers;
629
+ const payload = message.payload;
630
+
631
+ const requestId = headers.requestId;
632
+ const timestamp = headers.timestamp;
633
+
634
+ if(!payload.in1) {
635
+ EventLogger.Instance.error('received message is empty.');
636
+ return;
637
+ }
638
+
639
+ chain.send({ // 发送消息
640
+ out1: 'xxxx',
641
+ out2: true,
642
+ out3: { success: true, result: [1, 2, 3] }
643
+ });
644
+ }
645
+
646
+ MessageListener.onMessage(messageHandler);
90
647
  ```
648
+ # Type Reference
91
649
 
92
- 默认情况下,用户代码(onCall)中运行时 Error,将会自动触发 event log 的 error 事件,将结构化错误信息发送到 logkit。等于在 `after onCall` 中插入如下代码:
93
- ```javascript
94
- eventLogger.error(e.message)
650
+ - [MessageHeaders](#messageHeaders)
651
+ - [LogLevel](#logLevel)
652
+ - [StorageLoggerOptions](#storageLoggerOptions)
653
+ - [Platform](#platform)
654
+ ## MessageHeaders
655
+ ```typescript
656
+ export interface MessageHeaders {
657
+ requestId: string;
658
+ timestamp: number;
659
+ extra: JSONObject;
660
+ }
661
+ ```
662
+ ## LogLevel
663
+ ```typescript
664
+ export enum LogLevel {
665
+ DEBUG = 1,
666
+ INFO = 2,
667
+ WARN = 3,
668
+ ERROR = 4
669
+ }
670
+ ```
671
+ ## StorageLoggerOptions
672
+ ```typescript
673
+ type StorageLoggerOptions = {
674
+ storagePath: string;
675
+ console?: boolean;
676
+ level?: LogLevel;
677
+ maxItems?: number;
678
+ flushInterval?: number;
679
+ };
680
+ ```
681
+ ## Platform
682
+ ```typescript
683
+ enum Platform {
684
+ WINDOWS = 0,
685
+ MACINTOSH = 1,
686
+ LINUX = 2
687
+ }
95
688
  ```
96
- **注**:确保 sdk 版本在 `1.4.2` 以上