@tencent-rtc/mcp 1.0.0

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 (286) hide show
  1. package/@tencent/aegis-node-sdk/CHANGELOG.md +8 -0
  2. package/@tencent/aegis-node-sdk/LICENSE +21 -0
  3. package/@tencent/aegis-node-sdk/README.md +562 -0
  4. package/@tencent/aegis-node-sdk/lib/aegis.min.js +1 -0
  5. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/config.d.ts +14 -0
  6. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/global.d.ts +1 -0
  7. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/index.d.ts +9 -0
  8. package/@tencent/aegis-node-sdk/lib/packages/core/src/constant/report-ignore.d.ts +2 -0
  9. package/@tencent/aegis-node-sdk/lib/packages/core/src/core.d.ts +85 -0
  10. package/@tencent/aegis-node-sdk/lib/packages/core/src/hooks/afterRequestHooks.d.ts +3 -0
  11. package/@tencent/aegis-node-sdk/lib/packages/core/src/hooks/beforeRequestHooks.d.ts +9 -0
  12. package/@tencent/aegis-node-sdk/lib/packages/core/src/hooks/modifyRequestHooks.d.ts +3 -0
  13. package/@tencent/aegis-node-sdk/lib/packages/core/src/index.d.ts +9 -0
  14. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/config.d.ts +62 -0
  15. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/env.d.ts +11 -0
  16. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/index.d.ts +4 -0
  17. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/log.d.ts +130 -0
  18. package/@tencent/aegis-node-sdk/lib/packages/core/src/interface/send.d.ts +34 -0
  19. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/format.d.ts +2 -0
  20. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/index.d.ts +18 -0
  21. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/length-limit.d.ts +8 -0
  22. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/pv.d.ts +8 -0
  23. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/remove-payload.d.ts +2 -0
  24. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/repeat-limit.d.ts +4 -0
  25. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/report.d.ts +10 -0
  26. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/sample.d.ts +3 -0
  27. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/throttle.d.ts +3 -0
  28. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/index.d.ts +34 -0
  29. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/jwt.d.ts +12 -0
  30. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/ot-js.d.ts +14 -0
  31. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/trace/uuid.d.ts +2 -0
  32. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/whitelist.d.ts +12 -0
  33. package/@tencent/aegis-node-sdk/lib/packages/core/src/pipes/write-before.d.ts +3 -0
  34. package/@tencent/aegis-node-sdk/lib/packages/core/src/plugin.d.ts +33 -0
  35. package/@tencent/aegis-node-sdk/lib/packages/core/src/polyfill.d.ts +0 -0
  36. package/@tencent/aegis-node-sdk/lib/packages/core/src/util/destroy.d.ts +2 -0
  37. package/@tencent/aegis-node-sdk/lib/packages/core/src/util/event-emitter.d.ts +18 -0
  38. package/@tencent/aegis-node-sdk/lib/packages/core/src/util/index.d.ts +60 -0
  39. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/index.d.ts +15 -0
  40. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/interface/selector.d.ts +5 -0
  41. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/pipes/batch-report-pipe.d.ts +6 -0
  42. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/protocol/protocol_base.d.ts +18 -0
  43. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/protocol/protocol_http.d.ts +12 -0
  44. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/selector/ip_selector.d.ts +10 -0
  45. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/selector/polaris_selector.d.ts +20 -0
  46. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/selector/selector_base.d.ts +27 -0
  47. package/@tencent/aegis-node-sdk/lib/packages/node-sdk/src/util/eval_require.d.ts +2 -0
  48. package/@tencent/aegis-node-sdk/package.json +19 -0
  49. package/@tencent/polaris/README.md +407 -0
  50. package/@tencent/polaris/dist/consumer/health.d.ts +126 -0
  51. package/@tencent/polaris/dist/consumer/health.js +283 -0
  52. package/@tencent/polaris/dist/consumer/health.js.map +1 -0
  53. package/@tencent/polaris/dist/consumer/index.d.ts +120 -0
  54. package/@tencent/polaris/dist/consumer/index.js +348 -0
  55. package/@tencent/polaris/dist/consumer/index.js.map +1 -0
  56. package/@tencent/polaris/dist/consumer/monitor.d.ts +145 -0
  57. package/@tencent/polaris/dist/consumer/monitor.js +343 -0
  58. package/@tencent/polaris/dist/consumer/monitor.js.map +1 -0
  59. package/@tencent/polaris/dist/consumer/selector.d.ts +73 -0
  60. package/@tencent/polaris/dist/consumer/selector.js +316 -0
  61. package/@tencent/polaris/dist/consumer/selector.js.map +1 -0
  62. package/@tencent/polaris/dist/errors.d.ts +373 -0
  63. package/@tencent/polaris/dist/errors.js +154 -0
  64. package/@tencent/polaris/dist/errors.js.map +1 -0
  65. package/@tencent/polaris/dist/global.d.ts +16 -0
  66. package/@tencent/polaris/dist/global.js +18 -0
  67. package/@tencent/polaris/dist/global.js.map +1 -0
  68. package/@tencent/polaris/dist/index.d.ts +62 -0
  69. package/@tencent/polaris/dist/index.js +145 -0
  70. package/@tencent/polaris/dist/index.js.map +1 -0
  71. package/@tencent/polaris/dist/instance.d.ts +109 -0
  72. package/@tencent/polaris/dist/instance.js +38 -0
  73. package/@tencent/polaris/dist/instance.js.map +1 -0
  74. package/@tencent/polaris/dist/limiter/bucket.d.ts +51 -0
  75. package/@tencent/polaris/dist/limiter/bucket.js +152 -0
  76. package/@tencent/polaris/dist/limiter/bucket.js.map +1 -0
  77. package/@tencent/polaris/dist/limiter/index.d.ts +73 -0
  78. package/@tencent/polaris/dist/limiter/index.js +149 -0
  79. package/@tencent/polaris/dist/limiter/index.js.map +1 -0
  80. package/@tencent/polaris/dist/limiter/ratelimit.d.ts +27 -0
  81. package/@tencent/polaris/dist/limiter/ratelimit.js +134 -0
  82. package/@tencent/polaris/dist/limiter/ratelimit.js.map +1 -0
  83. package/@tencent/polaris/dist/limiter/ratelimiter/base.d.ts +17 -0
  84. package/@tencent/polaris/dist/limiter/ratelimiter/base.js +15 -0
  85. package/@tencent/polaris/dist/limiter/ratelimiter/base.js.map +1 -0
  86. package/@tencent/polaris/dist/limiter/ratelimiter/global.d.ts +59 -0
  87. package/@tencent/polaris/dist/limiter/ratelimiter/global.js +397 -0
  88. package/@tencent/polaris/dist/limiter/ratelimiter/global.js.map +1 -0
  89. package/@tencent/polaris/dist/limiter/ratelimiter/index.d.ts +3 -0
  90. package/@tencent/polaris/dist/limiter/ratelimiter/index.js +19 -0
  91. package/@tencent/polaris/dist/limiter/ratelimiter/index.js.map +1 -0
  92. package/@tencent/polaris/dist/limiter/ratelimiter/local.d.ts +17 -0
  93. package/@tencent/polaris/dist/limiter/ratelimiter/local.js +52 -0
  94. package/@tencent/polaris/dist/limiter/ratelimiter/local.js.map +1 -0
  95. package/@tencent/polaris/dist/location.d.ts +48 -0
  96. package/@tencent/polaris/dist/location.js +67 -0
  97. package/@tencent/polaris/dist/location.js.map +1 -0
  98. package/@tencent/polaris/dist/logging.d.ts +106 -0
  99. package/@tencent/polaris/dist/logging.js +130 -0
  100. package/@tencent/polaris/dist/logging.js.map +1 -0
  101. package/@tencent/polaris/dist/metadata.d.ts +78 -0
  102. package/@tencent/polaris/dist/metadata.js +119 -0
  103. package/@tencent/polaris/dist/metadata.js.map +1 -0
  104. package/@tencent/polaris/dist/plugins/breaker/polaris.d.ts +47 -0
  105. package/@tencent/polaris/dist/plugins/breaker/polaris.js +162 -0
  106. package/@tencent/polaris/dist/plugins/breaker/polaris.js.map +1 -0
  107. package/@tencent/polaris/dist/plugins/lb/base.d.ts +24 -0
  108. package/@tencent/polaris/dist/plugins/lb/base.js +32 -0
  109. package/@tencent/polaris/dist/plugins/lb/base.js.map +1 -0
  110. package/@tencent/polaris/dist/plugins/lb/edf.d.ts +24 -0
  111. package/@tencent/polaris/dist/plugins/lb/edf.js +77 -0
  112. package/@tencent/polaris/dist/plugins/lb/edf.js.map +1 -0
  113. package/@tencent/polaris/dist/plugins/lb/hashring.d.ts +24 -0
  114. package/@tencent/polaris/dist/plugins/lb/hashring.js +53 -0
  115. package/@tencent/polaris/dist/plugins/lb/hashring.js.map +1 -0
  116. package/@tencent/polaris/dist/plugins/lb/sticky.d.ts +31 -0
  117. package/@tencent/polaris/dist/plugins/lb/sticky.js +88 -0
  118. package/@tencent/polaris/dist/plugins/lb/sticky.js.map +1 -0
  119. package/@tencent/polaris/dist/plugins/lb/swrr.d.ts +25 -0
  120. package/@tencent/polaris/dist/plugins/lb/swrr.js +72 -0
  121. package/@tencent/polaris/dist/plugins/lb/swrr.js.map +1 -0
  122. package/@tencent/polaris/dist/plugins/lb/wr.d.ts +17 -0
  123. package/@tencent/polaris/dist/plugins/lb/wr.js +50 -0
  124. package/@tencent/polaris/dist/plugins/lb/wr.js.map +1 -0
  125. package/@tencent/polaris/dist/plugins/lb/wrr.d.ts +19 -0
  126. package/@tencent/polaris/dist/plugins/lb/wrr.js +81 -0
  127. package/@tencent/polaris/dist/plugins/lb/wrr.js.map +1 -0
  128. package/@tencent/polaris/dist/plugins/logging/console.d.ts +10 -0
  129. package/@tencent/polaris/dist/plugins/logging/console.js +38 -0
  130. package/@tencent/polaris/dist/plugins/logging/console.js.map +1 -0
  131. package/@tencent/polaris/dist/plugins/naming/local-server/index.d.ts +32 -0
  132. package/@tencent/polaris/dist/plugins/naming/local-server/index.js +88 -0
  133. package/@tencent/polaris/dist/plugins/naming/local-server/index.js.map +1 -0
  134. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/base.d.ts +124 -0
  135. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/base.js +398 -0
  136. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/base.js.map +1 -0
  137. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/discover.d.ts +27 -0
  138. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/discover.js +287 -0
  139. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/discover.js.map +1 -0
  140. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/index.d.ts +15 -0
  141. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/index.js +43 -0
  142. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/index.js.map +1 -0
  143. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/monitor.d.ts +28 -0
  144. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/monitor.js +249 -0
  145. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/monitor.js.map +1 -0
  146. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/ratelimit.d.ts +19 -0
  147. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/ratelimit.js +222 -0
  148. package/@tencent/polaris/dist/plugins/naming/polaris-server/adapter/ratelimit.js.map +1 -0
  149. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/bidi.d.ts +26 -0
  150. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/bidi.js +99 -0
  151. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/bidi.js.map +1 -0
  152. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/index.d.ts +60 -0
  153. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/index.js +259 -0
  154. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/index.js.map +1 -0
  155. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/pb/discover.proto +24 -0
  156. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/pb/monitor.proto +18 -0
  157. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/grpc/pb/ratelimit.proto +12 -0
  158. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/http/index.d.ts +39 -0
  159. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/http/index.js +115 -0
  160. package/@tencent/polaris/dist/plugins/naming/polaris-server/connector/http/index.js.map +1 -0
  161. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/api.proto +24 -0
  162. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/client.proto +22 -0
  163. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/model.proto +28 -0
  164. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/ratelimit.proto +80 -0
  165. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/request.proto +18 -0
  166. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/response.proto +65 -0
  167. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/routing.proto +66 -0
  168. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/service.proto +95 -0
  169. package/@tencent/polaris/dist/plugins/naming/polaris-server/discover-pb/types.d.ts +1568 -0
  170. package/@tencent/polaris/dist/plugins/naming/polaris-server/index.d.ts +36 -0
  171. package/@tencent/polaris/dist/plugins/naming/polaris-server/index.js +51 -0
  172. package/@tencent/polaris/dist/plugins/naming/polaris-server/index.js.map +1 -0
  173. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/api.proto +18 -0
  174. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/circuitbreak.proto +67 -0
  175. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/request.proto +82 -0
  176. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/response.proto +11 -0
  177. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/sdkcache.proto +46 -0
  178. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/sdkconfiguration.proto +16 -0
  179. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/sdktoken.proto +10 -0
  180. package/@tencent/polaris/dist/plugins/naming/polaris-server/monitor-pb/types.d.ts +1102 -0
  181. package/@tencent/polaris/dist/plugins/naming/polaris-server/pool.d.ts +29 -0
  182. package/@tencent/polaris/dist/plugins/naming/polaris-server/pool.js +77 -0
  183. package/@tencent/polaris/dist/plugins/naming/polaris-server/pool.js.map +1 -0
  184. package/@tencent/polaris/dist/plugins/naming/polaris-server/ratelimit-pb/api.proto +12 -0
  185. package/@tencent/polaris/dist/plugins/naming/polaris-server/ratelimit-pb/ratelimit.proto +28 -0
  186. package/@tencent/polaris/dist/plugins/naming/polaris-server/ratelimit-pb/types.d.ts +395 -0
  187. package/@tencent/polaris/dist/plugins/naming/polaris-server/rules.d.ts +13 -0
  188. package/@tencent/polaris/dist/plugins/naming/polaris-server/rules.js +116 -0
  189. package/@tencent/polaris/dist/plugins/naming/polaris-server/rules.js.map +1 -0
  190. package/@tencent/polaris/dist/plugins/naming/polaris-server/types.d.ts +67 -0
  191. package/@tencent/polaris/dist/plugins/naming/polaris-server/types.js +67 -0
  192. package/@tencent/polaris/dist/plugins/naming/polaris-server/types.js.map +1 -0
  193. package/@tencent/polaris/dist/plugins/naming/polaris-server/utils.d.ts +99 -0
  194. package/@tencent/polaris/dist/plugins/naming/polaris-server/utils.js +217 -0
  195. package/@tencent/polaris/dist/plugins/naming/polaris-server/utils.js.map +1 -0
  196. package/@tencent/polaris/dist/plugins/registry/memory.d.ts +10 -0
  197. package/@tencent/polaris/dist/plugins/registry/memory.js +50 -0
  198. package/@tencent/polaris/dist/plugins/registry/memory.js.map +1 -0
  199. package/@tencent/polaris/dist/plugins/router/polaris/nearby.d.ts +51 -0
  200. package/@tencent/polaris/dist/plugins/router/polaris/nearby.js +145 -0
  201. package/@tencent/polaris/dist/plugins/router/polaris/nearby.js.map +1 -0
  202. package/@tencent/polaris/dist/plugins/router/polaris/rule.d.ts +11 -0
  203. package/@tencent/polaris/dist/plugins/router/polaris/rule.js +174 -0
  204. package/@tencent/polaris/dist/plugins/router/polaris/rule.js.map +1 -0
  205. package/@tencent/polaris/dist/plugins/router/trpc/canary.d.ts +25 -0
  206. package/@tencent/polaris/dist/plugins/router/trpc/canary.js +36 -0
  207. package/@tencent/polaris/dist/plugins/router/trpc/canary.js.map +1 -0
  208. package/@tencent/polaris/dist/plugins/router/trpc/env.d.ts +10 -0
  209. package/@tencent/polaris/dist/plugins/router/trpc/env.js +34 -0
  210. package/@tencent/polaris/dist/plugins/router/trpc/env.js.map +1 -0
  211. package/@tencent/polaris/dist/plugins/router/trpc/set.d.ts +56 -0
  212. package/@tencent/polaris/dist/plugins/router/trpc/set.js +106 -0
  213. package/@tencent/polaris/dist/plugins/router/trpc/set.js.map +1 -0
  214. package/@tencent/polaris/dist/plugins/shaping/unirate.d.ts +31 -0
  215. package/@tencent/polaris/dist/plugins/shaping/unirate.js +124 -0
  216. package/@tencent/polaris/dist/plugins/shaping/unirate.js.map +1 -0
  217. package/@tencent/polaris/dist/plugins/shaping/warmup.d.ts +61 -0
  218. package/@tencent/polaris/dist/plugins/shaping/warmup.js +171 -0
  219. package/@tencent/polaris/dist/plugins/shaping/warmup.js.map +1 -0
  220. package/@tencent/polaris/dist/plugins/weight/polaris.d.ts +23 -0
  221. package/@tencent/polaris/dist/plugins/weight/polaris.js +159 -0
  222. package/@tencent/polaris/dist/plugins/weight/polaris.js.map +1 -0
  223. package/@tencent/polaris/dist/plugins.d.ts +619 -0
  224. package/@tencent/polaris/dist/plugins.js +91 -0
  225. package/@tencent/polaris/dist/plugins.js.map +1 -0
  226. package/@tencent/polaris/dist/polaris.d.ts +33 -0
  227. package/@tencent/polaris/dist/polaris.js +59 -0
  228. package/@tencent/polaris/dist/polaris.js.map +1 -0
  229. package/@tencent/polaris/dist/provider/index.d.ts +102 -0
  230. package/@tencent/polaris/dist/provider/index.js +168 -0
  231. package/@tencent/polaris/dist/provider/index.js.map +1 -0
  232. package/@tencent/polaris/dist/registry.d.ts +174 -0
  233. package/@tencent/polaris/dist/registry.js +660 -0
  234. package/@tencent/polaris/dist/registry.js.map +1 -0
  235. package/@tencent/polaris/dist/rules.d.ts +163 -0
  236. package/@tencent/polaris/dist/rules.js +24 -0
  237. package/@tencent/polaris/dist/rules.js.map +1 -0
  238. package/@tencent/polaris/dist/scripts/postinstall.d.ts +1 -0
  239. package/@tencent/polaris/dist/scripts/postinstall.js +71 -0
  240. package/@tencent/polaris/dist/scripts/postinstall.js.map +1 -0
  241. package/@tencent/polaris/dist/service.d.ts +18 -0
  242. package/@tencent/polaris/dist/service.js +3 -0
  243. package/@tencent/polaris/dist/service.js.map +1 -0
  244. package/@tencent/polaris/dist/skeleton.d.ts +87 -0
  245. package/@tencent/polaris/dist/skeleton.js +282 -0
  246. package/@tencent/polaris/dist/skeleton.js.map +1 -0
  247. package/@tencent/polaris/dist/utils.d.ts +36 -0
  248. package/@tencent/polaris/dist/utils.js +74 -0
  249. package/@tencent/polaris/dist/utils.js.map +1 -0
  250. package/@tencent/polaris/dist/weak.d.ts +11 -0
  251. package/@tencent/polaris/dist/weak.js +44 -0
  252. package/@tencent/polaris/dist/weak.js.map +1 -0
  253. package/@tencent/polaris/package.json +114 -0
  254. package/README.md +61 -0
  255. package/cursor-setting.png +0 -0
  256. package/index.js +16 -0
  257. package/index.js.map +1 -0
  258. package/mcp-server-prompt.png +0 -0
  259. package/mcp.json +8 -0
  260. package/package.json +49 -0
  261. package/resource/doc/tuicallkit/android/.gitkeep +0 -0
  262. package/resource/doc/tuicallkit/android/api_TUICallKit.md +610 -0
  263. package/resource/doc/tuicallkit/android/api_TUICallObserver.md +784 -0
  264. package/resource/doc/tuicallkit/android/how_to_integrated_android_callkit.md +286 -0
  265. package/resource/doc/tuicallkit/faq/faq.md +127 -0
  266. package/resource/doc/tuicallkit/flutter/api_TUICallDefine.md +938 -0
  267. package/resource/doc/tuicallkit/flutter/api_TUICallKit.md +469 -0
  268. package/resource/doc/tuicallkit/flutter/api_TUICallObserver.md +897 -0
  269. package/resource/doc/tuicallkit/flutter/how_to_integrated_flutter_callkit.md +226 -0
  270. package/resource/doc/tuicallkit/flutter/how_to_run_flutter_callkit_demo.md +101 -0
  271. package/resource/doc/tuicallkit/iOS/api_TUICallKit.md +398 -0
  272. package/resource/doc/tuicallkit/iOS/api_TUICallObserver.md +781 -0
  273. package/resource/doc/tuicallkit/iOS/how_to_integrated_iOS_callkit.md +268 -0
  274. package/resource/doc/tuicallkit/iOS/how_to_run_iOS_callkit_demo.md +98 -0
  275. package/resource/doc/tuicallkit/react/.gitkeep +0 -0
  276. package/resource/doc/tuicallkit/react/api_TUICallKit.md +354 -0
  277. package/resource/doc/tuicallkit/react/how_to_integrated_react_callkit.md +166 -0
  278. package/resource/doc/tuicallkit/react/how_to_run_react_callkit_demo.md +61 -0
  279. package/resource/doc/tuicallkit/vue/.gitkeep +0 -0
  280. package/resource/doc/tuicallkit/vue/api_TUICallKit.md +354 -0
  281. package/resource/doc/tuicallkit/vue/how_to_integrated_vue_callkit.md +187 -0
  282. package/resource/doc/tuicallkit/vue/how_to_run_vue_callkit_demo.md +61 -0
  283. package/server.js +132 -0
  284. package/server.js.map +1 -0
  285. package/streamableHttp.js +74 -0
  286. package/streamableHttp.js.map +1 -0
