summaryrefslogtreecommitdiff
path: root/packages/frontend-embed/src/post-message.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend-embed/src/post-message.ts')
-rw-r--r--packages/frontend-embed/src/post-message.ts49
1 files changed, 49 insertions, 0 deletions
diff --git a/packages/frontend-embed/src/post-message.ts b/packages/frontend-embed/src/post-message.ts
new file mode 100644
index 0000000000..fd8eb8a5d2
--- /dev/null
+++ b/packages/frontend-embed/src/post-message.ts
@@ -0,0 +1,49 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export const postMessageEventTypes = [
+ 'misskey:embed:ready',
+ 'misskey:embed:changeHeight',
+] as const;
+
+export type PostMessageEventType = typeof postMessageEventTypes[number];
+
+export interface PostMessageEventPayload extends Record<PostMessageEventType, any> {
+ 'misskey:embed:ready': undefined;
+ 'misskey:embed:changeHeight': {
+ height: number;
+ };
+}
+
+export type MiPostMessageEvent<T extends PostMessageEventType = PostMessageEventType> = {
+ type: T;
+ iframeId?: string;
+ payload?: PostMessageEventPayload[T];
+}
+
+let defaultIframeId: string | null = null;
+
+export function setIframeId(id: string): void {
+ if (defaultIframeId != null) return;
+
+ if (_DEV_) console.log('setIframeId', id);
+ defaultIframeId = id;
+}
+
+/**
+ * 親フレームにイベントを送信
+ */
+export function postMessageToParentWindow<T extends PostMessageEventType = PostMessageEventType>(type: T, payload?: PostMessageEventPayload[T], iframeId: string | null = null): void {
+ let _iframeId = iframeId;
+ if (_iframeId == null) {
+ _iframeId = defaultIframeId;
+ }
+ if (_DEV_) console.log('postMessageToParentWindow', type, _iframeId, payload);
+ window.parent.postMessage({
+ type,
+ iframeId: _iframeId,
+ payload,
+ }, '*');
+}