@@ -677,6 +677,11 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
677677 // we now simply persist every time persist() is called.
678678 js_object_list : std .ArrayListUnmanaged (PersistentObject ) = .empty ,
679679
680+ // Various web APIs depend on having a persistent promise resolver. They
681+ // require for this PromiseResolver to be valid for a lifetime longer than
682+ // the function that resolves/rejects them.
683+ persisted_promise_resolvers : std .ArrayListUnmanaged (v8 .Persistent (v8 .PromiseResolver )) = .empty ,
684+
680685 // When we need to load a resource (i.e. an external script), we call
681686 // this function to get the source. This is always a reference to the
682687 // Page's fetchModuleSource, but we use a function pointer
@@ -733,6 +738,10 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
733738 p .deinit ();
734739 }
735740
741+ for (self .persisted_promise_resolvers .items ) | * p | {
742+ p .deinit ();
743+ }
744+
736745 {
737746 var it = self .module_cache .valueIterator ();
738747 while (it .next ()) | p | {
@@ -1261,11 +1270,20 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
12611270 };
12621271 }
12631272
1264- pub fn createPersistentPromiseResolver (self : * JsContext ) PersistentPromiseResolver {
1265- return .{
1266- .js_context = self ,
1267- .resolver = v8 .Persistent (v8 .PromiseResolver ).init (self .isolate , v8 .PromiseResolver .init (self .v8_context )),
1268- };
1273+ // creates a PersistentPromiseResolver, taking in a lifetime parameter.
1274+ // If the lifetime is page, the page will clean up the PersistentPromiseResolver.
1275+ // If the lifetime is self, you will be expected to deinitalize the PersistentPromiseResolver.
1276+ pub fn createPersistentPromiseResolver (
1277+ self : * JsContext ,
1278+ lifetime : enum { self , page },
1279+ ) ! PersistentPromiseResolver {
1280+ const resolver = v8 .Persistent (v8 .PromiseResolver ).init (self .isolate , v8 .PromiseResolver .init (self .v8_context ));
1281+
1282+ if (lifetime == .page ) {
1283+ try self .persisted_promise_resolvers .append (self .context_arena , resolver );
1284+ }
1285+
1286+ return .{ .js_context = self , .resolver = resolver };
12691287 }
12701288
12711289 // Probing is part of trying to map a JS value to a Zig union. There's
0 commit comments