Skip to content

Commit ef4d377

Browse files
committed
wip
1 parent c012c1b commit ef4d377

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

nordicNRPlus/processNrplusMessagesAndUpdateThingShadow.spec.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,49 @@ void describe('processNrplusMessagesAndUpdateThingShadow', () => {
215215
'updateShadow is not called',
216216
)
217217
})
218+
void it('should call ensureThing only once per thingName', async () => {
219+
const thingName = 'team1'
220+
const deviceId1 = 'device1'
221+
const deviceId2 = 'device2'
222+
const ensureThing = mock.fn(async () => {})
223+
const updateShadow = mock.fn(async () => {})
224+
const process = processNrplusMessagesAndUpdateThingShadow({
225+
ensureThing,
226+
updateShadow,
227+
})
228+
await process({
229+
messages: [
230+
{
231+
teamId: thingName,
232+
deviceId: deviceId1,
233+
messageId: '',
234+
message: { test: 'message1' },
235+
},
236+
{
237+
teamId: thingName,
238+
deviceId: deviceId1,
239+
messageId: '',
240+
message: { test: 'message2' },
241+
},
242+
{
243+
teamId: thingName,
244+
deviceId: deviceId2,
245+
messageId: '',
246+
message: { test: 'message3' },
247+
},
248+
],
249+
type: 'device.messages',
250+
timestamp: '',
251+
})
252+
assert.equal(
253+
ensureThing.mock.calls.length,
254+
2,
255+
'ensureThing is called twice',
256+
)
257+
assert.equal(
258+
updateShadow.mock.calls.length,
259+
0,
260+
'updateShadow is not called',
261+
)
262+
})
218263
})

nordicNRPlus/processNrplusMessagesAndUpdateThingShadow.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,23 @@ export const processNrplusMessagesAndUpdateThingShadow =
1515
async (
1616
validatedInput: Static<typeof inputSchemaLwm2mMessage>,
1717
): Promise<void> => {
18+
const ensuredThings = new Map<string, Promise<void>>()
1819
for (const message of validatedInput.messages) {
1920
const { teamId, deviceId } = message
2021
const thingName = `${teamId}-${deviceId}`
21-
try {
22-
await ensureThing(thingName)
23-
} catch (error) {
24-
throw new Error(
25-
`Failed to ensure thing exists: ${thingName} with the error: ${(error as Error).message}`,
26-
)
22+
let ensurePromise = ensuredThings.get(thingName)
23+
if (!ensurePromise) {
24+
ensurePromise = ensureThing(thingName).catch((error) => {
25+
// If it fails, remove it from cache to allow retries
26+
ensuredThings.delete(thingName)
27+
throw new Error(
28+
`Failed to ensure thing exists: ${thingName} with the error: ${(error as Error).message}`,
29+
)
30+
})
31+
ensuredThings.set(thingName, ensurePromise)
2732
}
33+
await ensurePromise
34+
2835
const maybeProcessedMessage = processMessage(message)
2936
if (maybeProcessedMessage === undefined) {
3037
log?.('Unhandled message:', message)

0 commit comments

Comments
 (0)