DDI

Actors

See Actors visualization

Direct messages

Send messages to specific actor

A

0

B

0
<ddi-postoffice id="actors-example-office">
    <div class="bg p:airy rounded flow">
        <div class="x-flow">
            <div class="box rounded:4xs">
                <h2>A</h2>
                <ddi-receiver name="a">0</ddi-receiver>
            </div>
            <div class="box rounded:4xs">
                <h2>B</h2>
                <ddi-receiver name="b">0</ddi-receiver>
            </div>
        </div>
        <ddi-sender name="c"><button>Hit me!</button></ddi-sender>
    </div>
</ddi-postoffice>

<script>
    import {
        Actor,
        initPostofficeElement,
        registerTag,
        ok,
    } from "@dynamic-type/ddi/client";

    declare module "@dynamic-type/ddi/client" {
        interface Topics {
            ping: null;
        }
    }

    initPostofficeElement();

    registerTag(
        class Receiver extends Actor {
            static tagName = "ddi-receiver";

            get value() {
                return Number(this.innerText);
            }
            set value(value: number) {
                this.innerText = String(value);
            }

            observedTopics = {
                ping: () => {
                    this.value += 1;
                    return ok();
                },
            };
        },
    );

    registerTag(
        class Sender extends Actor {
            static tagName = "ddi-sender";

            observedEvents = {
                click: () => {
                    this.send({
                        topic: "ping",
                        to: Math.random() < 0.5 ? "a" : "b",
                        payload: null,
                    });
                },
            };
        },
    );
</script>

Topics

Send messages to topics
0
<ddi-postoffice id="actors-example-office" name="topics-office">
    <div class="bg p:airy rounded flow">
        <div class="x-flow">
            <ddi-minus-button><button>-</button></ddi-minus-button>
            <ddi-plus-button><button>+</button></ddi-plus-button>
        </div>
        <ddi-counter class="center font-size:xl">0</ddi-counter>
    </div>
</ddi-postoffice>

<script>
    import {
        Actor,
        initPostofficeElement,
        registerTag,
        type Callbacks,
        ok,
    } from "@dynamic-type/ddi/client";

    declare module "@dynamic-type/ddi/client" {
        interface Topics {
            increase: number;
            decrease: number;
        }
    }

    registerTag(
        class PlusButton extends Actor {
            static tagName = "ddi-plus-button";
            observedEvents = {
                click: () => {
                    this.send({
                        topic: "increase",
                        payload: Math.random(),
                    });
                },
            };
        },
    );

    initPostofficeElement();

    registerTag(
        class Counter extends Actor {
            static tagName = "ddi-counter";

            observedTopics: Callbacks = {
                increase: (letter) => {
                    this.innerText =
                        `${Number(this.innerText) + letter.payload}`.slice(
                            0,
                            5,
                        );
                    return ok();
                },
                decrease: (letter) => {
                    this.innerText =
                        `${Number(this.innerText) - letter.payload}`.slice(
                            0,
                            5,
                        );
                    return ok();
                },
            };
        },
    );

    registerTag(
        class MinusButton extends Actor {
            static tagName = "ddi-minus-button";

            observedEvents = {
                click: () => {
                    this.send({
                        topic: "decrease",
                        payload: Math.random(),
                    });
                },
            };
        },
    );
</script>

Using Postoffice and Postbox directly

Using postboxes and a postoffice directly.
0
<div id="wrapper" class="bg p:airy rounded flow">
    <div class="x-flow">
        <button id="minus">-</button>
        <button id="plus">+</button>
    </div>
    <div id="counter" class="center font-size:xl">0</div>
</div>

<script>
    import { Postbox, Postoffice, ok } from "@dynamic-type/ddi/client";

    declare module "@dynamic-type/ddi/client" {
        interface Topics {
            increase: number;
            decrease: number;
        }
    }

    const plusButton = document.getElementById("plus")!;
    const plusBox = new Postbox().requestConnection(plusButton);
    plusButton.addEventListener("click", () => {
        plusBox.send({
            topic: "increase",
            payload: Math.random(),
        });
    });

    const wrapper = document.getElementById("wrapper")!;
    const office = new Postoffice(wrapper).activate();
    office.connect(
        new Postbox({
            increase: (letter) => {
                console.log("Letter sent", letter);
                return ok();
            },
            decrease: (letter) => {
                console.log("Letter sent", letter);
                return ok();
            },
        }),
    );

    const counter = document.getElementById("counter")!;
    new Postbox({
        increase: (letter) => {
            counter.innerText =
                `${Number(counter.innerText) + letter.payload}`.slice(0, 5);
            return ok();
        },
        decrease: (letter) => {
            counter.innerText =
                `${Number(counter.innerText) - letter.payload}`.slice(0, 5);
            return ok();
        },
    }).requestConnection(counter);

    const minusButton = document.getElementById("minus")!;
    const minusBox = new Postbox().requestConnection(minusButton);
    minusButton.addEventListener("click", () => {
        minusBox.send({
            topic: "decrease",
            payload: Math.random(),
        });
    });
</script>