yerel event

This commit is contained in:
Abdussamed 2024-03-27 09:08:10 +03:00
parent ce37dc6fc1
commit 087263d3f0
5 changed files with 7064 additions and 25 deletions

View File

@ -26,7 +26,7 @@ class EventTarget
{ {
if(this._events.has(event)) if(this._events.has(event))
{ {
this._events.get(event).push(callback) this._events.get(event)?.push(callback)
}else{ }else{
this._events.set(event,[callback]) this._events.set(event,[callback])
} }
@ -48,7 +48,7 @@ class EventTarget
/** /**
* *
* @param {string} type gerçekleşen olay türü * @param {string} type gerçekleşen olay türü
* @param {...any[]} args olay gerçekleştiğinde çalışacak işlevler gönderilecek argümanlar * @param {...any[]} args olay gerexçekleştiğinde çalışacak işlevler gönderilecek argümanlar
*/ */
public emitEvent(type:string, ...args) public emitEvent(type:string, ...args)
{ {
@ -106,7 +106,7 @@ export class IndexedDB extends EventTarget
this.IsReady = false; this.IsReady = false;
this.DBRequest = IndexedDB.Engine.open(this.Model.name, this.Model.version || 0); this.DBRequest = IndexedDB.Engine.open(this.Model.name, this.Model.version || 0);
this.DBRequest.addEventListener("upgradeneeded", this.executeMigrate.bind(this)); this.DBRequest.addEventListener("upgradeneeded", this.executeMigrate.bind(this));
new IEventLocate<IDBDatabase>(this.DBRequest).sync().then(async db => { new IEventLocate<IDBDatabase,IDBRequest>(this.DBRequest).sync().then(async db => {
this.DB = db; this.DB = db;
this.IsReady = true; this.IsReady = true;
this.dispatchEvent(new Event("load")); this.dispatchEvent(new Event("load"));
@ -125,7 +125,7 @@ export class IndexedDB extends EventTarget
{ {
objectStore = db.createObjectStore(e.name, {keyPath:e.key}); objectStore = db.createObjectStore(e.name, {keyPath:e.key});
}else{ }else{
objectStore = this.DBRequest.transaction.objectStore(e.name); objectStore = (this.DBRequest.transaction as IDBTransaction).objectStore(e.name);
} }
e.columns.forEach(name => { e.columns.forEach(name => {
@ -172,7 +172,7 @@ export class IndexedDB extends EventTarget
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).add(data); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).add(data);
return await (new IEventLocate<IDBValidKey>(store)).sync(); return await (new IEventLocate<IDBValidKey,IDBRequest>(store)).sync();
} }
/** /**
* Tablodaki tüm verileri temizler * Tablodaki tüm verileri temizler
@ -181,7 +181,7 @@ export class IndexedDB extends EventTarget
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).clear(); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).clear();
return await (new IEventLocate<undefined>(store)).sync(); return await (new IEventLocate<undefined,IDBRequest>(store)).sync();
} }
/** /**
* Tablodaki verilerin sayısını döner * Tablodaki verilerin sayısını döner
@ -190,7 +190,7 @@ export class IndexedDB extends EventTarget
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).count(); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).count();
return await (new IEventLocate<number>(store)).sync(); return await (new IEventLocate<number,IDBRequest>(store)).sync();
} }
/** /**
* Tablo bir kayıt siler * Tablo bir kayıt siler
@ -199,25 +199,25 @@ export class IndexedDB extends EventTarget
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).delete(name); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).delete(name);
return await (new IEventLocate <undefined> (store)).sync(); return await (new IEventLocate <undefined,IDBRequest> (store)).sync();
} }
/** /**
* Tablodaki bir kaydı okur * Tablodaki bir kaydı okur (primary key ile)
*/ */
public async get(tablename:string, index:string) public async get(tablename:string, index:string)
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).get(index); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).get(index);
return await (new IEventLocate <{[key:string]:any}> (store)).sync(); return await (new IEventLocate <any,IDBRequest> (store)).sync();
} }
/** /**
* Tablodaki bir kaydı okur * Tablodaki bir kaydı okur (belirtilen index kolonuyla arar)
*/ */
public async getFrom(tablename:string, column:string, index:string) public async getFrom(tablename:string, column:string, index:string)
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).index(column).get(index); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).index(column).get(index);
return await (new IEventLocate <{[key:string]:any}> (store)).sync(); return await (new IEventLocate <any,IDBRequest> (store)).sync();
} }
/** /**
* Tablodaki tüm kayıtları alır * Tablodaki tüm kayıtları alır
@ -226,7 +226,7 @@ export class IndexedDB extends EventTarget
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).getAll(); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).getAll();
return await (new IEventLocate <{[key:string]:any}[]> (store)).sync(); return await (new IEventLocate <any[], IDBRequest> (store)).sync();
} }
/** /**
* Tabloda veri yoksa oluşturur varsa günceller * Tabloda veri yoksa oluşturur varsa günceller
@ -249,7 +249,7 @@ export class IndexedDB extends EventTarget
{ {
if(!this.IsReady) return; if(!this.IsReady) return;
let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).put(data); let store = this.DB.transaction([tablename], "readwrite").objectStore(tablename).put(data);
return await (new IEventLocate <IDBValidKey> (store)).sync(); return await (new IEventLocate <IDBValidKey,IDBRequest> (store)).sync();
} }
/** /**
* Tablodaki tüm verileri tek tek verir * Tablodaki tüm verileri tek tek verir
@ -268,7 +268,7 @@ export class IndexedDB extends EventTarget
try{ try{
callback( callback(
data, data,
() => cursor.result.continue(), () => cursor.result?.continue(),
() => ok(void 0), () => ok(void 0),
cursor.result.primaryKey cursor.result.primaryKey
) )
@ -372,27 +372,27 @@ export class IndexedDB extends EventTarget
} }
if('mozIndexedDB' in window) if('mozIndexedDB' in window)
{ {
IndexedDB.Engine = window['mozIndexedDB'] IndexedDB.Engine = window['mozIndexedDB'] as IDBFactory
} }
if('webkitIndexedDB' in window) if('webkitIndexedDB' in window)
{ {
IndexedDB.Engine = window['webkitIndexedDB'] IndexedDB.Engine = window['webkitIndexedDB'] as IDBFactory
} }
if('msIndexedDB' in window) if('msIndexedDB' in window)
{ {
IndexedDB.Engine = window['msIndexedDB'] IndexedDB.Engine = window['msIndexedDB'] as IDBFactory
} }
} }
} }
interface ISheel{ interface ISheel<Type>{
onsuccess : (e:any) => any; onsuccess : ((this: Type, ev: Event) => any) | null;
onerror : (e:any) => any; onerror : ((this: Type, ev: Event) => any) | null;
} }
/** /**
* Başarılı olduğunda onsuccess başarısız olduğunda onerror döndüren yapıları * Başarılı olduğunda onsuccess başarısız olduğunda onerror döndüren yapıları
* javascript ES6 tarafında async/await yapısına dönüştürür böylece try-catch kullanılarak yakalanabilir * javascript ES6 tarafında async/await yapısına dönüştürür böylece try-catch kullanılarak yakalanabilir
*/ */
class IEventLocate<Type> class IEventLocate<Type,Shell>
{ {
private result : { private result : {
then:any[], then:any[],
@ -408,9 +408,9 @@ class IEventLocate<Type>
catch: [], catch: [],
finally: [] finally: []
}; };
public constructor(sheel:ISheel) public constructor(sheel:ISheel<Shell>)
{ {
sheel.onerror = (event) => { sheel.onerror = (event:any) => {
this.result.catch = [event.target, event]; this.result.catch = [event.target, event];
this.events.catch.forEach(e => { this.events.catch.forEach(e => {
e.call(event.target, event.target?.result); e.call(event.target, event.target?.result);
@ -419,7 +419,7 @@ class IEventLocate<Type>
e.call(event.target, event.target?.result); e.call(event.target, event.target?.result);
}) })
} }
sheel.onsuccess = (event) => { sheel.onsuccess = (event:any) => {
this.result.then = [event.target, event]; this.result.then = [event.target, event];
this.events.then.forEach(e => { this.events.then.forEach(e => {
e.call(event.target, event.target?.result); e.call(event.target, event.target?.result);

27
index.html Normal file
View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<header></header>
<main></main>
<footer></footer>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<video controls style="width:50%;aspect-ratio: 2/1;">
<track src="video.tr.vtt" kind="subtitles" srclang="tr" label="Türkçe" default>
<track src="video.en.vtt" kind="subtitles" srclang="en" label="Engilişçe">
<source src="video.webm" type="video/webm">
</video>
</body>
</html>

6994
video.en.vtt Normal file

File diff suppressed because it is too large Load Diff

18
video.tr.vtt Normal file
View File

@ -0,0 +1,18 @@
WEBVTT
Kind: captions
Language: tr
00:00:00.000 --> 00:00:04.240 position:100% align:center size:35%
Abdussamed ULUTAŞ sunar
00:00:04.000 --> 00:00:05.000 position:100% align:center size:35%
Alt yazı 1
00:00:05.000 --> 00:00:06.000 position:100% align:center size:35%
Alt yazı 2
00:00:06.000 --> 00:00:07.000 position:100% align:center size:35%
Alt yazı 3
00:00:07.000 --> 00:00:08.000 position:100% align:center size:35%
Alt yazı 4

BIN
video.webm Normal file

Binary file not shown.