@@ -0,0 +1,24 @@
1
+ import { Instance } from "../../instance";
2
+ import { LoadBalancerPlugin, PluginType, WeightType } from "../../plugins";
3
+ declare const kDefaultOptions: {
4
+ /**
5
+ * 是否开启动态权重
6
+ */
7
+ dynamicWeight: boolean;
8
+ };
9
+ export declare type StatelessLoadBalancerOptions = typeof kDefaultOptions;
10
+ export declare abstract class StatelessLoadBalancer implements LoadBalancerPlugin {
11
+ readonly type = PluginType.LoadBalancer;
12
+ readonly supportedWeightType = WeightType.Dynamic;
13
+ protected readonly options: StatelessLoadBalancerOptions;
14
+ abstract readonly name: string;
15
+ constructor(options?: Partial<StatelessLoadBalancerOptions>);
16
+ instanceWeight(instance: Instance): number;
17
+ /**
18
+ * 随机 `choose` 多次,
19
+ * 避免请求顺序固定导致的后端访问不均衡
20
+ */
21
+ protected randomChoose<CallArgsType>(namespace: string, service: string, instances: Instance[], args?: CallArgsType): void;
22
+ abstract choose<CallArgsType>(namespace: string, service: string, instances: Instance[], args?: CallArgsType): Instance;
23
+ }
24
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatelessLoadBalancer = void 0;
4
+ const plugins_1 = require("../../plugins");
5
+ const kDefaultOptions = {
6
+ /**
7
+ * 是否开启动态权重
8
+ */
9
+ dynamicWeight: true
10
+ };
11
+ class StatelessLoadBalancer {
12
+ constructor(options) {
13
+ this.type = plugins_1.PluginType.LoadBalancer;
14
+ this.supportedWeightType = 0 /* Dynamic */;
15
+ this.options = Object.assign(Object.assign({}, kDefaultOptions), options);
16
+ }
17
+ instanceWeight(instance) {
18
+ return instance.staticWeight + (this.options.dynamicWeight ? instance.dynamicWeight : 0);
19
+ }
20
+ /**
21
+ * 随机 `choose` 多次,
22
+ * 避免请求顺序固定导致的后端访问不均衡
23
+ */
24
+ randomChoose(namespace, service, instances, args) {
25
+ const chooseCount = ~~(Math.random() * instances.length);
26
+ for (let i = 0; i < chooseCount; i += 1) {
27
+ this.choose(namespace, service, instances, args);
28
+ }
29
+ }
30
+ }
31
+ exports.StatelessLoadBalancer = StatelessLoadBalancer;
32
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/plugins/lb/base.ts"],"names":[],"mappings":";;;AACA,2CAA2E;AAE3E,MAAM,eAAe,GAAG;IACtB;;OAEG;IACH,aAAa,EAAE,IAAI;CACpB,CAAC;AAIF,MAAsB,qBAAqB;IAMzC,YAAY,OAA+C;QALlD,SAAI,GAAG,oBAAU,CAAC,YAAY,CAAC;QAC/B,wBAAmB,mBAAsB;QAKhD,IAAI,CAAC,OAAO,mCACP,eAAe,GACf,OAAO,CACX,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,QAAkB;QAC/B,OAAO,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED;;;OAGG;IACO,YAAY,CAAe,SAAiB,EAAE,OAAe,EAAE,SAAqB,EAAE,IAAmB;QACjH,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;SAClD;IACH,CAAC;CAKF;AA/BD,sDA+BC"}
@@ -0,0 +1,24 @@
1
+ import { Instance, InstanceStatus } from "../../instance";
2
+ import { StatelessLoadBalancer } from "./base";
3
+ /**
4
+ * Earliest Deadline First (EDF) Load Balancer
5
+ * (https://en.wikipedia.org/wiki/Earliest_deadline_first_scheduling)
6
+ *
7
+ * @description
8
+ * Algorithm:
9
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `W(Si)` = Si.weight, `D(Si)` = Si.deadline
10
+ * 2. Sx = Pick(Min(D(Si)))
11
+ * 3. D(Sx) = D(Sx) + 1 / W(Sx)
12
+ * 4. return Sx
13
+ */
14
+ export declare class EDFLoadBalancer extends StatelessLoadBalancer {
15
+ readonly name: string;
16
+ private readonly callStat;
17
+ /**
18
+ * 1. 选取拥有最小 `deadline` 的实例
19
+ * 2. 将当前时间 `currentTime` 置为选取实例的 `deadline`
20
+ * 3. 将选取实例的 `deadline` 增加一个 `step`
21
+ */
22
+ choose(namespace: string, service: string, instances: Instance[]): Instance;
23
+ onStatusChange(namespace: string, service: string, instance: Instance, prevStatus: InstanceStatus): void;
24
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EDFLoadBalancer = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const base_1 = require("./base");
6
+ /**
7
+ * Earliest Deadline First (EDF) Load Balancer
8
+ * (https://en.wikipedia.org/wiki/Earliest_deadline_first_scheduling)
9
+ *
10
+ * @description
11
+ * Algorithm:
12
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `W(Si)` = Si.weight, `D(Si)` = Si.deadline
13
+ * 2. Sx = Pick(Min(D(Si)))
14
+ * 3. D(Sx) = D(Sx) + 1 / W(Sx)
15
+ * 4. return Sx
16
+ */
17
+ class EDFLoadBalancer extends base_1.StatelessLoadBalancer {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.name = "EDFLoadBalancer";
21
+ this.callStat = Object.create(null);
22
+ }
23
+ /**
24
+ * 1. 选取拥有最小 `deadline` 的实例
25
+ * 2. 将当前时间 `currentTime` 置为选取实例的 `deadline`
26
+ * 3. 将选取实例的 `deadline` 增加一个 `step`
27
+ */
28
+ choose(namespace, service, instances) {
29
+ let callStat = this.callStat[`${namespace}.${service}`];
30
+ if (!callStat) {
31
+ callStat = {
32
+ currentTime: 0,
33
+ instanceDeadline: new WeakMap()
34
+ };
35
+ this.callStat[`${namespace}.${service}`] = callStat;
36
+ this.randomChoose(namespace, service, instances);
37
+ }
38
+ let earliestDeadline = Infinity;
39
+ let selectedInstance;
40
+ for (let i = 0; i < instances.length; i += 1) { // eslint-disable-line @typescript-eslint/prefer-for-of
41
+ const instance = instances[i];
42
+ let deadline = callStat.instanceDeadline.get(instance);
43
+ // 正常情况下 `deadline` 应大于当前时间; 但是由于某些前置的条件,导致某 `instance` 不在 `instances` 中
44
+ // 则此 `instance` 的 `deadline` 有可能滞后于 `currentTime`,需要为其重置 `deadline`
45
+ if (typeof deadline === "undefined" || deadline < callStat.currentTime) {
46
+ deadline = callStat.currentTime + (1 / this.instanceWeight(instance));
47
+ callStat.instanceDeadline.set(instance, deadline);
48
+ }
49
+ if (deadline < earliestDeadline) {
50
+ earliestDeadline = deadline;
51
+ selectedInstance = instance;
52
+ }
53
+ }
54
+ if (selectedInstance) {
55
+ callStat.instanceDeadline.set(selectedInstance, earliestDeadline + (1 / this.instanceWeight(selectedInstance)));
56
+ callStat.currentTime = earliestDeadline;
57
+ return selectedInstance;
58
+ }
59
+ (0, utils_1.UNREACHABLE)();
60
+ }
61
+ onStatusChange(namespace, service, instance, prevStatus) {
62
+ // 发生以下两种状态转移时,不希望实例被太早选出,因此重置其 deadline
63
+ if (
64
+ /* eslint-disable max-len */
65
+ (instance.status === 2 /* HalfClose */ && prevStatus === 1 /* HalfOpen */) /** `HalfOpen` ---> `HalfClose` */
66
+ || (instance.status === 0 /* Normal */ && prevStatus === 3 /* Fused */) /** `Fused` ---> `Normal` */
67
+ /* eslint-enable max-len */
68
+ ) {
69
+ const callStat = this.callStat[`${namespace}.${service}`];
70
+ if (callStat) {
71
+ callStat.instanceDeadline.delete(instance);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ exports.EDFLoadBalancer = EDFLoadBalancer;
77
+ //# sourceMappingURL=edf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edf.js","sourceRoot":"","sources":["../../../src/plugins/lb/edf.ts"],"names":[],"mappings":";;;AACA,uCAA0C;AAC1C,iCAA+C;AAE/C;;;;;;;;;;GAUG;AACH,MAAa,eAAgB,SAAQ,4BAAqB;IAA1D;;QACW,SAAI,GAAW,iBAAiB,CAAC;QACzB,aAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAG3C,CAAC;IA2DN,CAAC;IAzDC;;;;OAIG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAqB;QAC9D,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG;gBACT,WAAW,EAAE,CAAC;gBACd,gBAAgB,EAAE,IAAI,OAAO,EAAE;aAChC,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;YACpD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;SAClD;QAED,IAAI,gBAAgB,GAAG,QAAQ,CAAC;QAChC,IAAI,gBAAsC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,uDAAuD;YACrG,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvD,wEAAwE;YACxE,oEAAoE;YACpE,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE;gBACtE,QAAQ,GAAG,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aACnD;YACD,IAAI,QAAQ,GAAG,gBAAgB,EAAE;gBAC/B,gBAAgB,GAAG,QAAQ,CAAC;gBAC5B,gBAAgB,GAAG,QAAQ,CAAC;aAC7B;SACF;QAED,IAAI,gBAAgB,EAAE;YACpB,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAChH,QAAQ,CAAC,WAAW,GAAG,gBAAgB,CAAC;YAExC,OAAO,gBAAgB,CAAC;SACzB;QAED,IAAA,mBAAW,GAAE,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,OAAe,EAAE,QAAkB,EAAE,UAA0B;QAC/F,wCAAwC;QACxC;QACE,4BAA4B;QAC5B,CAAC,QAAQ,CAAC,MAAM,sBAA6B,IAAI,UAAU,qBAA4B,CAAC,CAAC,kCAAkC;eACxH,CAAC,QAAQ,CAAC,MAAM,mBAA0B,IAAI,UAAU,kBAAyB,CAAC,CAAC,4BAA4B;QAClH,2BAA2B;UAC3B;YACA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;YAC1D,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC5C;SACF;IACH,CAAC;CACF;AAhED,0CAgEC"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import * as HashRing from "hashring";
3
+ import { Instance } from "../../instance";
4
+ import { LoadBalancerPlugin, PluginType, WeightType } from "../../plugins";
5
+ export declare type HashRingCallArgs = string;
6
+ export declare type HashRingLoadBalancerOptions = HashRing.HashRingOptions & {
7
+ /**
8
+ * 哈希算法(可自定义实现),默认为 `md5`
9
+ */
10
+ "algorithm": string | ((key: string) => string | Buffer);
11
+ };
12
+ /**
13
+ * Consistent Hash Load Balancer
14
+ * Implemented by using a third-party [hashring](https://github.com/3rd-Eden/node-hashring) module
15
+ */
16
+ export declare class HashRingLoadBalancer implements LoadBalancerPlugin {
17
+ readonly name = "HashRingLoadBalancer";
18
+ readonly type = PluginType.LoadBalancer;
19
+ readonly supportedWeightType = WeightType.None;
20
+ private readonly callStat;
21
+ private readonly options;
22
+ constructor(options?: Partial<HashRingLoadBalancerOptions>);
23
+ choose<CallArgsType>(namespace: string, service: string, instances: Instance[], args: CallArgsType): Instance;
24
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HashRingLoadBalancer = void 0;
4
+ const HashRing = require("hashring");
5
+ const plugins_1 = require("../../plugins");
6
+ const utils_1 = require("../../utils");
7
+ const isHashRingCallArgs = (args) => {
8
+ return typeof args === "string";
9
+ };
10
+ /**
11
+ * Consistent Hash Load Balancer
12
+ * Implemented by using a third-party [hashring](https://github.com/3rd-Eden/node-hashring) module
13
+ */
14
+ class HashRingLoadBalancer {
15
+ constructor(options) {
16
+ this.name = "HashRingLoadBalancer";
17
+ this.type = plugins_1.PluginType.LoadBalancer;
18
+ this.supportedWeightType = 2 /* None */;
19
+ this.callStat = Object.create(null);
20
+ this.options = options || {};
21
+ }
22
+ choose(namespace, service, instances, args) {
23
+ let callArgs;
24
+ if (isHashRingCallArgs(args)) {
25
+ callArgs = args;
26
+ }
27
+ else {
28
+ throw new Error("Illegal parameter");
29
+ }
30
+ const sign = instances.map(instance => instance.id).join("|");
31
+ let callStat = this.callStat[`${namespace}.${service}`];
32
+ if (!callStat || callStat.sign !== sign) {
33
+ if (callStat && callStat.sign !== sign) {
34
+ callStat.ring.end();
35
+ }
36
+ callStat = {
37
+ sign,
38
+ ring: new HashRing(instances.map(instance => `${instance.host}:${instance.port}`), this.options.algorithm || "md5", this.options)
39
+ };
40
+ this.callStat[`${namespace}.${service}`] = callStat;
41
+ }
42
+ const address = callStat.ring.get(callArgs);
43
+ for (let i = 0; i < instances.length; i += 1) { // eslint-disable-line @typescript-eslint/prefer-for-of
44
+ const instance = instances[i];
45
+ if (address === `${instance.host}:${instance.port}`) {
46
+ return instance;
47
+ }
48
+ }
49
+ (0, utils_1.UNREACHABLE)();
50
+ }
51
+ }
52
+ exports.HashRingLoadBalancer = HashRingLoadBalancer;
53
+ //# sourceMappingURL=hashring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashring.js","sourceRoot":"","sources":["../../../src/plugins/lb/hashring.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAGrC,2CAA2E;AAC3E,uCAA0C;AAI1C,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAA4B,EAAE;IACrE,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC;AAClC,CAAC,CAAC;AASF;;;GAGG;AACH,MAAa,oBAAoB;IAW/B,YAAY,OAA8C;QAVjD,SAAI,GAAG,sBAAsB,CAAC;QAC9B,SAAI,GAAG,oBAAU,CAAC,YAAY,CAAC;QAC/B,wBAAmB,gBAAmB;QAC9B,aAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAG3C,CAAC;QAKF,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,CAAe,SAAiB,EAAE,OAAe,EAAE,SAAqB,EAAE,IAAkB;QAChG,IAAI,QAA0B,CAAC;QAC/B,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;SACjB;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACtC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE;YACvC,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE;gBACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aACrB;YACD,QAAQ,GAAG;gBACT,IAAI;gBACJ,IAAI,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;aAClI,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;SACrD;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,uDAAuD;YACrG,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,OAAO,KAAK,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;gBACnD,OAAO,QAAQ,CAAC;aACjB;SACF;QAED,IAAA,mBAAW,GAAE,CAAC;IAChB,CAAC;CACF;AA9CD,oDA8CC"}
@@ -0,0 +1,31 @@
1
+ import { Instance } from "../../instance";
2
+ import { LoadBalancerPlugin, PluginType } from "../../plugins";
3
+ declare const kDefaultOptions: {
4
+ /**
5
+ * 过期时间
6
+ * * 当值 ≤0 时:则不启用此插件
7
+ * * 当值为 `Infinity` 时:不启用过期
8
+ */
9
+ expireTime: number;
10
+ };
11
+ export declare type StickyLoadBalancerOptions = typeof kDefaultOptions;
12
+ /**
13
+ * Sticky Load Balancer
14
+ * The returned instance of each call is the same
15
+ * until it is not appear in the instance list or exceed expiration time
16
+ */
17
+ export declare class StickyLoadBalancer implements LoadBalancerPlugin {
18
+ private readonly next;
19
+ readonly name = "StickyLoadBalancer";
20
+ readonly type = PluginType.LoadBalancer;
21
+ readonly supportedWeightType: import("../../plugins").WeightType;
22
+ private disposed;
23
+ private readonly options;
24
+ private readonly sessions;
25
+ constructor(next: LoadBalancerPlugin, options?: Partial<StickyLoadBalancerOptions>);
26
+ dispose(): void;
27
+ get isDisposed(): boolean;
28
+ choose<CallArgsType>(namespace: string, service: string, instances: Instance[], args?: CallArgsType): Instance;
29
+ private buildOrRefreshTimer;
30
+ }
31
+ export {};
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StickyLoadBalancer = void 0;
4
+ const __1 = require("../..");
5
+ const plugins_1 = require("../../plugins");
6
+ const utils_1 = require("../../utils");
7
+ const weak_1 = require("../../weak");
8
+ const kDefaultOptions = {
9
+ /**
10
+ * 过期时间
11
+ * * 当值 ≤0 时:则不启用此插件
12
+ * * 当值为 `Infinity` 时:不启用过期
13
+ */
14
+ expireTime: 10 * utils_1.kMinutes
15
+ };
16
+ /**
17
+ * Sticky Load Balancer
18
+ * The returned instance of each call is the same
19
+ * until it is not appear in the instance list or exceed expiration time
20
+ */
21
+ class StickyLoadBalancer {
22
+ constructor(next, options) {
23
+ this.next = next;
24
+ this.name = "StickyLoadBalancer";
25
+ this.type = plugins_1.PluginType.LoadBalancer;
26
+ this.disposed = false;
27
+ this.sessions = Object.create(null);
28
+ this.options = Object.assign(Object.assign({}, kDefaultOptions), options);
29
+ this.supportedWeightType = next.supportedWeightType;
30
+ }
31
+ // #region dispose
32
+ dispose() {
33
+ if (!this.disposed) {
34
+ Object.values(this.sessions).forEach((session) => {
35
+ clearTimeout(session.timer);
36
+ });
37
+ this.disposed = true;
38
+ }
39
+ }
40
+ get isDisposed() {
41
+ return this.disposed;
42
+ }
43
+ // #endregion
44
+ choose(namespace, service, instances, args) {
45
+ if (this.disposed) {
46
+ throw new __1.StateError("Already disposed");
47
+ }
48
+ if (this.options.expireTime <= 0) {
49
+ return this.next.choose(namespace, service, instances, args);
50
+ }
51
+ const session = this.sessions[`${namespace}.${service}`];
52
+ let stickiedInstance;
53
+ if (session) {
54
+ const { ref, timer } = session;
55
+ stickiedInstance = ref.find(instances);
56
+ if (stickiedInstance === undefined) {
57
+ stickiedInstance = this.next.choose(namespace, service, instances, args);
58
+ ref.reset(stickiedInstance);
59
+ session.timer = this.buildOrRefreshTimer(namespace, service, timer);
60
+ }
61
+ }
62
+ else {
63
+ stickiedInstance = this.next.choose(namespace, service, instances, args);
64
+ this.sessions[`${namespace}.${service}`] = {
65
+ ref: new weak_1.WeakReference(stickiedInstance),
66
+ timer: this.buildOrRefreshTimer(namespace, service)
67
+ };
68
+ }
69
+ return stickiedInstance;
70
+ }
71
+ buildOrRefreshTimer(namespace, service, timer) {
72
+ if (this.options.expireTime === Infinity) {
73
+ return;
74
+ }
75
+ if (typeof (timer === null || timer === void 0 ? void 0 : timer.refresh) === "function") { /** Timeout.refresh() only available for Node.js 10.2.0 and higher */
76
+ timer.refresh();
77
+ return timer;
78
+ }
79
+ if (timer) {
80
+ clearTimeout(timer);
81
+ }
82
+ return setTimeout(() => {
83
+ delete this.sessions[`${namespace}.${service}`];
84
+ }, this.options.expireTime).unref();
85
+ }
86
+ }
87
+ exports.StickyLoadBalancer = StickyLoadBalancer;
88
+ //# sourceMappingURL=sticky.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky.js","sourceRoot":"","sources":["../../../src/plugins/lb/sticky.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Instance, InstanceStatus } from "../../instance";
2
+ import { StatelessLoadBalancer } from "./base";
3
+ /**
4
+ * Smooth Weighted Round-Robin (SWRR) Load Balancer
5
+ * (https://www.nginx.com/resources/glossary/round-robin-load-balancing/)
6
+ *
7
+ * @description
8
+ * Algorithm:
9
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `EW(Si)` = Si.weight, `CW(Si)` = 0
10
+ * 2. CW(Si) = CW(Si) + EW(Si)
11
+ * 3. Sx = Pick(Max(CW(Si)))
12
+ * 4. CW(Sx) = CW(Sx) - Sum(EW(S))
13
+ * 5. return Sx
14
+ */
15
+ export declare class NginxLoadBalancer extends StatelessLoadBalancer {
16
+ readonly name: string;
17
+ private readonly callStat;
18
+ /**
19
+ * 1. 将各个实例的 `currentWeight` 增加 `effectiveWeight`
20
+ * 2. 选取拥有最大 `currentWeight` 的实例
21
+ * 3. 将选取实例的 `currentWeight` 减少 `totalEffectiveWeight`
22
+ */
23
+ choose(namespace: string, service: string, instances: Instance[]): Instance;
24
+ onStatusChange(namespace: string, service: string, instance: Instance, prevStatus: InstanceStatus): void;
25
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NginxLoadBalancer = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const base_1 = require("./base");
6
+ /**
7
+ * Smooth Weighted Round-Robin (SWRR) Load Balancer
8
+ * (https://www.nginx.com/resources/glossary/round-robin-load-balancing/)
9
+ *
10
+ * @description
11
+ * Algorithm:
12
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `EW(Si)` = Si.weight, `CW(Si)` = 0
13
+ * 2. CW(Si) = CW(Si) + EW(Si)
14
+ * 3. Sx = Pick(Max(CW(Si)))
15
+ * 4. CW(Sx) = CW(Sx) - Sum(EW(S))
16
+ * 5. return Sx
17
+ */
18
+ class NginxLoadBalancer extends base_1.StatelessLoadBalancer {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = "NginxLoadBalancer";
22
+ this.callStat = Object.create(null);
23
+ }
24
+ /**
25
+ * 1. 将各个实例的 `currentWeight` 增加 `effectiveWeight`
26
+ * 2. 选取拥有最大 `currentWeight` 的实例
27
+ * 3. 将选取实例的 `currentWeight` 减少 `totalEffectiveWeight`
28
+ */
29
+ choose(namespace, service, instances) {
30
+ let callStat = this.callStat[`${namespace}.${service}`];
31
+ if (!callStat) {
32
+ callStat = new WeakMap();
33
+ this.callStat[`${namespace}.${service}`] = callStat;
34
+ this.randomChoose(namespace, service, instances);
35
+ }
36
+ let totalEffectiveWeight = 0;
37
+ let bestWeight = -Infinity;
38
+ let selectedInstance;
39
+ for (let i = 0; i < instances.length; i += 1) { // eslint-disable-line @typescript-eslint/prefer-for-of
40
+ const instance = instances[i];
41
+ const effectiveWeight = this.instanceWeight(instance);
42
+ let currentWeight = callStat.get(instance) || 0;
43
+ currentWeight += effectiveWeight;
44
+ totalEffectiveWeight += effectiveWeight;
45
+ if (!selectedInstance || bestWeight < currentWeight) {
46
+ selectedInstance = instance;
47
+ bestWeight = currentWeight;
48
+ }
49
+ callStat.set(instance, currentWeight);
50
+ }
51
+ if (selectedInstance) {
52
+ callStat.set(selectedInstance, bestWeight - totalEffectiveWeight);
53
+ return selectedInstance;
54
+ }
55
+ (0, utils_1.UNREACHABLE)();
56
+ }
57
+ onStatusChange(namespace, service, instance, prevStatus) {
58
+ if (
59
+ /* eslint-disable max-len */
60
+ (instance.status === 2 /* HalfClose */ && prevStatus === 1 /* HalfOpen */) /** `HalfOpen` ---> `HalfClose` */
61
+ || (instance.status === 0 /* Normal */ && prevStatus === 3 /* Fused */) /** `Fused` ---> `Normal` */
62
+ /* eslint-enable max-len */
63
+ ) {
64
+ const callStat = this.callStat[`${namespace}.${service}`];
65
+ if (callStat) {
66
+ callStat.delete(instance);
67
+ }
68
+ }
69
+ }
70
+ }
71
+ exports.NginxLoadBalancer = NginxLoadBalancer;
72
+ //# sourceMappingURL=swrr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swrr.js","sourceRoot":"","sources":["../../../src/plugins/lb/swrr.ts"],"names":[],"mappings":";;;AACA,uCAA0C;AAC1C,iCAA+C;AAE/C;;;;;;;;;;;GAWG;AACH,MAAa,iBAAkB,SAAQ,4BAAqB;IAA5D;;QACW,SAAI,GAAW,mBAAmB,CAAC;QAC3B,aAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAuD,CAAC;IAoDxG,CAAC;IAlDC;;;;OAIG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAqB;QAC9D,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;YACpD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;SAClD;QAED,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,UAAU,GAAG,CAAC,QAAQ,CAAC;QAC3B,IAAI,gBAAsC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAG,uDAAuD;YACtG,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChD,aAAa,IAAI,eAAe,CAAC;YACjC,oBAAoB,IAAI,eAAe,CAAC;YACxC,IAAI,CAAC,gBAAgB,IAAI,UAAU,GAAG,aAAa,EAAE;gBACnD,gBAAgB,GAAG,QAAQ,CAAC;gBAC5B,UAAU,GAAG,aAAa,CAAC;aAC5B;YACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;SACvC;QAED,IAAI,gBAAgB,EAAE;YACpB,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,GAAG,oBAAoB,CAAC,CAAC;YAClE,OAAO,gBAAgB,CAAC;SACzB;QAED,IAAA,mBAAW,GAAE,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,OAAe,EAAE,QAAkB,EAAE,UAA0B;QAC/F;QACE,4BAA4B;QAC5B,CAAC,QAAQ,CAAC,MAAM,sBAA6B,IAAI,UAAU,qBAA4B,CAAC,CAAC,kCAAkC;eACxH,CAAC,QAAQ,CAAC,MAAM,mBAA0B,IAAI,UAAU,kBAAyB,CAAC,CAAC,4BAA4B;QAClH,2BAA2B;UAC3B;YACA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;YAC1D,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC3B;SACF;IACH,CAAC;CACF;AAtDD,8CAsDC"}
@@ -0,0 +1,17 @@
1
+ import { Instance } from "../../instance";
2
+ import { StatelessLoadBalancer, StatelessLoadBalancerOptions } from "./base";
3
+ export declare type WRLoadBalancerOptions = StatelessLoadBalancerOptions;
4
+ /**
5
+ * Weight Random Load Balancer
6
+ *
7
+ * @description
8
+ * Algorithm:
9
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `W(Si)` = Si.weight
10
+ * 2. selected_value = random_value % Sum(W(S))
11
+ * 3. Sx = Pick(selected_value ∈ [Sum(W(S0)...W(Si-1)), Sum(W(S0)...W(Si))))
12
+ * 4. return Sx
13
+ */
14
+ export declare class WRLoadBalancer extends StatelessLoadBalancer {
15
+ readonly name: string;
16
+ choose(namespace: string, service: string, instances: Instance[]): Instance;
17
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WRLoadBalancer = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const base_1 = require("./base");
6
+ /**
7
+ * Weight Random Load Balancer
8
+ *
9
+ * @description
10
+ * Algorithm:
11
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `W(Si)` = Si.weight
12
+ * 2. selected_value = random_value % Sum(W(S))
13
+ * 3. Sx = Pick(selected_value ∈ [Sum(W(S0)...W(Si-1)), Sum(W(S0)...W(Si))))
14
+ * 4. return Sx
15
+ */
16
+ class WRLoadBalancer extends base_1.StatelessLoadBalancer {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.name = "WRLoadBalancer";
20
+ }
21
+ choose(namespace, service, instances) {
22
+ // #region Round 1
23
+ /*
24
+ * Round 1:
25
+ * 计算各节点实际权重
26
+ */
27
+ let totalWeight = 0;
28
+ const weights = instances.map((instance) => {
29
+ const weight = ~~this.instanceWeight(instance);
30
+ totalWeight += weight;
31
+ return weight;
32
+ });
33
+ // #endregion
34
+ // #region Round 2
35
+ const selectedValue = Math.random() * totalWeight;
36
+ let begin = 0;
37
+ let end = 0;
38
+ for (let i = 0; i < weights.length; i += 1) {
39
+ end = begin + weights[i];
40
+ if (selectedValue >= begin && selectedValue < end) {
41
+ return instances[i];
42
+ }
43
+ begin = end;
44
+ }
45
+ // #endregion
46
+ (0, utils_1.UNREACHABLE)();
47
+ }
48
+ }
49
+ exports.WRLoadBalancer = WRLoadBalancer;
50
+ //# sourceMappingURL=wr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wr.js","sourceRoot":"","sources":["../../../src/plugins/lb/wr.ts"],"names":[],"mappings":";;;AACA,uCAA0C;AAC1C,iCAA6E;AAI7E;;;;;;;;;GASG;AACH,MAAa,cAAe,SAAQ,4BAAqB;IAAzD;;QACW,SAAI,GAAW,gBAAgB,CAAC;IA+B3C,CAAC;IA7BC,MAAM,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAqB;QAC9D,kBAAkB;QAClB;;;WAGG;QACH,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACzC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC/C,WAAW,IAAI,MAAM,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,aAAa;QAEb,kBAAkB;QAClB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC;QAClD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;YAC1C,GAAG,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,aAAa,IAAI,KAAK,IAAI,aAAa,GAAG,GAAG,EAAE;gBACjD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;aACrB;YACD,KAAK,GAAG,GAAG,CAAC;SACb;QACD,aAAa;QAEb,IAAA,mBAAW,GAAE,CAAC;IAChB,CAAC;CACF;AAhCD,wCAgCC"}
@@ -0,0 +1,19 @@
1
+ import { Instance } from "../../instance";
2
+ import { StatelessLoadBalancer } from "./base";
3
+ /**
4
+ * Weighted Round-Robin Load Balancer
5
+ *
6
+ * @description
7
+ * Algorithm:
8
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `W(Si)` = Si.weight
9
+ * 2. CW(Si) = W(Si) / GCD(W(S))
10
+ * 3. remaining_value = total_calls % Sum(CW(S))
11
+ * 4. Sx = Pick(remaining_value ∈ [Sum(CW(S0)...CW(Si-1)), Sum(CW(S0)...CW(Si))))
12
+ * 5. total_calls = total_calls + 1
13
+ * 6. return Sx
14
+ */
15
+ export declare class WRRLoadBalancer extends StatelessLoadBalancer {
16
+ readonly name: string;
17
+ private readonly callStat;
18
+ choose(namespace: string, service: string, instances: Instance[]): Instance;
19
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WRRLoadBalancer = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const base_1 = require("./base");
6
+ /**
7
+ * Weighted Round-Robin Load Balancer
8
+ *
9
+ * @description
10
+ * Algorithm:
11
+ * 1. `S` = {S0, S1, S2, ..., Sn}, `W(Si)` = Si.weight
12
+ * 2. CW(Si) = W(Si) / GCD(W(S))
13
+ * 3. remaining_value = total_calls % Sum(CW(S))
14
+ * 4. Sx = Pick(remaining_value ∈ [Sum(CW(S0)...CW(Si-1)), Sum(CW(S0)...CW(Si))))
15
+ * 5. total_calls = total_calls + 1
16
+ * 6. return Sx
17
+ */
18
+ class WRRLoadBalancer extends base_1.StatelessLoadBalancer {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = "WRRLoadBalancer";
22
+ this.callStat = Object.create(null);
23
+ }
24
+ choose(namespace, service, instances) {
25
+ // #region Round 1, 预处理
26
+ /**
27
+ * 当前服务被调用次数
28
+ */
29
+ let count = this.callStat[`${namespace}.${service}`];
30
+ if (count >= 0) {
31
+ count += 1;
32
+ }
33
+ else {
34
+ count = 0;
35
+ this.randomChoose(namespace, service, instances);
36
+ }
37
+ this.callStat[`${namespace}.${service}`] = count;
38
+ /**
39
+ * 各节点实际权重
40
+ */
41
+ let weights = instances.map(instance => ~~this.instanceWeight(instance));
42
+ // #endregion
43
+ // #region Round 2
44
+ /*
45
+ * Round 2:
46
+ * 1. 计算所有权重的最大最大公约数 `gcd`
47
+ * 2. 选取每个权重的互质数 `mpn` 作为新权重
48
+ * 3. 计算新权重合
49
+ */
50
+ let totalWeight = 0;
51
+ const gcd = (0, utils_1.GreatestCommonDivisor)(...weights.filter(weight => weight !== 0));
52
+ if (!Number.isNaN(gcd)) {
53
+ weights = weights.map((weight) => {
54
+ const mpn = weight / gcd;
55
+ totalWeight += mpn;
56
+ return mpn;
57
+ });
58
+ }
59
+ // #endregion
60
+ // #region Round 3, 根据 WRR 算法选取目标节点
61
+ if (!Number.isNaN(gcd)) {
62
+ const remaining = count % totalWeight;
63
+ for (let i = 0, effect = 0; i < weights.length; i += 1) {
64
+ effect += weights[i];
65
+ if (remaining < effect) {
66
+ return instances[i];
67
+ }
68
+ }
69
+ }
70
+ else {
71
+ /**
72
+ * 当所有权重均为 0(gcd = NaN) 时,退化为 RR
73
+ */
74
+ return instances[count % instances.length];
75
+ }
76
+ (0, utils_1.UNREACHABLE)();
77
+ // #endregion
78
+ }
79
+ }
80
+ exports.WRRLoadBalancer = WRRLoadBalancer;
81
+ //# sourceMappingURL=wrr.js.map