From 79999195dea97e832a1f919abd700da908c7f798 Mon Sep 17 00:00:00 2001 From: Tjalle-S <91267211+Tjalle-S@users.noreply.github.com> Date: Tue, 25 Jun 2024 22:05:43 +0200 Subject: [PATCH] fix: prevent race condition --- src/base/eventListeners.ts | 9 +++++++-- src/base/index.ts | 2 +- src/internal/message.types.ts | 20 +++++++++++++------- src/react/hooks.ts | 6 +----- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/base/eventListeners.ts b/src/base/eventListeners.ts index 6e34708..8ab7a32 100644 --- a/src/base/eventListeners.ts +++ b/src/base/eventListeners.ts @@ -6,7 +6,7 @@ * (Department of Information and Computing Sciences) */ import type { Settings } from "."; -import type { ReceiveMessage, SendMessage } from "../internal"; +import type { ReadyMessage, ReceiveMessage, SendMessage } from "../internal"; /** * Performs an action every time a message of the specified type is received. @@ -36,12 +36,17 @@ export function receiveMessage< if (data.type === typeFilter) callback(data.data as TData); } + const readyMessage: ReadyMessage = { + data: undefined, + type: `${typeFilter}Ready` + }; + windowContext.addEventListener("message", updateMessage); + sendMessage(readyMessage); return () => windowContext.removeEventListener("message", updateMessage); } - /** * Performs an action every time a message with settings is received. * diff --git a/src/base/index.ts b/src/base/index.ts index c524e52..8f2c8c6 100644 --- a/src/base/index.ts +++ b/src/base/index.ts @@ -8,7 +8,7 @@ /** * @packageDocumentation Contains the basic GraphPolaris ml settings plugin API. This is required for any plugin, regardless of the framework used. - + * * @categoryDescription Message event listeners * These are functions to listen for specific types of messages arriving. */ diff --git a/src/internal/message.types.ts b/src/internal/message.types.ts index 34b563a..ab57793 100644 --- a/src/internal/message.types.ts +++ b/src/internal/message.types.ts @@ -6,9 +6,7 @@ * (Department of Information and Computing Sciences) */ -import type { - Settings -} from "../base"; +import type { Settings } from "../base"; /** * The base message type for all messages. @@ -45,18 +43,26 @@ export interface SettingsRequestMessage extends BaseMessage { data: undefined; } +/** + * A message that notifies the frontend that the add-on wants to receive data. + * + * @internal + */ +export interface ReadyMessage extends BaseMessage { + data: undefined; + type: `${ReceiveMessage["type"]}Ready`; +} + /** * The types of messages that an add-on can receive. * * @internal */ -export type ReceiveMessage = - | SettingsMessage - | SettingsRequestMessage; +export type ReceiveMessage = SettingsMessage | SettingsRequestMessage; /** * The types of messages that an add-on can send. * * @internal */ -export type SendMessage = SettingsMessage; +export type SendMessage = ReadyMessage | SettingsMessage; diff --git a/src/react/hooks.ts b/src/react/hooks.ts index 888d0c2..c5cd06b 100644 --- a/src/react/hooks.ts +++ b/src/react/hooks.ts @@ -10,11 +10,7 @@ import { createContext, useContext, useEffect, useMemo, useState } from "react"; import type { ReceiveMessage } from "../internal"; -import { - type Settings, - receiveMessage, - sendMessage -} from "../base"; +import { type Settings, receiveMessage, sendMessage } from "../base"; /** * The context for providing the window object to the hooks and components.