(params: {
baseUrl: string
cdnBaseUrl: string
token: string
onMessage: OnMessageCallback
onPermissionResponse?: OnPermissionResponseCallback
abortSignal: AbortSignal
})
| 134 | } |
| 135 | |
| 136 | export async function startPollLoop(params: { |
| 137 | baseUrl: string |
| 138 | cdnBaseUrl: string |
| 139 | token: string |
| 140 | onMessage: OnMessageCallback |
| 141 | onPermissionResponse?: OnPermissionResponseCallback |
| 142 | abortSignal: AbortSignal |
| 143 | }): Promise<void> { |
| 144 | const { |
| 145 | baseUrl, |
| 146 | cdnBaseUrl, |
| 147 | token, |
| 148 | onMessage, |
| 149 | onPermissionResponse, |
| 150 | abortSignal, |
| 151 | } = params |
| 152 | let cursor = loadCursor() |
| 153 | let consecutiveErrors = 0 |
| 154 | |
| 155 | process.stderr.write('[weixin] Starting message poll loop...\n') |
| 156 | |
| 157 | while (!abortSignal.aborted) { |
| 158 | try { |
| 159 | const response = await getUpdates(baseUrl, token, cursor, abortSignal) |
| 160 | |
| 161 | if (response.errcode === -14) { |
| 162 | process.stderr.write( |
| 163 | '[weixin] Session expired (errcode -14). Pausing for 30s...\n', |
| 164 | ) |
| 165 | await new Promise(resolve => setTimeout(resolve, 30_000)) |
| 166 | continue |
| 167 | } |
| 168 | |
| 169 | if (response.ret !== 0 && response.ret !== undefined) { |
| 170 | throw new Error( |
| 171 | `getUpdates error: ret=${response.ret} errcode=${response.errcode} ${response.errmsg}`, |
| 172 | ) |
| 173 | } |
| 174 | |
| 175 | consecutiveErrors = 0 |
| 176 | |
| 177 | if (response.get_updates_buf) { |
| 178 | cursor = response.get_updates_buf |
| 179 | saveCursor(cursor) |
| 180 | } |
| 181 | |
| 182 | if (response.msgs && response.msgs.length > 0) { |
| 183 | for (const msg of response.msgs) { |
| 184 | await processMessage(msg, { |
| 185 | baseUrl, |
| 186 | cdnBaseUrl, |
| 187 | token, |
| 188 | onMessage, |
| 189 | onPermissionResponse, |
| 190 | }) |
| 191 | } |
| 192 | } |
| 193 | } catch (error) { |
no test coverage detected