| | |
| | | |
| | | // 设备号 -> { iotDevice, productKey, deviceName } |
| | | const deviceMap = new Map(); |
| | | const creatingMap = new Map(); |
| | | |
| | | async function ensureIotDevice(deviceNumber) { |
| | | let entry = deviceMap.get(deviceNumber); |
| | | if (entry && entry.iotDevice) { |
| | | return entry; |
| | | } |
| | | const creating = creatingMap.get(deviceNumber); |
| | | if (creating) { |
| | | return creating; |
| | | } |
| | | |
| | | try { |
| | | const creatingPromise = (async () => { |
| | | logger.info("Request Aliyun device secret", { deviceNumber }); |
| | | // 复用旧项目的 api.js 约定:第一个参数是相对路径 |
| | | const resp = await getAliyunDeviceSecret( |
| | |
| | | entry = { iotDevice, productKey, deviceName }; |
| | | deviceMap.set(deviceNumber, entry); |
| | | return entry; |
| | | })(); |
| | | |
| | | creatingMap.set(deviceNumber, creatingPromise); |
| | | |
| | | try { |
| | | return await creatingPromise; |
| | | } catch (err) { |
| | | logger.error("ensureIotDevice error", { |
| | | deviceNumber, |
| | | error: err.message || err |
| | | }); |
| | | return null; |
| | | } finally { |
| | | creatingMap.delete(deviceNumber); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | deviceMap.delete(deviceNumber); |
| | | } |
| | | creatingMap.clear(); |
| | | } |
| | | |
| | | return { |