improve ping-pong test
This commit is contained in:
Vendored
+8
-3
@@ -15,6 +15,9 @@
|
|||||||
var Goto = function(targetStateName) {
|
var Goto = function(targetStateName) {
|
||||||
return { type: "Goto", targetStateName };
|
return { type: "Goto", targetStateName };
|
||||||
};
|
};
|
||||||
|
var Context = function(fn) {
|
||||||
|
return { type: "ContextMutation", fn };
|
||||||
|
};
|
||||||
function interpret(machine, options) {
|
function interpret(machine, options) {
|
||||||
let { state, context } = options;
|
let { state, context } = options;
|
||||||
if (typeof state === "undefined") {
|
if (typeof state === "undefined") {
|
||||||
@@ -86,11 +89,11 @@
|
|||||||
send(ctx.clientActor, ["received-response", self]);
|
send(ctx.clientActor, ["received-response", self]);
|
||||||
};
|
};
|
||||||
var startTimer = async (ctx, e, self) => {
|
var startTimer = async (ctx, e, self) => {
|
||||||
await wait(500);
|
await wait(1500);
|
||||||
send(self, ["timer-finished", null]);
|
send(self, ["timer-finished", null]);
|
||||||
};
|
};
|
||||||
var log = (ctx, e, self) => {
|
var log = (ctx, e, self) => {
|
||||||
console.log(self.state);
|
console.log(self.state, ctx);
|
||||||
};
|
};
|
||||||
var client = Machine(
|
var client = Machine(
|
||||||
State(
|
State(
|
||||||
@@ -113,6 +116,7 @@
|
|||||||
"entry",
|
"entry",
|
||||||
SideEffect(log),
|
SideEffect(log),
|
||||||
SideEffect(makeRequest),
|
SideEffect(makeRequest),
|
||||||
|
Context((ctx) => ({ ...ctx, requestsMade: ctx.requestsMade + 1 })),
|
||||||
Goto("awaiting-response")
|
Goto("awaiting-response")
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@@ -125,6 +129,7 @@
|
|||||||
On(
|
On(
|
||||||
"received-response",
|
"received-response",
|
||||||
SideEffect(log),
|
SideEffect(log),
|
||||||
|
Context((ctx) => ({ ...ctx, responsesReceived: ctx.responsesReceived + 1 })),
|
||||||
Goto("making-request")
|
Goto("making-request")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -158,7 +163,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
var clientActor = interpret(client, { context: {} });
|
var clientActor = interpret(client, { context: { requestsMade: 0, responsesReceived: 0 } });
|
||||||
var serverActor = interpret(server, { context: {} });
|
var serverActor = interpret(server, { context: {} });
|
||||||
send(clientActor, ["server-created", serverActor]);
|
send(clientActor, ["server-created", serverActor]);
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -1,21 +1,10 @@
|
|||||||
import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, interpret, Interpreter_T, send, Event_T } from '../index';
|
import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, interpret, Interpreter_T, send, Event_T, Context } from '../index';
|
||||||
|
|
||||||
const wait = (ms:number)=>new Promise((resolve)=>{ setTimeout(()=>{ resolve(1); }, ms); });
|
const wait = (ms:number)=>new Promise((resolve)=>{ setTimeout(()=>{ resolve(1); }, ms); });
|
||||||
const makeRequest = (ctx,e,self)=>{ send(ctx.serverActor, ['received-request',self]); };
|
const makeRequest = (ctx,e,self)=>{ send(ctx.serverActor, ['received-request',self]); };
|
||||||
const sendResponse = (ctx,e,self)=>{ send(ctx.clientActor, ['received-response',self]); };
|
const sendResponse = (ctx,e,self)=>{ send(ctx.clientActor, ['received-response',self]); };
|
||||||
const startTimer = async (ctx,e,self)=>{ await wait(500); send(self, ['timer-finished',null]); }
|
const startTimer = async (ctx,e,self)=>{ await wait(1500); send(self, ['timer-finished',null]); }
|
||||||
const log = (ctx, e, self:Interpreter_T)=>{ console.log(self.state); };
|
const log = (ctx, e, self:Interpreter_T)=>{ console.log(self.state, ctx); };
|
||||||
|
|
||||||
type Sc =
|
|
||||||
| 'idle'
|
|
||||||
| 'making-request'
|
|
||||||
| 'awaiting-response';
|
|
||||||
type Ec =
|
|
||||||
| ['entry',null]
|
|
||||||
| ['received-response',Interpreter_T]
|
|
||||||
| ['server-created', Interpreter_T];
|
|
||||||
type Cc =
|
|
||||||
| {serverActor?:Interpreter_T};
|
|
||||||
|
|
||||||
const client =
|
const client =
|
||||||
Machine(
|
Machine(
|
||||||
@@ -32,6 +21,7 @@ const client =
|
|||||||
On('entry',
|
On('entry',
|
||||||
SideEffect(log),
|
SideEffect(log),
|
||||||
SideEffect(makeRequest),
|
SideEffect(makeRequest),
|
||||||
|
Context((ctx)=>({...ctx, requestsMade: ctx.requestsMade+1})),
|
||||||
Goto('awaiting-response')
|
Goto('awaiting-response')
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -41,20 +31,12 @@ const client =
|
|||||||
),
|
),
|
||||||
On('received-response',
|
On('received-response',
|
||||||
SideEffect(log),
|
SideEffect(log),
|
||||||
|
Context((ctx)=>({...ctx, responsesReceived: ctx.responsesReceived+1})),
|
||||||
Goto('making-request')
|
Goto('making-request')
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
type Ss =
|
|
||||||
| 'awaiting-request'
|
|
||||||
| 'sending-response';
|
|
||||||
type Es =
|
|
||||||
| ['entry',null]
|
|
||||||
| ['received-request',Interpreter_T]
|
|
||||||
| ['timer-finished', null];
|
|
||||||
type Cs = {clientActor?:Interpreter_T};
|
|
||||||
|
|
||||||
const server =
|
const server =
|
||||||
Machine(
|
Machine(
|
||||||
State('awaiting-request',
|
State('awaiting-request',
|
||||||
@@ -78,6 +60,6 @@ const server =
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
const clientActor = interpret(client, {context:{}});
|
const clientActor = interpret(client, {context:{requestsMade:0, responsesReceived:0}});
|
||||||
const serverActor = interpret(server, {context:{}});
|
const serverActor = interpret(server, {context:{}});
|
||||||
send(clientActor, ['server-created', serverActor]);
|
send(clientActor, ['server-created', serverActor]);
|
||||||
Reference in New Issue
Block a user