1
1
import { DurableObject } from "cloudflare:workers" ;
2
2
3
- const RESPONSE_TIMEOUT = 30_000 ; // ms
3
+ const RESPONSE_TIMEOUT_MS = 30_000 ; // 30 seconds
4
4
5
5
export class MyDurableObject extends DurableObject {
6
6
// TODO: think of using a WeakMap
@@ -34,6 +34,7 @@ export class MyDurableObject extends DurableObject {
34
34
} ) ;
35
35
36
36
server . addEventListener ( "close" , ( cls : CloseEvent ) => {
37
+ this . reject ?.( new Error ( "server closed" ) ) ;
37
38
console . info ( "closing connection" , cls . code , cls . reason ) ;
38
39
server . close ( 1001 , `server closed (${ cls . code } : ${ cls . reason } )` ) ;
39
40
} ) ;
@@ -55,7 +56,6 @@ export class MyDurableObject extends DurableObject {
55
56
url : request . url ,
56
57
headers : Object . fromEntries ( request . headers . entries ( ) ) ,
57
58
} ;
58
-
59
59
this . proxyTo . send (
60
60
JSON . stringify ( {
61
61
type : "request" ,
@@ -69,7 +69,7 @@ export class MyDurableObject extends DurableObject {
69
69
this . resolve = resolve ;
70
70
this . reject = reject ;
71
71
} ) ,
72
- RESPONSE_TIMEOUT ,
72
+ RESPONSE_TIMEOUT_MS ,
73
73
) ;
74
74
} catch ( error ) {
75
75
if ( error instanceof TimeoutError ) {
@@ -83,7 +83,28 @@ export class MyDurableObject extends DurableObject {
83
83
}
84
84
85
85
message ( event : MessageEvent ) : void {
86
- this . resolve ?.( new Response ( String ( event . data ) ) ) ;
86
+ if ( typeof event . data !== "string" ) {
87
+ console . error ( "message is not a string" , typeof event . data ) ;
88
+ this . reject ?.( new Error ( "message is not a string" ) ) ;
89
+ return ;
90
+ }
91
+
92
+ const message = JSON . parse ( event . data ) ;
93
+ if ( message . type === "response" ) {
94
+ const { status, statusText, headers, body : body64 } = message . response ;
95
+
96
+ const body = atob ( body64 ) ;
97
+
98
+ this . resolve ?.(
99
+ new Response ( body , {
100
+ status,
101
+ statusText,
102
+ headers : new Headers ( headers ) ,
103
+ } ) ,
104
+ ) ;
105
+ } else {
106
+ this . reject ?.( new Error ( "unknown message type" ) ) ;
107
+ }
87
108
}
88
109
89
110
async close ( ) : Promise < Response > {
0 commit comments