comctx
Version:
Use RPC to communicate easily across contexts in any JavaScript environment.
48 lines (37 loc) • 1.44 kB
text/typescript
import { name, description } from '../../package.json'
import './style.css'
import createElement from '../utils/createElement'
import { defineProxy } from 'comctx'
import { InjectAdapter } from '../service/adapter'
import type Counter from '../service/counter'
void (async () => {
const [, injectCounter] = defineProxy(() => ({}) as Counter, {
namespace: '__iframe-example__'
})
// Use the proxy object
const counter = injectCounter(new InjectAdapter())
const initValue = await counter.getValue()
document.querySelector<HTMLDivElement>('#app')!.insertBefore(
createElement(`
<div>
<h1>${name}</h1>
<p>${description}</p>
<div class="card">
<button data-testid="decrement" id="decrement" type="button">-</button>
<div data-testid="value" id="value">${initValue}</div>
<button data-testid="increment" id="increment" type="button">+</button>
</div>
</div>
`),
document.querySelector<HTMLDivElement>('#iframe')!
)
document.querySelector<HTMLButtonElement>('#decrement')!.addEventListener('click', async () => {
await counter.decrement()
})
document.querySelector<HTMLButtonElement>('#increment')!.addEventListener('click', async () => {
await counter.increment()
})
counter.onChange((value) => {
document.querySelector<HTMLDivElement>('#value')!.textContent = value.toString()
})
})().catch(console.error)