Socket.uts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // @ts-ignore
  2. import type { Callback } from '../../index.uts'
  3. type SocketInstanceData = {
  4. // @ts-ignore
  5. instance: SocketTask,
  6. isOpend: boolean,
  7. // @ts-ignore
  8. openData?: OnSocketOpenCallbackResult | null
  9. }
  10. const socketInstanceMap = new Map<string, SocketInstanceData>()
  11. export const connectSocket = (id: string, url: string, callback: Callback): void => {
  12. // @ts-ignore
  13. const socketTask = uni.connectSocket({
  14. url,
  15. success() {
  16. callback({ result: { errMsg: 'connectSocket:ok' } }, null)
  17. },
  18. fail() {
  19. callback(null, { errMsg: 'connectSocket:fail' })
  20. }
  21. })
  22. socketInstanceMap.set(id, { instance: socketTask, isOpend: false } as SocketInstanceData)
  23. // @ts-ignore
  24. socketTask.onOpen((data: OnSocketOpenCallbackResult) => {
  25. socketInstanceMap.get(id)!.isOpend = true
  26. socketInstanceMap.get(id)!.openData = data
  27. })
  28. }
  29. export type FirstSocketTaskEmitterParams = {
  30. method: string,
  31. data?: any | null,
  32. code?: number | null,
  33. reason?: string | null,
  34. }
  35. export const firstSocketTaskEmitter = (params: FirstSocketTaskEmitterParams, callback: Callback): void => {
  36. let socketInstanceData: SocketInstanceData | null = null;
  37. socketInstanceMap.forEach((value: SocketInstanceData) => {
  38. if (socketInstanceData == null) {
  39. socketInstanceData = value
  40. }
  41. })
  42. if (socketInstanceData == null) {
  43. callback(null, { errMsg: "socketTask not exists." });
  44. } else {
  45. const _socketInstanceData = socketInstanceData as SocketInstanceData
  46. const socketTask = _socketInstanceData.instance
  47. if (params.method == 'onOpen') {
  48. const isOpend = _socketInstanceData.isOpend
  49. if (isOpend) {
  50. callback(_socketInstanceData.openData, null)
  51. } else {
  52. let timer: number | null = null
  53. // @ts-ignore
  54. timer = setInterval(() => {
  55. if (_socketInstanceData.isOpend) {
  56. clearInterval(timer!)
  57. callback(_socketInstanceData.openData, null)
  58. }
  59. }, 200)
  60. setTimeout(() => {
  61. // @ts-ignore
  62. clearInterval(timer)
  63. }, 2000)
  64. }
  65. } else if (params.method == 'onMessage') {
  66. socketTask.onMessage((data: any) => {
  67. callback(data, null)
  68. })
  69. } else if (params.method == 'onClose') {
  70. socketTask.onClose((data: any) => {
  71. callback(data, null)
  72. })
  73. } else if (params.method == 'onError') {
  74. socketTask.onError((data: any) => {
  75. callback(data, null)
  76. })
  77. } else if (params.method == 'send') {
  78. socketTask.send({
  79. data: params.data!,
  80. success(result: any) {
  81. callback({ result }, null)
  82. },
  83. fail(error: any) {
  84. callback(null, error)
  85. }
  86. // @ts-ignore
  87. } as SendSocketMessageOptions)
  88. } else if (params.method == 'close') {
  89. socketTask.close({
  90. code: params.code,
  91. reason: params.reason,
  92. success(result: any) {
  93. callback({ result }, null)
  94. socketInstanceMap.clear();
  95. },
  96. fail(error: any) {
  97. callback(null, error)
  98. }
  99. // @ts-ignore
  100. } as CloseSocketOptions)
  101. }
  102. }
  103. }
  104. export type SocketEmitterParams = {
  105. id: string,
  106. method: string,
  107. data?: any | null,
  108. code?: number | null,
  109. reason?: string | null,
  110. }
  111. export const socketEmitter = (params: SocketEmitterParams, callback: Callback): void => {
  112. if (!socketInstanceMap.has(params.id)) {
  113. callback(null, { errMsg: 'socketTask not exists.' })
  114. } else {
  115. const socketInstanceData = socketInstanceMap.get(params.id)!
  116. const socketTask = socketInstanceData.instance
  117. if (params.method == 'onOpen') {
  118. const isOpend = socketInstanceData.isOpend
  119. if (isOpend) {
  120. callback({ method: 'Socket.onOpen', id: params.id, data: socketInstanceData.openData }, null)
  121. } else {
  122. let timer: number | null = null
  123. // @ts-ignore
  124. timer = setInterval(() => {
  125. if (socketInstanceData.isOpend) {
  126. clearInterval(timer!)
  127. callback({ method: 'Socket.onOpen', id: params.id, data: socketInstanceData.openData }, null)
  128. }
  129. }, 200)
  130. setTimeout(() => {
  131. // @ts-ignore
  132. clearInterval(timer)
  133. }, 2000)
  134. }
  135. } else if (params.method == 'onMessage') {
  136. socketTask.onMessage((data: any) => {
  137. callback({ method: 'Socket.onMessage', id: params.id, data }, null)
  138. })
  139. } else if (params.method == 'onClose') {
  140. socketTask.onClose((data: any) => {
  141. callback({ method: 'Socket.onClose', id: params.id, data }, null)
  142. })
  143. } else if (params.method == 'onError') {
  144. socketTask.onError((data: any) => {
  145. callback({ method: 'Socket.onError', id: params.id, data }, null)
  146. })
  147. } else if (params.method == 'send') {
  148. socketTask.send({
  149. data: params.data!,
  150. success(result: any) {
  151. callback(result, null)
  152. },
  153. fail(error: any) {
  154. callback(null, error)
  155. }
  156. // @ts-ignore
  157. } as SendSocketMessageOptions)
  158. } else if (params.method == 'close') {
  159. socketTask.close({
  160. code: params.code,
  161. reason: params.reason,
  162. success(result: any) {
  163. callback(result, null)
  164. socketInstanceMap.delete(params.id);
  165. },
  166. fail(error: any) {
  167. callback(null, error)
  168. }
  169. // @ts-ignore
  170. } as CloseSocketOptions)
  171. }
  172. }
  173. }