@scarletgeek/web-kernel 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,70 @@
1
+ import { fetchAdapter } from "./adapters";
2
+ import DataTransformer from "./DataTransformer";
3
+ import { FetchRequestConfig, RequestAdapter, RequestMethods, ResponseTransformer } from "./interfaces";
4
+
5
+ abstract class Request<T = Response> {
6
+ protected adapter: RequestAdapter;
7
+ protected transformer: ResponseTransformer<T>;
8
+
9
+ constructor(
10
+ adapter?: RequestAdapter,
11
+ transformer?: ResponseTransformer<T>
12
+ ) {
13
+ if(new.target === Request) {
14
+ throw new Error("Request is abstract");
15
+ }
16
+ this.adapter = adapter ?? fetchAdapter;
17
+ this.transformer = transformer ?? new DataTransformer<T>();
18
+ }
19
+
20
+ protected abstract get url(): string;
21
+
22
+ protected get method(): RequestMethods {
23
+ return RequestMethods.GET;
24
+ }
25
+
26
+ protected get headers(): HeadersInit | undefined {
27
+ return undefined;
28
+ }
29
+
30
+ protected get payload(): BodyInit | null {
31
+ return null;
32
+ }
33
+
34
+ protected get signal(): AbortSignal | undefined {
35
+ return undefined;
36
+ }
37
+
38
+ async send(): Promise<T> {
39
+ try {
40
+ this.onProcessing();
41
+
42
+ const response = await this.adapter({
43
+ url: this.url,
44
+ method: this.method,
45
+ headers: this.headers,
46
+ body: this.payload,
47
+ signal: this.signal
48
+ });
49
+
50
+ if(!response.ok) {
51
+ throw response;
52
+ }
53
+
54
+ const data = await this.transformer.transform(response);
55
+
56
+ this.onSuccess(data);
57
+ return data;
58
+
59
+ } catch(error) {
60
+ this.onError(error);
61
+ throw error;
62
+ }
63
+ }
64
+
65
+ protected onProcessing(): void {}
66
+ protected onSuccess(_response: T): void {}
67
+ protected onError(_error: any): void {}
68
+ }
69
+
70
+ export default Request;
@@ -0,0 +1,10 @@
1
+ import { FetchRequestConfig, RequestMethods } from "./interfaces";
2
+
3
+ export function fetchAdapter(config: FetchRequestConfig): Promise<Response> {
4
+ return fetch(config.url, {
5
+ method: config.method || RequestMethods.GET,
6
+ headers: config.headers,
7
+ body: config.body ?? null,
8
+ signal: config.signal
9
+ });
10
+ }
@@ -0,0 +1,21 @@
1
+ export interface FetchRequestConfig {
2
+ url: string
3
+ method?: string,
4
+ headers?: HeadersInit
5
+ body?: BodyInit | null
6
+ signal?: AbortSignal
7
+ }
8
+
9
+ export type RequestAdapter = (config: FetchRequestConfig) => Promise<Response>
10
+
11
+ export interface ResponseTransformer<T = any> {
12
+ transform(response: Response): Promise<T>
13
+ }
14
+
15
+ export enum RequestMethods {
16
+ GET = "GET",
17
+ POST = "POST",
18
+ PUT = "PUT",
19
+ PATCH = "PATCH",
20
+ DELETE = "DELETE"
21
+ }
@@ -0,0 +1,35 @@
1
+ export interface IKernelProgram {
2
+ [key: string]: any
3
+ }
4
+
5
+ export type IEventMap = Record<string, any>;
6
+
7
+ export type IEventHandler<T = unknown> = (event: Event) => void;
8
+
9
+ export type IUnsubscribeEvent = () => void;
10
+
11
+ export interface IKernelRequest {
12
+ [key: string]: any
13
+ }
14
+
15
+ export enum KernelState {
16
+ CREATED = "CREATED",
17
+ BOOTING = "BOOTING",
18
+ BOOTED = "BOOTED"
19
+ }
20
+
21
+ export enum ProgramState {
22
+ IDLE = "IDLE",
23
+ RUNNING = "RUNNING",
24
+ STOPPED = "STOPPED",
25
+ ERROR = "ERROR"
26
+ }
27
+
28
+ export interface IKernelProgramInstance {
29
+ onStart: () => void;
30
+ onDestroy: () => void;
31
+ }
32
+
33
+ export interface IKernelProgramConstructor {
34
+ new () : IKernelProgramInstance;
35
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,15 @@
1
+ export enum LoggerLevel {
2
+ LOG = "LOG :: ",
3
+ ERROR = "ERROR :: ",
4
+ WARNING = "WARNING :: "
5
+ }
6
+
7
+ export function logger(level: LoggerLevel, message: any, data: any = undefined) {
8
+ if(level == LoggerLevel.ERROR) {
9
+ console.error(LoggerLevel.ERROR, message, data);
10
+ } else if(level == LoggerLevel.WARNING) {
11
+ console.warn(LoggerLevel.WARNING, message, data);
12
+ } else {
13
+ console.log(LoggerLevel.LOG, message, data);
14
+ }
15
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ES2020",
5
+ "moduleResolution": "node",
6
+ "outDir": "./dist",
7
+ "declaration": true,
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "forceConsistentCasingInFileNames": true
11
+ },
12
+ "include": ["src/**/*"]
13
+ }
package/webpack.mix.js ADDED
@@ -0,0 +1,14 @@
1
+ const mix = require("laravel-mix");
2
+
3
+ mix.ts("src/index.ts", "dist/")
4
+ .setPublicPath("dist")
5
+ .webpackConfig({
6
+ output: {
7
+ library: {
8
+ type: "module",
9
+ }
10
+ },
11
+ experiments: {
12
+ outputModule: true
13
+ }
14
+ });