Skip to content

Commit 2b125d5

Browse files
committed
fix(plugin-sdk-tamagotchi): improved naming, use @moeru/eventa offered window-message adapter
1 parent 0f0d88a commit 2b125d5

8 files changed

Lines changed: 58 additions & 217 deletions

File tree

apps/stage-tamagotchi/src/renderer/widgets/extension-ui/composables/use-iframe-message-port.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1+
import type { WidgetsIframeInitPayload } from '@proj-airi/plugin-sdk-tamagotchi/widgets'
12
import type { MaybeElementRef } from '@vueuse/core'
23
import type { ComputedRef } from 'vue'
34

45
import type { PluginHostModuleSummary } from '../../../../shared/eventa/plugin/host'
56

7+
import { createContext } from '@moeru/eventa/adapters/window-message'
8+
import {
9+
widgetsIframeChannel,
10+
widgetsIframeInitEvent,
11+
widgetsIframeReadyEvent,
12+
} from '@proj-airi/plugin-sdk-tamagotchi/widgets'
613
import { unrefElement } from '@vueuse/core'
714
import { onBeforeUnmount, shallowRef, watch } from 'vue'
815

9-
import {
10-
extensionUiBridgeEventaChannel,
11-
extensionUiBridgeInitEvent,
12-
extensionUiBridgeReadyEvent,
13-
} from '../shared/eventa'
14-
import { createWindowMessageEventaContext } from '../shared/eventa-runtime'
15-
1616
/**
1717
* Manages typed parent-to-iframe messaging for one extension UI iframe.
1818
*
@@ -41,8 +41,8 @@ export function useIframeMessagePort(
4141
) {
4242
const iframeLoadError = shallowRef<string>()
4343

44-
const iframeRuntime = createWindowMessageEventaContext({
45-
channel: extensionUiBridgeEventaChannel,
44+
const iframeRuntime = createContext({
45+
channel: widgetsIframeChannel,
4646
currentWindow: window,
4747
expectedSource: () => {
4848
const iframeElement = unrefElement(target)
@@ -54,17 +54,17 @@ export function useIframeMessagePort(
5454
},
5555
})
5656

57-
function createInitPayload() {
57+
function createInitPayload(): WidgetsIframeInitPayload {
5858
return {
5959
moduleId: options.moduleSnapshot.value?.moduleId,
60-
module: options.moduleSnapshot.value,
60+
module: options.moduleSnapshot.value as unknown as Record<string, unknown> | undefined,
6161
config: options.moduleConfig.value,
6262
props: options.propsPayload.value,
6363
}
6464
}
6565

6666
function emitInitPayload() {
67-
iframeRuntime.context.emit(extensionUiBridgeInitEvent, createInitPayload())
67+
iframeRuntime.context.emit(widgetsIframeInitEvent, createInitPayload())
6868
}
6969

7070
function onIframeLoad() {
@@ -76,7 +76,7 @@ export function useIframeMessagePort(
7676
iframeLoadError.value = 'Failed to load extension UI iframe source.'
7777
}
7878

79-
iframeRuntime.context.on(extensionUiBridgeReadyEvent, () => {
79+
iframeRuntime.context.on(widgetsIframeReadyEvent, () => {
8080
emitInitPayload()
8181
})
8282

apps/stage-tamagotchi/src/renderer/widgets/extension-ui/shared/eventa-runtime.test.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1+
import { createContext } from '@moeru/eventa/adapters/window-message'
2+
import { widgetsIframeInitEvent, widgetsIframePublishEvent } from '@proj-airi/plugin-sdk-tamagotchi/widgets'
13
import { describe, expect, it } from 'vitest'
24

3-
import {
4-
extensionUiBridgeInitEvent,
5-
extensionUiBridgePublishEvent,
6-
} from './eventa'
7-
import { createWindowMessageEventaContext } from './eventa-runtime'
8-
95
class MockWindow {
106
peer?: MockWindow
117

@@ -49,13 +45,13 @@ class MockWindow {
4945

5046
/**
5147
* @example
52-
* describe('createWindowMessageEventaContext', () => {
48+
* describe('createContext', () => {
5349
* it('relays typed events between parent and iframe windows', async () => {
5450
* expect(true).toBe(true)
5551
* })
5652
* })
5753
*/
58-
describe('createWindowMessageEventaContext', () => {
54+
describe('createContext', () => {
5955
/**
6056
* @example
6157
* it('relays typed events between parent and iframe windows', async () => {
@@ -68,21 +64,21 @@ describe('createWindowMessageEventaContext', () => {
6864
parentWindow.peer = iframeWindow
6965
iframeWindow.peer = parentWindow
7066

71-
const host = createWindowMessageEventaContext({
67+
const host = createContext({
7268
channel: 'test:extension-ui',
7369
currentWindow: parentWindow as unknown as Window,
7470
expectedSource: () => iframeWindow as unknown as Window,
7571
targetWindow: () => iframeWindow as unknown as Window,
7672
})
77-
const iframe = createWindowMessageEventaContext({
73+
const iframe = createContext({
7874
channel: 'test:extension-ui',
7975
currentWindow: iframeWindow as unknown as Window,
8076
expectedSource: () => parentWindow as unknown as Window,
8177
targetWindow: () => parentWindow as unknown as Window,
8278
})
8379

8480
const initPayload = new Promise<{ moduleId: string }>((resolve) => {
85-
iframe.context.on(extensionUiBridgeInitEvent, (event) => {
81+
iframe.context.on(widgetsIframeInitEvent, (event) => {
8682
if (!event.body?.moduleId) {
8783
return
8884
}
@@ -91,7 +87,7 @@ describe('createWindowMessageEventaContext', () => {
9187
})
9288
})
9389

94-
host.context.emit(extensionUiBridgeInitEvent, {
90+
host.context.emit(widgetsIframeInitEvent, {
9591
moduleId: 'module-chess',
9692
config: {},
9793
module: undefined,
@@ -103,7 +99,7 @@ describe('createWindowMessageEventaContext', () => {
10399
}))
104100

105101
const publishedPayload = new Promise<Record<string, unknown>>((resolve) => {
106-
host.context.on(extensionUiBridgePublishEvent, (event) => {
102+
host.context.on(widgetsIframePublishEvent, (event) => {
107103
if (!event.body) {
108104
return
109105
}
@@ -112,7 +108,7 @@ describe('createWindowMessageEventaContext', () => {
112108
})
113109
})
114110

115-
iframe.context.emit(extensionUiBridgePublishEvent, {
111+
iframe.context.emit(widgetsIframePublishEvent, {
116112
topic: {
117113
namespace: 'plugin.chess',
118114
name: 'request',

apps/stage-tamagotchi/src/renderer/widgets/extension-ui/shared/eventa-runtime.ts

Lines changed: 0 additions & 141 deletions
This file was deleted.

apps/stage-tamagotchi/src/renderer/widgets/extension-ui/shared/eventa.ts

Lines changed: 0 additions & 46 deletions
This file was deleted.

packages/plugin-sdk-tamagotchi/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
"types": "./dist/index.d.mts",
2121
"default": "./dist/index.mjs"
2222
},
23-
"./extension-ui-bridge": {
24-
"types": "./dist/extension-ui-bridge/index.d.mts",
25-
"default": "./dist/extension-ui-bridge/index.mjs"
23+
"./widgets": {
24+
"types": "./dist/widgets/index.d.mts",
25+
"default": "./dist/widgets/index.mjs"
2626
},
2727
"./gamelet": {
2828
"types": "./dist/gamelet/index.d.mts",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './gamelet'
22
export * from './tools'
3+
export * from './widgets'
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { defineEventa } from '@moeru/eventa'
2+
3+
/**
4+
* Channel name shared by tamagotchi hosts and plugin iframes for extension UI Eventa traffic.
5+
*/
6+
export const widgetsIframeChannel = 'airi:widgets:ui-iframe:channel'
7+
8+
/**
9+
* Snapshot payload forwarded from the host to initialize one extension UI bridge consumer.
10+
*/
11+
export interface WidgetsIframeInitPayload {
12+
/** Active module identifier when the host already resolved one. */
13+
moduleId?: string
14+
/** Current host-side module snapshot when available. */
15+
module?: Record<string, unknown>
16+
/** Structured-clone-safe config payload mirrored from the host. */
17+
config: Record<string, unknown>
18+
/** Structured-clone-safe runtime props mirrored from the host. */
19+
props: Record<string, unknown>
20+
}
21+
22+
/**
23+
* Structured-clone-safe envelope forwarded across the extension UI bridge.
24+
*/
25+
export type WidgetsIframeEvent = Record<string, unknown>
26+
27+
export const widgetsIframeInitEvent = defineEventa<WidgetsIframeInitPayload>('eventa:event:widgets:ui-iframe:init')
28+
export const widgetsIframeReadyEvent = defineEventa<void>('eventa:event:widgets:ui-iframe:ready')
29+
export const widgetsIframePublishEvent = defineEventa<WidgetsIframeEvent>('eventa:event:widgets:ui-iframe:publish')
30+
export const widgetsIframeBroadcastEvent = defineEventa<WidgetsIframeEvent>('eventa:event:widgets:ui-iframe:broadcast')

packages/plugin-sdk-tamagotchi/tsdown.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { defineConfig } from 'tsdown'
33
export default defineConfig({
44
entry: [
55
'src/index.ts',
6+
'src/widgets/index.ts',
67
'src/gamelet/index.ts',
78
'src/tools/index.ts',
89
],

0 commit comments

Comments
 (0)