1- use crate :: { utils:: generic_request, Database } ;
1+ use crate :: { transaction :: TransactionPoller , utils:: generic_request, Database , Transaction } ;
22use futures_channel:: oneshot;
33use futures_util:: {
44 future:: { self , Either } ,
@@ -127,7 +127,14 @@ impl<Err: 'static> Factory<Err> {
127127 completion?;
128128 }
129129 Either :: Left ( ( evt, completion_fut) ) => {
130- on_upgrade_needed ( evt. expect ( "Closure dropped before its end of scope" ) ) . await ?;
130+ let evt = evt. expect ( "Closure dropped before its end of scope" ) ;
131+ let transaction = evt. transaction ( ) . as_sys ( ) . clone ( ) ;
132+ TransactionPoller {
133+ fut : on_upgrade_needed ( evt) ,
134+ transaction,
135+ pending_requests : 0 ,
136+ }
137+ . await ?;
131138 completion_fut. await ?;
132139 }
133140 }
@@ -147,21 +154,31 @@ impl<Err: 'static> Factory<Err> {
147154pub struct VersionChangeEvent < Err > {
148155 sys : IdbVersionChangeEvent ,
149156 db : Database < Err > ,
157+ transaction : Transaction < Err > ,
150158}
151159
152160impl < Err > VersionChangeEvent < Err > {
153161 fn from_sys ( sys : IdbVersionChangeEvent ) -> VersionChangeEvent < Err > {
154- let db_sys = sys
162+ let db_req = sys
155163 . target ( )
156164 . expect ( "IDBVersionChangeEvent had no target" )
157165 . dyn_into :: < IdbOpenDbRequest > ( )
158- . expect ( "IDBVersionChangeEvent target was not an IDBOpenDBRequest" )
166+ . expect ( "IDBVersionChangeEvent target was not an IDBOpenDBRequest" ) ;
167+ let db_sys = db_req
159168 . result ( )
160169 . expect ( "IDBOpenDBRequest had no result in its on_upgrade_needed handler" )
161170 . dyn_into :: < IdbDatabase > ( )
162171 . expect ( "IDBOpenDBRequest result was not an IDBDatabase" ) ;
172+ let transaction_sys = db_req
173+ . transaction ( )
174+ . expect ( "IDBOpenDBRequest had no associated transaction" ) ;
163175 let db = Database :: from_sys ( db_sys) ;
164- VersionChangeEvent { sys, db }
176+ let transaction = Transaction :: from_sys ( transaction_sys) ;
177+ VersionChangeEvent {
178+ sys,
179+ db,
180+ transaction,
181+ }
165182 }
166183
167184 /// The version before the database upgrade, clamped to `u32::MAX`
@@ -184,4 +201,11 @@ impl<Err> VersionChangeEvent<Err> {
184201 pub fn database ( & self ) -> & Database < Err > {
185202 & self . db
186203 }
204+
205+ /// The `versionchange` transaction that triggered this event
206+ ///
207+ /// This transaction can be used to submit further requests.
208+ pub fn transaction ( & self ) -> & Transaction < Err > {
209+ & self . transaction
210+ }
187211}
0 commit comments