mirror of
https://github.com/fluencelabs/assemblyscript-dice
synced 2025-04-25 08:02:14 +00:00
136 lines
3.3 KiB
TypeScript
136 lines
3.3 KiB
TypeScript
import {JSONDecoder, JSONHandler} from "../node_modules/assemblyscript-json/assembly/decoder";
|
|
|
|
export enum Action {
|
|
Roll = 1,
|
|
Join = 2,
|
|
GetBalance = 3,
|
|
Unknown = 4,
|
|
Error = 5
|
|
}
|
|
|
|
export abstract class Request {
|
|
public action: Action = null;
|
|
|
|
clear(): void {
|
|
|
|
}
|
|
}
|
|
|
|
export class UnknownRequest extends Request {
|
|
public message: string;
|
|
|
|
constructor(message: string) {
|
|
super();
|
|
this.action = Action.Unknown;
|
|
this.message = message;
|
|
}
|
|
|
|
clear(): void {
|
|
super.clear();
|
|
memory.free(changetype<usize>(this.message));
|
|
}
|
|
|
|
}
|
|
export class JoinRequest extends Request {
|
|
constructor() {
|
|
super();
|
|
this.action = Action.Join;
|
|
}
|
|
}
|
|
export class RollRequest extends Request {
|
|
public readonly playerId: u64;
|
|
public betPlacement: u8;
|
|
public betSize: u32;
|
|
constructor(playerId: u64, betPlacement: u8, betSize: u32) {
|
|
super();
|
|
this.playerId = playerId;
|
|
this.betPlacement = betPlacement;
|
|
this.betSize = betSize;
|
|
this.action = Action.Roll;
|
|
}
|
|
|
|
clear(): void {
|
|
super.clear();
|
|
memory.free(changetype<usize>(this.playerId));
|
|
}
|
|
}
|
|
export class GetBalanceRequest extends Request {
|
|
public playerId: u64;
|
|
constructor(playerId: u64) {
|
|
super();
|
|
this.playerId = playerId;
|
|
this.action = Action.GetBalance;
|
|
}
|
|
}
|
|
|
|
export function decode(bytes: Uint8Array): Request {
|
|
let jsonHandler = new RequestJSONEventsHandler();
|
|
let decoder = new JSONDecoder<RequestJSONEventsHandler>(jsonHandler);
|
|
|
|
decoder.deserialize(bytes);
|
|
|
|
let action = jsonHandler.action;
|
|
|
|
if (!action) {
|
|
return new UnknownRequest("'action' field is not specified.")
|
|
}
|
|
|
|
let request: Request;
|
|
|
|
if (action == "Join") {
|
|
request = new JoinRequest();
|
|
} else if (action == "Roll") {
|
|
request = new RollRequest(jsonHandler.playerId, jsonHandler.betPlacement, jsonHandler.betSize)
|
|
} else if (action == "GetBalance") {
|
|
request = new GetBalanceRequest(jsonHandler.playerId)
|
|
} else {
|
|
request = new UnknownRequest("There is no request with action: " + action);
|
|
}
|
|
|
|
jsonHandler.clean();
|
|
|
|
return request;
|
|
}
|
|
|
|
class RequestJSONEventsHandler extends JSONHandler {
|
|
|
|
public action: string;
|
|
public playerId: u64;
|
|
public betPlacement: u8;
|
|
public betSize: u32;
|
|
public outcome: u8;
|
|
public playerBalance: u64;
|
|
|
|
clean(): void {
|
|
memory.free(changetype<usize>(this.action));
|
|
}
|
|
|
|
setString(name: string, value: string): void {
|
|
if (name == "action") {
|
|
this.action = value;
|
|
}
|
|
// json scheme is not strict, so we won't throw an error on excess fields
|
|
}
|
|
|
|
setInteger(name: string, value: i64): void {
|
|
|
|
if (name == "player_id") {
|
|
this.playerId = value as u64;
|
|
} else if (name == "bet_placement") {
|
|
this.betPlacement = value as u8;
|
|
} else if (name == "bet_size") {
|
|
this.betSize = value as u32;
|
|
} else if (name == "outcome") {
|
|
this.outcome = value as u8;
|
|
} else if (name == "player_balance") {
|
|
this.playerBalance = value as u64;
|
|
}
|
|
|
|
// json scheme is not strict, so we won't throw an error on excess fields
|
|
}
|
|
|
|
pushObject(name: string): bool {
|
|
return true;
|
|
}
|
|
}
|