1- const mozNavigator = navigator as any ;
1+ /* eslint-disable @typescript-eslint/no-explicit-any */
2+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
23
3- type Manifest = { } ;
4+ export class KaiOS {
5+ static navigator : MozNavigator = navigator as MozNavigator ;
6+
7+ static app = {
8+ getSelf : ( ) : Promise < DomApplication > => {
9+ return new Promise ( ( resolve , reject ) => {
10+ const request = this . navigator . mozApps . getSelf ( ) ;
11+ request . onsuccess = ( ) => resolve ( request . result ) ;
12+ request . onerror = ( ) => reject ( request . error ) ;
13+ } ) ;
14+ } ,
15+ getManifest : ( ) : Promise < Manifest > => {
16+ return new Promise ( ( resolve , reject ) => {
17+ const request = this . navigator . mozApps . getSelf ( ) ;
18+ request . onsuccess = ( ) => resolve ( request . result . manifest ) ;
19+ request . onerror = ( ) => reject ( request . error ) ;
20+ } ) ;
21+ } ,
22+ } ;
23+
24+ static storage = {
25+ get : ( storageName : StorageName , filePath : string ) : Promise < File > => {
26+ return new Promise ( ( resolve , reject ) => {
27+ const storage = this . navigator . getDeviceStorage ( storageName ) ;
28+ const request = storage . get ( filePath ) ;
29+ request . onsuccess = ( ) => resolve ( request . result ) ;
30+ request . onerror = ( ) => reject ( request . error ) ;
31+ } ) ;
32+ } ,
33+ getAsFileUrl : (
34+ storageName : StorageName ,
35+ filePathAndName : string
36+ ) : Promise < string > => {
37+ return new Promise ( ( resolve , reject ) => {
38+ const storage = this . navigator . getDeviceStorage ( storageName ) ;
39+ const request = storage . get ( filePathAndName ) ;
40+ request . onsuccess = ( ) => resolve ( URL . createObjectURL ( request . result ) ) ;
41+ request . onerror = ( ) => reject ( request . error ) ;
42+ } ) ;
43+ } ,
44+ addNamed : (
45+ storageName : StorageName ,
46+ file : Blob | File ,
47+ filePathAndName : string
48+ ) : Promise < File > => {
49+ return new Promise ( ( resolve , reject ) => {
50+ const storage = this . navigator . getDeviceStorage ( storageName ) ;
51+ const request = storage . addNamed ( file , filePathAndName ) ;
52+ request . onsuccess = ( ) => resolve ( request . result ) ;
53+ request . onerror = ( ) => reject ( request . error ) ;
54+ } ) ;
55+ } ,
56+ appendNamed : (
57+ storageName : StorageName ,
58+ file : Blob | File ,
59+ filePathAndName : string
60+ ) : Promise < File > => {
61+ return new Promise ( ( resolve , reject ) => {
62+ const storage = this . navigator . getDeviceStorage ( storageName ) ;
63+ const request = storage . appendNamed ( file , filePathAndName ) ;
64+ request . onsuccess = ( ) => resolve ( request . result ) ;
65+ request . onerror = ( ) => reject ( request . error ) ;
66+ } ) ;
67+ } ,
68+ delete : (
69+ storageName : StorageName ,
70+ filePathAndName : string
71+ ) : Promise < void > => {
72+ return new Promise ( ( resolve , reject ) => {
73+ const storage = this . navigator . getDeviceStorage ( storageName ) ;
74+ const request = storage . delete ( filePathAndName ) ;
75+ request . onsuccess = ( ) => resolve ( ) ;
76+ request . onerror = ( ) => reject ( request . error ) ;
77+ } ) ;
78+ } ,
79+ search : ( regex : RegExp ) : Promise < FileSearchResult [ ] > => {
80+ return new Promise ( ( resolve , reject ) => {
81+ const files : FileSearchResult [ ] = [ ] ;
82+ const sdcard = this . navigator . getDeviceStorage ( 'sdcard' ) ;
83+ const cursor = sdcard . enumerate ( ) ;
84+
85+ cursor . onsuccess = function ( ) : void {
86+ if ( ! this . result ) {
87+ resolve ( files ) ;
88+ return ;
89+ }
90+
91+ console . log ( 'file result' , this . result ) ;
92+ const match = this . result . name . match ( regex ) ;
93+ if ( match ) {
94+ files . push ( {
95+ name : this . result . name ,
96+ size : this . result . size ,
97+ type : this . result . type ,
98+ lastModified : this . result . lastModified ,
99+ lastModifiedDate : this . result . lastModifiedDate ,
100+ } ) ;
101+ }
102+
103+ this . continue ( ) ;
104+ } ;
105+
106+ cursor . onerror = function ( ) : void {
107+ reject ( this . error ) ;
108+ } ;
109+ } ) ;
110+ } ,
111+ getActualStorageName : ( storageName : StorageName ) : string =>
112+ this . navigator . getDeviceStorage ( storageName ) ?. storageName ,
113+ } ;
114+ }
115+
116+ type Manifest = any ;
4117type DomApplication = {
5118 manifest : Manifest ;
6119 updateManifest : null ;
@@ -16,27 +129,33 @@ type DomApplication = {
16129 launch : ( ) => void ;
17130} ;
18131
19- type StorageName = 'music' | 'pictures' | 'sdcard' | 'videos' ;
20- type StorageRequest = {
21- result ?: File ;
132+ type FileSearchResult = {
133+ name : string ;
134+ size : number ;
135+ type : string ;
136+ lastModified : string ;
137+ lastModifiedDate : Date ;
138+ } ;
139+
140+ type Request < T > = {
141+ error ?: Error ;
142+ result : T ;
22143 onsuccess : ( ) => void ;
23144 onerror : ( ) => void ;
24145} ;
25- type DeviceStorage = {
26- storageName : StorageName ;
27- get : ( filePath : string ) => StorageRequest ;
28- } ;
29146
30- export class KaiOS {
31- static getSelfApp ( ) : Promise < DomApplication > {
32- return new Promise ( ( resolve ) => {
33- mozNavigator . mozApps . getSelf ( ) . onsuccess = function ( ) : void {
34- resolve ( this . result ) ;
35- } ;
36- } ) ;
37- }
38-
39- static getDeviceStorage ( name : StorageName ) : DeviceStorage {
40- return mozNavigator . getDeviceStorage ( name ) ;
41- }
42- }
147+ type StorageName = 'music' | 'pictures' | 'sdcard' | 'videos' | 'apps' ;
148+
149+ type MozNavigator = Navigator & {
150+ mozApps : {
151+ getSelf : ( ) => Request < DomApplication > ;
152+ } ;
153+ getDeviceStorage : ( name : StorageName ) => {
154+ storageName : string ;
155+ get : ( filePath : string ) => Request < File > ;
156+ addNamed : ( file : File | Blob , filePath : string ) => Request < File > ;
157+ appendNamed : ( file : File | Blob , filePath : string ) => Request < File > ;
158+ delete : ( filePath : string ) => Request < void > ;
159+ enumerate : any ;
160+ } ;
161+ } ;
0 commit comments