77using System . Collections . Concurrent ;
88using System . Reflection ;
99using Magic . IndexedDb . LinqTranslation . Interfaces ;
10+ using System . Diagnostics ;
11+ using System . Threading ;
1012
1113namespace Magic . IndexedDb . Factories
1214{
1315 internal class MagicDbFactory : IMagicIndexedDb , IAsyncDisposable
1416 {
15- internal MagicDbFactory ( long jsMessageSizeBytes )
17+ // null value indicates that the factory is disposed
18+ Lazy < Task < IJSObjectReference > > ? _jsModule ;
19+ Lazy < Task < IndexedDbManager > > _magicJsManager ;
20+ public MagicDbFactory ( IJSRuntime jSRuntime , long jsMessageSizeBytes )
1621 {
17- Cache . JsMessageSizeBytes = jsMessageSizeBytes ;
18- }
19-
20- Lazy < Task < IJSObjectReference > > ? _jsRuntime ;
21- readonly IServiceProvider _serviceProvider ;
22- public static IndexedDbManager ? _MagicJsManager { get ; set ; } = null ;
23- private IJSObjectReference ? _cachedJsModule ; // Shared JS module instance
24- public MagicDbFactory ( IServiceProvider serviceProvider , IJSRuntime jSRuntime , long jsMessageSizeBytes )
25- {
26- _serviceProvider = serviceProvider ;
27- this . _jsRuntime = new ( ( ) => jSRuntime . InvokeAsync < IJSObjectReference > (
22+ this . _jsModule = new ( ( ) => jSRuntime . InvokeAsync < IJSObjectReference > (
2823 "import" ,
29- "./_content/Magic.IndexedDb/magicDbMethods.js" ) . AsTask ( ) ) ;
30- }
24+ "./_content/Magic.IndexedDb/magicDbMethods.js" ) . AsTask ( ) ,
25+ isThreadSafe : true ) ;
3126
32- /// <summary >
33- /// Get or initialize the shared JavaScript module.
34- /// </summary>
35- private async Task < IJSObjectReference > GetJsModuleAsync ( )
36- {
37- if ( _cachedJsModule is not null )
38- return _cachedJsModule ;
27+ this . _magicJsManager = new ( async ( ) = >
28+ {
29+ var jsModule = await this . _jsModule . Value ;
30+
31+ var dbSchemas = SchemaHelper . GetAllSchemas ( ) ;
32+ // Create & Open the database (formerly in IndexedDbManager )
33+ var manager = new IndexedDbManager ( jsModule ) ;
3934
40- _cachedJsModule = await _jsRuntime . Value ;
41- return _cachedJsModule ;
35+ var dbSets = SchemaHelper . GetAllIndexedDbSets ( ) ;
36+
37+ if ( dbSets != null )
38+ {
39+ foreach ( var dbSet in dbSets )
40+ {
41+ await new MagicJsInvoke ( jsModule ) . CallJsAsync ( Cache . MagicDbJsImportPath ,
42+ IndexedDbFunctions . CREATE_LEGACY , default ,
43+ new TypedArgument < DbStore > ( new DbStore ( )
44+ {
45+ Name = dbSet . DatabaseName ,
46+ Version = 1 ,
47+ StoreSchemas = dbSchemas
48+ } ) ) ;
49+ }
50+ }
51+ else
52+ {
53+ Console . WriteLine ( "No IndexedDbSet found and/or no found IMagicRepository." ) ;
54+ }
55+ return manager ;
56+ } ,
57+ isThreadSafe : true ) ;
4258 }
4359
4460 public async ValueTask DisposeAsync ( )
4561 {
46- var js = _jsRuntime ;
47- _jsRuntime = null ;
62+ var js = _jsModule ;
63+ _jsModule = null ;
4864
4965 if ( js is null || ! js . IsValueCreated )
5066 return ;
@@ -79,58 +95,23 @@ public async ValueTask DisposeAsync()
7995 }
8096 }
8197
82- /// <summary>
83- /// Ensure a database is opened and properly associated with the shared JS module.
84- /// </summary>
85- private async ValueTask < IndexedDbManager > GetOrCreateDatabaseAsync ( CancellationToken cancellationToken = default )
86- {
87- if ( _MagicJsManager != null )
88- return _MagicJsManager ; // Return cached instance
89-
90- var jsModule = await GetJsModuleAsync ( ) ; // Ensure shared JS module is ready
91-
92- var dbSchemas = SchemaHelper . GetAllSchemas ( ) ;
93- // Create & Open the database (formerly in IndexedDbManager)
94- var manager = new IndexedDbManager ( jsModule ) ;
95-
96- var dbSets = SchemaHelper . GetAllIndexedDbSets ( ) ;
97-
98- if ( dbSets != null )
99- {
100- foreach ( var dbSet in dbSets )
101- {
102- await new MagicJsInvoke ( jsModule ) . CallJsAsync ( Cache . MagicDbJsImportPath ,
103- IndexedDbFunctions . CREATE_LEGACY , cancellationToken ,
104- new TypedArgument < DbStore > ( new DbStore ( )
105- {
106- Name = dbSet . DatabaseName ,
107- Version = 1 ,
108- StoreSchemas = dbSchemas
109- } ) ) ;
110- }
111- }
112- else
113- {
114- Console . WriteLine ( "No IndexedDbSet found and/or no found IMagicRepository." ) ;
115- }
116- _MagicJsManager = manager ; // Cache the opened database
117- return _MagicJsManager ;
118- }
119-
120-
12198 /// <summary>
12299 /// Get storage estimate using the shared JS module.
123100 /// </summary>
124101 public async Task < QuotaUsage > GetStorageEstimateAsync ( CancellationToken cancellationToken = default )
125102 {
126- var jsModule = await GetJsModuleAsync ( ) ; // Shared JS module reference
103+ ObjectDisposedException . ThrowIf ( this . _jsModule is null , this ) ;
104+
105+ var jsModule = await this . _jsModule . Value ;
127106 var magicUtility = new MagicUtilities ( jsModule ) ;
128107 return await magicUtility . GetStorageEstimateAsync ( ) ;
129108 }
130109 [ Obsolete ( "Not fully implemented yet until full migration protocol finished." ) ]
131110 public async ValueTask < IMagicQuery < T > > Query < T > ( IndexedDbSet indexedDbSet )
132- where T : class , IMagicTableBase , new ( )
111+ where T : class , IMagicTableBase , new ( )
133112 {
113+ ObjectDisposedException . ThrowIf ( this . _jsModule is null , this ) ;
114+
134115 // Get database name and schema name
135116 string databaseName = indexedDbSet . DatabaseName ;
136117 string schemaName = SchemaHelper . GetTableName < T > ( ) ;
@@ -140,9 +121,11 @@ public async ValueTask<IMagicQuery<T>> Query<T>(IndexedDbSet indexedDbSet)
140121
141122
142123 public async ValueTask < IMagicQuery < T > > Query < T > (
143- Func < T , IndexedDbSet > dbSetSelector )
144- where T : class , IMagicTableBase , new ( )
124+ Func < T , IndexedDbSet > dbSetSelector )
125+ where T : class , IMagicTableBase , new ( )
145126 {
127+ ObjectDisposedException . ThrowIf ( this . _jsModule is null , this ) ;
128+
146129 // Create an instance of T to access `DbSets`
147130 var modelInstance = new T ( ) ;
148131
@@ -153,39 +136,43 @@ public async ValueTask<IMagicQuery<T>> Query<T>(
153136 string databaseName = selectedDbSet . DatabaseName ;
154137 string schemaName = SchemaHelper . GetTableName < T > ( ) ;
155138
139+ #pragma warning disable CS0618
156140 return await QueryOverride < T > ( databaseName , schemaName ) ;
141+ #pragma warning restore CS0618
157142 }
158143
159144 /// <summary>
160145 /// Query the database for a given type. Automatically opens the database if needed.
161146 /// </summary>
162147 public async ValueTask < IMagicQuery < T > > Query < T > ( )
163148 where T : class , IMagicTableBase , new ( )
164- {
149+ {
150+ ObjectDisposedException . ThrowIf ( this . _jsModule is null , this ) ;
151+
165152 string databaseName = SchemaHelper . GetDefaultDatabaseName < T > ( ) ;
166153 string schemaName = SchemaHelper . GetTableName < T > ( ) ;
167- var dbManager = await GetOrCreateDatabaseAsync ( ) ;
154+ var dbManager = await this . _magicJsManager . Value ;
155+ #pragma warning disable CS0618
168156 return await QueryOverride < T > ( databaseName , schemaName ) ;
157+ #pragma warning restore CS0618
169158 }
170159
171160 [ Obsolete ( "Not decided if this will be built in further or removed" ) ]
172161 public async ValueTask < IMagicQuery < T > > QueryOverride < T > ( string databaseNameOverride , string schemaNameOverride )
173162 where T : class , IMagicTableBase , new ( )
174163 {
175- var dbManager = await GetOrCreateDatabaseAsync ( ) ; // Ensure database is open
164+ ObjectDisposedException . ThrowIf ( this . _jsModule is null , this ) ;
165+
166+ var dbManager = await this . _magicJsManager . Value ;
176167 return dbManager . Query < T > ( databaseNameOverride , schemaNameOverride ) ;
177168 }
178169
179170 public async ValueTask < IMagicDatabaseScoped > Database ( IndexedDbSet indexedDbSet )
180171 {
181- var dbManager = await GetOrCreateDatabaseAsync ( ) ; // Ensure database is open
172+ ObjectDisposedException . ThrowIf ( this . _jsModule is null , this ) ;
173+
174+ var dbManager = await this . _magicJsManager . Value ;
182175 return dbManager . Database ( dbManager , indexedDbSet ) ;
183176 }
184-
185- //public async ValueTask<IMagicDatabaseScoped> Database()
186- //{
187- // throw new Exception("Still working on it.");
188- //}
189-
190177 }
191178}
0 commit comments