Skip to content

Commit ead11ba

Browse files
authored
WIP fixing fetch in behavior charm (#254)
* first pass at fixing fetch * re-add blankstate * re-add blankstate
1 parent 92a3bd4 commit ead11ba

File tree

2 files changed

+26
-31
lines changed

2 files changed

+26
-31
lines changed

typescript/packages/lookslike-high-level/src/effects/fetch.tsx

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
refer,
55
Reference,
66
Instruction,
7+
Session,
78
Task,
89
Fact,
910
h,
@@ -20,28 +21,26 @@ type State =
2021
| { status: "Receiving"; source: Fetch; content: Promise<{}> }
2122
| { status: "Complete"; source: Fetch; content: {} };
2223

23-
const effects = new WeakMap<Reference, State>();
24-
2524
export default service({
2625
send: {
2726
select: {
2827
request: $.request,
2928
},
3029
where: [{ Case: [provider, `~/send`, $.request] }],
3130
*perform({ request }: { request: Reference }): Task.Task<Instruction[]> {
32-
const effect = effects.get(request);
31+
const effect = Session.resolve<State>(request);
3332
if (effect?.status === "Open") {
34-
effects.set(request, {
33+
const state = {
3534
status: "Sending",
3635
source: effect.source,
3736
response: globalThis.fetch(effect.source.request),
38-
});
37+
}
3938

4039
return [
4140
{ Retract: [provider, "~/send", request] },
42-
{ Upsert: [provider, "~/receive", request] },
43-
{ Upsert: [request, "request/status", "Sending"] },
44-
{ Upsert: [effect.source.consumer, effect.source.port, request] },
41+
{ Upsert: [provider, "~/receive", state as any] },
42+
{ Upsert: [effect.source.consumer, effect.source.port, effect.source.id] },
43+
{ Upsert: [effect.source.id, "request/status", "Sending"] },
4544
];
4645
}
4746
return [];
@@ -53,7 +52,7 @@ export default service({
5352
},
5453
where: [{ Case: [provider, `~/receive`, $.request] }],
5554
*perform({ request }: { request: Reference }) {
56-
const effect = effects.get(request);
55+
const effect = Session.resolve<State>(request);
5756
if (effect?.status === "Sending") {
5857
const response = yield* Task.wait(effect.response);
5958
const { expect } = effect.source;
@@ -64,18 +63,18 @@ export default service({
6463
? response.json()
6564
: response.arrayBuffer();
6665

67-
effects.set(request, {
66+
const state = {
6867
status: "Receiving",
6968
source: effect.source,
7069
content,
71-
});
70+
}
7271

7372
return [
7473
{ Retract: [provider, "~/receive", request] },
75-
{ Upsert: [provider, `~/complete`, request] },
76-
{ Upsert: [request, "request/status", "Receiving"] },
77-
{ Upsert: [request, "response/status/code", response.status] },
78-
{ Upsert: [request, "response/status/text", response.statusText] },
74+
{ Upsert: [provider, `~/complete`, state as any] },
75+
{ Upsert: [effect.source.id, "request/status", "Receiving"] },
76+
{ Upsert: [effect.source.id, "response/status/code", response.status] },
77+
{ Upsert: [effect.source.id, "response/status/text", response.statusText] },
7978
];
8079
}
8180

@@ -89,18 +88,17 @@ export default service({
8988
where: [{ Case: [provider, `~/complete`, $.request] }],
9089
*perform({ request }: { request: Reference }) {
9190
const changes: Instruction[] = [];
92-
const effect = effects.get(request);
91+
const effect = Session.resolve<State>(request);
9392
if (effect?.status === "Receiving") {
9493
const content = yield* Task.wait(effect.content);
95-
effects.delete(request);
9694
changes.push(
9795
{ Retract: [provider, `~/complete`, request] },
9896
{ Assert: [provider, "effect/log", request] },
99-
{ Upsert: [request, "request/status", "Complete"] },
97+
{ Upsert: [effect.source.id, "request/status", "Complete"] },
10098
);
10199

102100
if (effect.source.expect === "json") {
103-
const id = refer(content);
101+
const id = refer(content); // NOTE(ja):
104102
changes.push(
105103
{ Import: content },
106104
{ Upsert: [request, `response/json`, id] },
@@ -260,6 +258,7 @@ export class Fetch {
260258
port: string;
261259
request: Request;
262260
expect: Expect;
261+
id: Reference;
263262
constructor(
264263
consumer: Reference,
265264
port: string,
@@ -270,10 +269,7 @@ export class Fetch {
270269
this.port = port;
271270
this.request = request;
272271
this.expect = expect;
273-
}
274-
275-
get Assert(): Fact {
276-
const request = refer({
272+
this.id = refer({
277273
provider,
278274
consumer: this.consumer,
279275
port: this.port,
@@ -287,10 +283,10 @@ export class Fetch {
287283
expect: this.expect,
288284
},
289285
});
286+
}
290287

291-
effects.set(request, { status: "Open", source: this });
292-
293-
return [provider, `~/send`, request];
288+
get Assert(): Fact {
289+
return [provider, `~/send`, { status: "Open", source: this } as any];
294290
}
295291

296292
text() {

typescript/packages/lookslike-high-level/src/spells/fetcher.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
$,
55
Reference,
66
select,
7-
View,
7+
Session,
88
} from "@commontools/common-system";
99

1010
import { fetch } from "../effects/fetch.js";
@@ -23,7 +23,7 @@ export default behavior({
2323
.match($.self, "url", $.url)
2424
// name here is the subview id
2525
.render(({ self, url }) => (
26-
<div>
26+
<div title="Fetcher Form">
2727
<common-input value={url} oncommon-input="~/on/change-url" />
2828
<button onclick="~/on/send-request">Fetch</button>
2929
</div>
@@ -66,8 +66,7 @@ export default behavior({
6666
.not(q => q.match($.request, "response/json", $._))
6767
.render(({ self, status, url }) => (
6868
<div title="Effect Demo" entity={self}>
69-
<h1>Pending</h1>
70-
{status}
69+
<h1>{status}</h1>
7170
<button onclick="~/on/reset">Reset</button>
7271
</div>
7372
)).commit(),
@@ -98,7 +97,7 @@ export default behavior({
9897
.match($.self, "~/on/change-url", $.event)
9998
.upsert(({ self, event }) => {
10099
// common-input gives us events with easy to read values
101-
return [self, 'url', event.detail.value]
100+
return [self, 'url', Session.resolve<CommonInputEvent>(event).detail.value]
102101
})
103102
.commit(),
104103
});

0 commit comments

Comments
 (0)