@t3ams/games-host 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/host.d.ts +31 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +88 -0
- package/dist/host.js.map +1 -0
- package/package.json +38 -0
package/dist/host.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DelegatedChildSessionInfo, DelegatedChildSessionRequest, DelegatedHostPortOptions, GameCapabilityBridge, GameCapabilityBridgeOptions, GameStateUpdate, HostContext, HostContext as HostContext$1, T3amsGameMeta, T3amsJson, T3amsPlayer, T3amsSessionInfo, T3amsTurn, createGameCapabilityBridge, waitForDelegatedHostPort } from "@t3ams/sdk";
|
|
2
|
+
|
|
3
|
+
//#region src/bridge.d.ts
|
|
4
|
+
interface GameHostBridge {
|
|
5
|
+
deliverMessage(from: string, data: T3amsJson): void;
|
|
6
|
+
updateRoster(roster: readonly T3amsPlayer[]): void;
|
|
7
|
+
close(): void;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
}
|
|
10
|
+
interface GameHostBridgeOptions {
|
|
11
|
+
readonly iframe: HTMLIFrameElement;
|
|
12
|
+
readonly gameOrigin: string;
|
|
13
|
+
readonly session: T3amsSessionInfo;
|
|
14
|
+
readonly player: T3amsPlayer;
|
|
15
|
+
readonly roster: readonly T3amsPlayer[];
|
|
16
|
+
readonly game: T3amsGameMeta;
|
|
17
|
+
readonly hostContext?: HostContext$1;
|
|
18
|
+
readonly onReady: () => void;
|
|
19
|
+
readonly onSend: (data: T3amsJson) => void;
|
|
20
|
+
readonly onState: (update: {
|
|
21
|
+
status: GameStateUpdate;
|
|
22
|
+
detail?: string;
|
|
23
|
+
turn?: T3amsTurn;
|
|
24
|
+
}) => void;
|
|
25
|
+
readonly onResult: (summary: string) => void;
|
|
26
|
+
readonly onExit: () => void;
|
|
27
|
+
}
|
|
28
|
+
declare function createGameHostBridge(opts: GameHostBridgeOptions): GameHostBridge;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { type DelegatedChildSessionInfo, type DelegatedChildSessionRequest, type DelegatedHostPortOptions, type GameCapabilityBridge, type GameCapabilityBridgeOptions, type GameHostBridge, type GameHostBridgeOptions, type HostContext, createGameCapabilityBridge, createGameHostBridge, waitForDelegatedHostPort };
|
|
31
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","names":[],"sources":["../src/bridge.ts"],"mappings":";;;UAYiB,cAAA;EACf,cAAA,CAAe,IAAA,UAAc,IAAA,EAAM,SAAA;EACnC,YAAA,CAAa,MAAA,WAAiB,WAAA;EAC9B,KAAA;EACA,OAAA;AAAA;AAAA,UAGe,qBAAA;EAAA,SACN,MAAA,EAAQ,iBAAA;EAAA,SACR,UAAA;EAAA,SACA,OAAA,EAAS,gBAAA;EAAA,SACT,MAAA,EAAQ,WAAA;EAAA,SACR,MAAA,WAAiB,WAAA;EAAA,SACjB,IAAA,EAAM,aAAA;EAAA,SACN,WAAA,GAAc,aAAA;EAAA,SAEd,OAAA;EAAA,SACA,MAAA,GAAS,IAAA,EAAM,SAAA;EAAA,SACf,OAAA,GAAU,MAAA;IACjB,MAAA,EAAQ,eAAA;IACR,MAAA;IACA,IAAA,GAAO,SAAA;EAAA;EAAA,SAEA,QAAA,GAAW,OAAA;EAAA,SACX,MAAA;AAAA;AAAA,iBAGK,oBAAA,CACd,IAAA,EAAM,qBAAA,GACL,cAAA"}
|
package/dist/host.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createGameCapabilityBridge, parseGameToHostMessage, waitForDelegatedHostPort } from "@t3ams/sdk";
|
|
2
|
+
|
|
3
|
+
//#region src/bridge.ts
|
|
4
|
+
function createGameHostBridge(opts) {
|
|
5
|
+
let disposed = false;
|
|
6
|
+
let resultSent = false;
|
|
7
|
+
let roster = opts.roster;
|
|
8
|
+
function post(message) {
|
|
9
|
+
if (disposed) return;
|
|
10
|
+
opts.iframe.contentWindow?.postMessage(message, opts.gameOrigin);
|
|
11
|
+
}
|
|
12
|
+
function handleMessage(event) {
|
|
13
|
+
if (disposed) return;
|
|
14
|
+
if (event.source !== opts.iframe.contentWindow) return;
|
|
15
|
+
if (event.origin !== opts.gameOrigin) return;
|
|
16
|
+
const parsed = parseGameToHostMessage(event.data);
|
|
17
|
+
if (parsed === null) return;
|
|
18
|
+
switch (parsed.type) {
|
|
19
|
+
case "ready":
|
|
20
|
+
post({
|
|
21
|
+
t3ams: 1,
|
|
22
|
+
type: "hello",
|
|
23
|
+
protocolVersion: 1,
|
|
24
|
+
session: opts.session,
|
|
25
|
+
player: opts.player,
|
|
26
|
+
roster,
|
|
27
|
+
game: opts.game,
|
|
28
|
+
...opts.hostContext !== void 0 ? { hostContext: opts.hostContext } : {}
|
|
29
|
+
});
|
|
30
|
+
opts.onReady();
|
|
31
|
+
return;
|
|
32
|
+
case "send":
|
|
33
|
+
opts.onSend(parsed.data);
|
|
34
|
+
return;
|
|
35
|
+
case "state":
|
|
36
|
+
if (opts.session.role !== "host") return;
|
|
37
|
+
opts.onState({
|
|
38
|
+
status: parsed.status,
|
|
39
|
+
...parsed.detail !== void 0 ? { detail: parsed.detail } : {},
|
|
40
|
+
...parsed.turn !== void 0 ? { turn: parsed.turn } : {}
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
case "result":
|
|
44
|
+
if (opts.session.role !== "host") return;
|
|
45
|
+
if (resultSent) return;
|
|
46
|
+
resultSent = true;
|
|
47
|
+
opts.onResult(parsed.summary);
|
|
48
|
+
return;
|
|
49
|
+
case "exit":
|
|
50
|
+
opts.onExit();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
window.addEventListener("message", handleMessage);
|
|
55
|
+
return {
|
|
56
|
+
deliverMessage(from, data) {
|
|
57
|
+
post({
|
|
58
|
+
t3ams: 1,
|
|
59
|
+
type: "message",
|
|
60
|
+
from,
|
|
61
|
+
data
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
updateRoster(nextRoster) {
|
|
65
|
+
roster = nextRoster;
|
|
66
|
+
post({
|
|
67
|
+
t3ams: 1,
|
|
68
|
+
type: "roster",
|
|
69
|
+
roster
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
close() {
|
|
73
|
+
post({
|
|
74
|
+
t3ams: 1,
|
|
75
|
+
type: "close"
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
dispose() {
|
|
79
|
+
if (disposed) return;
|
|
80
|
+
disposed = true;
|
|
81
|
+
window.removeEventListener("message", handleMessage);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
87
|
+
export { createGameCapabilityBridge, createGameHostBridge, waitForDelegatedHostPort };
|
|
88
|
+
//# sourceMappingURL=host.js.map
|
package/dist/host.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","names":[],"sources":["../src/bridge.ts"],"sourcesContent":["import {\n parseGameToHostMessage,\n type GameStateUpdate,\n type HostToGameMessage,\n type HostContext,\n type T3amsJson,\n type T3amsPlayer,\n type T3amsSessionInfo,\n type T3amsGameMeta,\n type T3amsTurn,\n} from \"@t3ams/sdk\";\n\nexport interface GameHostBridge {\n deliverMessage(from: string, data: T3amsJson): void;\n updateRoster(roster: readonly T3amsPlayer[]): void;\n close(): void;\n dispose(): void;\n}\n\nexport interface GameHostBridgeOptions {\n readonly iframe: HTMLIFrameElement;\n readonly gameOrigin: string;\n readonly session: T3amsSessionInfo;\n readonly player: T3amsPlayer;\n readonly roster: readonly T3amsPlayer[];\n readonly game: T3amsGameMeta;\n readonly hostContext?: HostContext;\n\n readonly onReady: () => void;\n readonly onSend: (data: T3amsJson) => void;\n readonly onState: (update: {\n status: GameStateUpdate;\n detail?: string;\n turn?: T3amsTurn;\n }) => void;\n readonly onResult: (summary: string) => void;\n readonly onExit: () => void;\n}\n\nexport function createGameHostBridge(\n opts: GameHostBridgeOptions,\n): GameHostBridge {\n let disposed = false;\n let resultSent = false;\n let roster = opts.roster;\n\n function post(message: HostToGameMessage): void {\n if (disposed) return;\n opts.iframe.contentWindow?.postMessage(message, opts.gameOrigin);\n }\n\n function handleMessage(event: MessageEvent): void {\n if (disposed) return;\n if (event.source !== opts.iframe.contentWindow) return;\n if (event.origin !== opts.gameOrigin) return;\n const parsed = parseGameToHostMessage(event.data);\n if (parsed === null) return;\n\n switch (parsed.type) {\n case \"ready\":\n post({\n t3ams: 1,\n type: \"hello\",\n protocolVersion: 1,\n session: opts.session,\n player: opts.player,\n roster,\n game: opts.game,\n ...(opts.hostContext !== undefined\n ? { hostContext: opts.hostContext }\n : {}),\n });\n opts.onReady();\n return;\n case \"send\":\n opts.onSend(parsed.data);\n return;\n case \"state\":\n if (opts.session.role !== \"host\") return;\n opts.onState({\n status: parsed.status,\n ...(parsed.detail !== undefined ? { detail: parsed.detail } : {}),\n ...(parsed.turn !== undefined ? { turn: parsed.turn } : {}),\n });\n return;\n case \"result\":\n if (opts.session.role !== \"host\") return;\n if (resultSent) return;\n resultSent = true;\n opts.onResult(parsed.summary);\n return;\n case \"exit\":\n opts.onExit();\n return;\n }\n }\n\n window.addEventListener(\"message\", handleMessage);\n\n return {\n deliverMessage(from, data) {\n post({ t3ams: 1, type: \"message\", from, data });\n },\n updateRoster(nextRoster) {\n roster = nextRoster;\n post({ t3ams: 1, type: \"roster\", roster });\n },\n close() {\n post({ t3ams: 1, type: \"close\" });\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n window.removeEventListener(\"message\", handleMessage);\n },\n };\n}\n"],"mappings":";;;AAuCA,SAAgB,qBACd,MACgB;CAChB,IAAI,WAAW;CACf,IAAI,aAAa;CACjB,IAAI,SAAS,KAAK;CAElB,SAAS,KAAK,SAAkC;AAC9C,MAAI,SAAU;AACd,OAAK,OAAO,eAAe,YAAY,SAAS,KAAK,WAAW;;CAGlE,SAAS,cAAc,OAA2B;AAChD,MAAI,SAAU;AACd,MAAI,MAAM,WAAW,KAAK,OAAO,cAAe;AAChD,MAAI,MAAM,WAAW,KAAK,WAAY;EACtC,MAAM,SAAS,uBAAuB,MAAM,KAAK;AACjD,MAAI,WAAW,KAAM;AAErB,UAAQ,OAAO,MAAf;GACE,KAAK;AACH,SAAK;KACH,OAAO;KACP,MAAM;KACN,iBAAiB;KACjB,SAAS,KAAK;KACd,QAAQ,KAAK;KACb;KACA,MAAM,KAAK;KACX,GAAI,KAAK,gBAAgB,SACrB,EAAE,aAAa,KAAK,aAAa,GACjC,EAAE;KACP,CAAC;AACF,SAAK,SAAS;AACd;GACF,KAAK;AACH,SAAK,OAAO,OAAO,KAAK;AACxB;GACF,KAAK;AACH,QAAI,KAAK,QAAQ,SAAS,OAAQ;AAClC,SAAK,QAAQ;KACX,QAAQ,OAAO;KACf,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;KAChE,GAAI,OAAO,SAAS,SAAY,EAAE,MAAM,OAAO,MAAM,GAAG,EAAE;KAC3D,CAAC;AACF;GACF,KAAK;AACH,QAAI,KAAK,QAAQ,SAAS,OAAQ;AAClC,QAAI,WAAY;AAChB,iBAAa;AACb,SAAK,SAAS,OAAO,QAAQ;AAC7B;GACF,KAAK;AACH,SAAK,QAAQ;AACb;;;AAIN,QAAO,iBAAiB,WAAW,cAAc;AAEjD,QAAO;EACL,eAAe,MAAM,MAAM;AACzB,QAAK;IAAE,OAAO;IAAG,MAAM;IAAW;IAAM;IAAM,CAAC;;EAEjD,aAAa,YAAY;AACvB,YAAS;AACT,QAAK;IAAE,OAAO;IAAG,MAAM;IAAU;IAAQ,CAAC;;EAE5C,QAAQ;AACN,QAAK;IAAE,OAAO;IAAG,MAAM;IAAS,CAAC;;EAEnC,UAAU;AACR,OAAI,SAAU;AACd,cAAW;AACX,UAAO,oBAAoB,WAAW,cAAc;;EAEvD"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@t3ams/games-host",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/host.d.ts",
|
|
8
|
+
"import": "./dist/host.js"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/host.js",
|
|
12
|
+
"types": "./dist/host.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/paritytech/t3ams-games-sdk",
|
|
22
|
+
"directory": "packages/typescript/host"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsdown",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"typecheck": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@t3ams/sdk": "0.1.4"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22",
|
|
34
|
+
"tsdown": "^0.20.1",
|
|
35
|
+
"typescript": "^5.9.3",
|
|
36
|
+
"vitest": "^4.0.18"
|
|
37
|
+
}
|
|
38
|
+
}
|