ofpos-shared-core 1.1.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.
- package/README.md +37 -0
- package/dist/AdapterRegistry.d.ts +83 -0
- package/dist/DomainServices.d.ts +151 -0
- package/dist/IntegrationServices.d.ts +75 -0
- package/dist/PosCore.d.ts +216 -0
- package/dist/contracts/contractVersioning.d.ts +6 -0
- package/dist/contracts/crossDomainPrimitives.d.ts +5 -0
- package/dist/contracts/responseEnvelope.d.ts +6 -0
- package/dist/contracts/syncProtocol.d.ts +8 -0
- package/dist/data/DbAdapter.d.ts +7 -0
- package/dist/data/applyPendingMigrations.d.ts +18 -0
- package/dist/data/inMemoryDbAdapter.d.ts +65 -0
- package/dist/data/migrations.d.ts +12 -0
- package/dist/data/relations.d.ts +3 -0
- package/dist/data/schema.d.ts +9 -0
- package/dist/data/seed.d.ts +370 -0
- package/dist/index.browser.mjs +18 -0
- package/dist/index.browser.mjs.LEGAL.txt +46 -0
- package/dist/index.cjs.js +18 -0
- package/dist/index.cjs.js.LEGAL.txt +46 -0
- package/dist/index.d.ts +116 -0
- package/dist/index.esm.js +18 -0
- package/dist/index.esm.js.LEGAL.txt +46 -0
- package/dist/index.umd.js +18 -0
- package/dist/index.umd.js.LEGAL.txt +46 -0
- package/dist/integration/NotificationAdapter.d.ts +69 -0
- package/dist/integration/activityLogger.d.ts +44 -0
- package/dist/integration/activitySink.d.ts +8 -0
- package/dist/integration/apiService.d.ts +255 -0
- package/dist/integration/authorizationService.d.ts +225 -0
- package/dist/integration/backupScheduler.d.ts +75 -0
- package/dist/integration/checksum.d.ts +9 -0
- package/dist/integration/checksumAdapter.d.ts +8 -0
- package/dist/integration/configService.d.ts +431 -0
- package/dist/integration/defaultChecksumAdapter.d.ts +6 -0
- package/dist/integration/defaultEncryptionAdapter.d.ts +9 -0
- package/dist/integration/encryption.d.ts +95 -0
- package/dist/integration/encryptionAdapter.d.ts +8 -0
- package/dist/integration/httpAdapter.d.ts +9 -0
- package/dist/integration/loggerAdapter.d.ts +45 -0
- package/dist/integration/notificationService.d.ts +45 -0
- package/dist/integration/ofauthBridge.d.ts +29 -0
- package/dist/integration/ofauthCoreBridge.d.ts +19 -0
- package/dist/integration/platformAdapter.d.ts +8 -0
- package/dist/integration/roleAdapter.d.ts +61 -0
- package/dist/integration/socket.d.ts +60 -0
- package/dist/integration/socketAdapter.d.ts +8 -0
- package/dist/integration/userService.d.ts +126 -0
- package/dist/models/Bom.d.ts +17 -0
- package/dist/models/Category.d.ts +13 -0
- package/dist/models/Customer.d.ts +17 -0
- package/dist/models/CustomerGroup.d.ts +11 -0
- package/dist/models/Expense.d.ts +19 -0
- package/dist/models/FinancialSetting.d.ts +14 -0
- package/dist/models/History.d.ts +18 -0
- package/dist/models/InventoryLog.d.ts +23 -0
- package/dist/models/InventoryLot.d.ts +34 -0
- package/dist/models/KitchenTicket.d.ts +13 -0
- package/dist/models/KitchenTicketItem.d.ts +12 -0
- package/dist/models/LoyaltyAccount.d.ts +12 -0
- package/dist/models/LoyaltyLedger.d.ts +17 -0
- package/dist/models/Order.d.ts +45 -0
- package/dist/models/OrderItem.d.ts +19 -0
- package/dist/models/Payable.d.ts +23 -0
- package/dist/models/PriceHistory.d.ts +17 -0
- package/dist/models/PriceTier.d.ts +19 -0
- package/dist/models/Product.d.ts +25 -0
- package/dist/models/Promotion.d.ts +25 -0
- package/dist/models/Purchase.d.ts +29 -0
- package/dist/models/PurchaseItem.d.ts +21 -0
- package/dist/models/PurchaseOrder.d.ts +23 -0
- package/dist/models/PurchaseOrderItem.d.ts +19 -0
- package/dist/models/Receivable.d.ts +23 -0
- package/dist/models/ReportSchedule.d.ts +21 -0
- package/dist/models/Return.d.ts +57 -0
- package/dist/models/ReturnItem.d.ts +31 -0
- package/dist/models/Role.d.ts +13 -0
- package/dist/models/Sale.d.ts +43 -0
- package/dist/models/SaleItem.d.ts +19 -0
- package/dist/models/Settlement.d.ts +23 -0
- package/dist/models/Shift.d.ts +41 -0
- package/dist/models/StockAdjustment.d.ts +21 -0
- package/dist/models/StockOpname.d.ts +22 -0
- package/dist/models/StockOpnameItem.d.ts +27 -0
- package/dist/models/Supplier.d.ts +19 -0
- package/dist/models/TaxRate.d.ts +13 -0
- package/dist/models/Transaction.d.ts +32 -0
- package/dist/models/Uom.d.ts +15 -0
- package/dist/models/User.d.ts +21 -0
- package/dist/services/bomService.d.ts +71 -0
- package/dist/services/cartService.d.ts +65 -0
- package/dist/services/categoryService.d.ts +54 -0
- package/dist/services/customerGroupService.d.ts +47 -0
- package/dist/services/customerService.d.ts +133 -0
- package/dist/services/documentNumberPolicy.d.ts +15 -0
- package/dist/services/expenseService.d.ts +47 -0
- package/dist/services/exportAdapter.d.ts +48 -0
- package/dist/services/exportService.d.ts +263 -0
- package/dist/services/financialSettingService.d.ts +47 -0
- package/dist/services/historyService.d.ts +60 -0
- package/dist/services/inventoryLogService.d.ts +47 -0
- package/dist/services/inventoryService.d.ts +43 -0
- package/dist/services/orderItemService.d.ts +47 -0
- package/dist/services/orderService.d.ts +161 -0
- package/dist/services/payableService.d.ts +51 -0
- package/dist/services/priceHistoryService.d.ts +61 -0
- package/dist/services/priceTierService.d.ts +47 -0
- package/dist/services/pricingService.d.ts +192 -0
- package/dist/services/productService.d.ts +59 -0
- package/dist/services/promotionService.d.ts +47 -0
- package/dist/services/purchaseItemService.d.ts +47 -0
- package/dist/services/purchaseOrderItemService.d.ts +47 -0
- package/dist/services/purchaseOrderService.d.ts +47 -0
- package/dist/services/purchaseService.d.ts +130 -0
- package/dist/services/receivableService.d.ts +47 -0
- package/dist/services/reportScheduleService.d.ts +47 -0
- package/dist/services/reportingService.d.ts +251 -0
- package/dist/services/returnItemService.d.ts +47 -0
- package/dist/services/returnService.d.ts +123 -0
- package/dist/services/roleService.d.ts +47 -0
- package/dist/services/saleItemService.d.ts +47 -0
- package/dist/services/saleService.d.ts +154 -0
- package/dist/services/settlementService.d.ts +68 -0
- package/dist/services/shiftService.d.ts +92 -0
- package/dist/services/stockAdjustmentService.d.ts +47 -0
- package/dist/services/stockOpnameItemService.d.ts +47 -0
- package/dist/services/stockOpnameService.d.ts +51 -0
- package/dist/services/stockTransferService.d.ts +67 -0
- package/dist/services/supplierService.d.ts +51 -0
- package/dist/services/taxRateService.d.ts +47 -0
- package/dist/services/taxService.d.ts +63 -0
- package/dist/services/transactionService.d.ts +109 -0
- package/dist/services/uiProductService.d.ts +102 -0
- package/dist/services/uiTransactionService.d.ts +68 -0
- package/dist/services/uomService.d.ts +53 -0
- package/dist/services/userService.d.ts +47 -0
- package/dist/stores/cartStore.d.ts +109 -0
- package/dist/stores/eventBus.d.ts +55 -0
- package/dist/stores/sessionStore.d.ts +108 -0
- package/dist/stores/storageAdapter.d.ts +44 -0
- package/dist/stores/syncService.d.ts +90 -0
- package/dist/stores/syncStore.d.ts +163 -0
- package/package.json +82 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modul penyimpanan sesi pengguna dengan deteksi idle dan re-authentication.
|
|
3
|
+
*/
|
|
4
|
+
import { Handler } from 'mitt';
|
|
5
|
+
import { PosCore } from '../PosCore';
|
|
6
|
+
import { User } from '../models/User';
|
|
7
|
+
/**
|
|
8
|
+
* Tipe event untuk SessionStore.
|
|
9
|
+
*/
|
|
10
|
+
export type SessionEvents = {
|
|
11
|
+
/** Event update status sesi */
|
|
12
|
+
update: SessionState;
|
|
13
|
+
/** Event requirement re-authentication */
|
|
14
|
+
reauthenticate: undefined;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Status sesi pengguna.
|
|
18
|
+
*/
|
|
19
|
+
export interface SessionState {
|
|
20
|
+
/** Apakah pengguna sudah login */
|
|
21
|
+
isLoggedIn: boolean;
|
|
22
|
+
/** ID pengguna saat login, null jika tidak ada */
|
|
23
|
+
userId: string | null;
|
|
24
|
+
/** Objek user lengkap saat login, null jika tidak ada */
|
|
25
|
+
user: User | null;
|
|
26
|
+
/** Timestamp login terakhir, null jika tidak ada */
|
|
27
|
+
lastLoginAt: number | null;
|
|
28
|
+
/** Tenant context dari sesi autentikasi (SaaS), null jika tidak ada */
|
|
29
|
+
tenantId: string | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Nilai awal state sesi.
|
|
33
|
+
*/
|
|
34
|
+
export declare const initialSessionState: SessionState;
|
|
35
|
+
/**
|
|
36
|
+
* Kelas penyimpanan sesi dengan idle timeout dan re-authentication.
|
|
37
|
+
*/
|
|
38
|
+
export declare class SessionStore {
|
|
39
|
+
private context;
|
|
40
|
+
private state;
|
|
41
|
+
private emitter;
|
|
42
|
+
private idleTimerId?;
|
|
43
|
+
private lastBlurAt;
|
|
44
|
+
private get idleTimeoutMs();
|
|
45
|
+
private get reauthTimeoutMs();
|
|
46
|
+
private readonly activityEvents;
|
|
47
|
+
private readonly onActivity;
|
|
48
|
+
private readonly onBlur;
|
|
49
|
+
private readonly onFocus;
|
|
50
|
+
/**
|
|
51
|
+
* Inisialisasi SessionStore.
|
|
52
|
+
* @param context Konteks PosCore aplikasi
|
|
53
|
+
*/
|
|
54
|
+
constructor(context: PosCore);
|
|
55
|
+
/**
|
|
56
|
+
* Berlangganan perubahan state sesi.
|
|
57
|
+
* @param handler Handler yang dipanggil saat update
|
|
58
|
+
* @returns Fungsi untuk unsubscribe
|
|
59
|
+
*/
|
|
60
|
+
subscribe(handler: Handler<SessionState>): () => void;
|
|
61
|
+
/**
|
|
62
|
+
* Berlangganan event re-authentication.
|
|
63
|
+
* @param handler Handler yang dipanggil saat reauthenticate
|
|
64
|
+
* @returns Fungsi untuk unsubscribe
|
|
65
|
+
*/
|
|
66
|
+
onReauthenticate(handler: Handler<void>): () => void;
|
|
67
|
+
/**
|
|
68
|
+
* Mengambil salinan state saat ini.
|
|
69
|
+
*/
|
|
70
|
+
getState(): SessionState;
|
|
71
|
+
/**
|
|
72
|
+
* Menyiapkan listener aktivitas pengguna untuk idle dan reauth.
|
|
73
|
+
*/
|
|
74
|
+
private setupActivityListeners;
|
|
75
|
+
shutdown(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Memulai timer idle untuk auto-logout.
|
|
78
|
+
*/
|
|
79
|
+
private startIdleTimer;
|
|
80
|
+
/**
|
|
81
|
+
* Mereset ulang timer idle.
|
|
82
|
+
*/
|
|
83
|
+
private resetIdleTimer;
|
|
84
|
+
/**
|
|
85
|
+
* Menghentikan timer idle.
|
|
86
|
+
*/
|
|
87
|
+
private clearIdleTimer;
|
|
88
|
+
/**
|
|
89
|
+
* Menangani auto-logout saat idle.
|
|
90
|
+
*/
|
|
91
|
+
private handleIdleLogout;
|
|
92
|
+
/**
|
|
93
|
+
* Melakukan login, mengubah state, dan memulai timer idle.
|
|
94
|
+
* @param user Objek user lengkap yang login
|
|
95
|
+
*/
|
|
96
|
+
login(user: User & {
|
|
97
|
+
tenantId?: string | null;
|
|
98
|
+
}): void;
|
|
99
|
+
/**
|
|
100
|
+
* Melakukan logout, membersihkan token dan timer.
|
|
101
|
+
*/
|
|
102
|
+
logout(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Menggabungkan state baru dan menyimpan.
|
|
105
|
+
* @param patch Partial state yang akan diterapkan
|
|
106
|
+
*/
|
|
107
|
+
private setState;
|
|
108
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modul adapter penyimpanan abstrak.
|
|
3
|
+
*/
|
|
4
|
+
import { PosCore } from "../PosCore";
|
|
5
|
+
/**
|
|
6
|
+
* Interface adapter penyimpanan kunci-nilai.
|
|
7
|
+
*/
|
|
8
|
+
export interface StorageAdapter {
|
|
9
|
+
/**
|
|
10
|
+
* Mengambil nilai berdasarkan key.
|
|
11
|
+
* @param key Kunci item
|
|
12
|
+
* @returns Promise atau nilai string|null
|
|
13
|
+
*/
|
|
14
|
+
getItem(key: string): Promise<string | null> | string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Menyimpan nilai dengan key tertentu.
|
|
17
|
+
* @param key Kunci item
|
|
18
|
+
* @param value Nilai string yang akan disimpan
|
|
19
|
+
*/
|
|
20
|
+
setItem(key: string, value: string): Promise<void> | void;
|
|
21
|
+
/**
|
|
22
|
+
* Menghapus item berdasarkan key.
|
|
23
|
+
* @param key Kunci item yang akan dihapus
|
|
24
|
+
*/
|
|
25
|
+
removeItem(key: string): Promise<void> | void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Adapter penyimpanan memori untuk testing atau demo.
|
|
29
|
+
*/
|
|
30
|
+
export declare class MemoryStorage implements StorageAdapter {
|
|
31
|
+
private context;
|
|
32
|
+
private map;
|
|
33
|
+
/**
|
|
34
|
+
* Membuat instance MemoryStorage.
|
|
35
|
+
* @param context PosCore sebagai konteks (opsional)
|
|
36
|
+
*/
|
|
37
|
+
constructor(context: PosCore);
|
|
38
|
+
/** {@inheritDoc StorageAdapter.getItem} */
|
|
39
|
+
getItem(key: string): string | null;
|
|
40
|
+
/** {@inheritDoc StorageAdapter.setItem} */
|
|
41
|
+
setItem(key: string, value: string): void;
|
|
42
|
+
/** {@inheritDoc StorageAdapter.removeItem} */
|
|
43
|
+
removeItem(key: string): void;
|
|
44
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
export type ConflictResolutionStrategy = 'server_wins' | 'local_wins_manual';
|
|
3
|
+
/**
|
|
4
|
+
* Matriks conflict policy canonical per entitas.
|
|
5
|
+
* `server_wins`: perubahan server tetap diterapkan walau timestamp lokal lebih baru.
|
|
6
|
+
* `local_wins_manual`: perubahan lokal dipertahankan dan konflik dicatat untuk resolusi manual.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CONFLICT_POLICY_MATRIX: Record<string, ConflictResolutionStrategy>;
|
|
9
|
+
type SyncTraceContext = {
|
|
10
|
+
correlationId: string;
|
|
11
|
+
syncBatchId: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Interface dasar untuk layanan sinkronisasi.
|
|
15
|
+
*/
|
|
16
|
+
export interface ISyncService {
|
|
17
|
+
/**
|
|
18
|
+
* Wrapper retry dengan exponential backoff.
|
|
19
|
+
* @param fn Fungsi async yang dijalankan
|
|
20
|
+
* @param retries Jumlah maksimal percobaan ulang
|
|
21
|
+
* @param delay Delay dasar (ms) untuk backoff
|
|
22
|
+
*/
|
|
23
|
+
backoff<T>(fn: () => Promise<T>, retries?: number, delay?: number): Promise<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Menerapkan serangkaian perubahan (CRUD) ke adapter lokal.
|
|
26
|
+
* @param changes Daftar objek perubahan
|
|
27
|
+
*/
|
|
28
|
+
applyChanges(changes: Array<{
|
|
29
|
+
table: string;
|
|
30
|
+
id: string;
|
|
31
|
+
updated_at: number;
|
|
32
|
+
[key: string]: any;
|
|
33
|
+
}>): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Sinkronisasi data dasar dari ERP.
|
|
36
|
+
*/
|
|
37
|
+
syncWithErp(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Loop sinkronisasi penuh: dorong, tarik, ERP, dan pembersihan.
|
|
40
|
+
*/
|
|
41
|
+
syncLoop(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Implementasi layanan sinkronisasi.
|
|
45
|
+
*/
|
|
46
|
+
export declare class SyncService {
|
|
47
|
+
private context;
|
|
48
|
+
private readonly dbAdapter;
|
|
49
|
+
private readonly apiService?;
|
|
50
|
+
private readonly syncStore;
|
|
51
|
+
private debounceTimer?;
|
|
52
|
+
private periodicTimer?;
|
|
53
|
+
private unsubscribeStore?;
|
|
54
|
+
private readonly onDataChanged;
|
|
55
|
+
private lastAlertAtByCode;
|
|
56
|
+
/**
|
|
57
|
+
* Membuat instance SyncService.
|
|
58
|
+
* @param context Konteks PosCore aplikasi
|
|
59
|
+
*/
|
|
60
|
+
constructor(context: PosCore);
|
|
61
|
+
private normalizeOutgoingChange;
|
|
62
|
+
private getRemoteTimestamp;
|
|
63
|
+
private getConflictResolutionStrategy;
|
|
64
|
+
private requireBranchContext;
|
|
65
|
+
/**
|
|
66
|
+
* Menjalankan fungsi dengan retry dan exponential backoff.
|
|
67
|
+
*/
|
|
68
|
+
backoff<T>(fn: () => Promise<T>, retries?: number, delay?: number): Promise<T>;
|
|
69
|
+
/**
|
|
70
|
+
* Menerapkan array perubahan ke database lokal.
|
|
71
|
+
*/
|
|
72
|
+
applyChanges(changes: any[], traceContext?: SyncTraceContext): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Sinkronisasi data master dari ERP.
|
|
75
|
+
*/
|
|
76
|
+
syncWithErp(traceContext?: SyncTraceContext): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Cleanup data yang dihapus (belum diimplementasi generik).
|
|
79
|
+
*/
|
|
80
|
+
private cleanupDeleted;
|
|
81
|
+
private shouldTriggerAlert;
|
|
82
|
+
private emitOperationalAlert;
|
|
83
|
+
private evaluateOperationalAlerts;
|
|
84
|
+
/**
|
|
85
|
+
* Loop sinkronisasi lengkap: push, pull, ERP, pembersihan.
|
|
86
|
+
*/
|
|
87
|
+
syncLoop(): Promise<void>;
|
|
88
|
+
shutdown(): void;
|
|
89
|
+
}
|
|
90
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modul penyimpanan state sinkronisasi dengan persistensi.
|
|
3
|
+
*/
|
|
4
|
+
import { Handler } from 'mitt';
|
|
5
|
+
import { PosCore } from '../PosCore';
|
|
6
|
+
/**
|
|
7
|
+
* Event untuk SyncStore.
|
|
8
|
+
*/
|
|
9
|
+
export type SyncEvents = {
|
|
10
|
+
/** Event update state */
|
|
11
|
+
update: State;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Struktur state sinkronisasi.
|
|
15
|
+
*/
|
|
16
|
+
export interface State {
|
|
17
|
+
/** Status: idle, syncing, atau error */
|
|
18
|
+
status: 'idle' | 'syncing' | 'error';
|
|
19
|
+
/** Daftar perubahan antrean */
|
|
20
|
+
queue: SyncChange[];
|
|
21
|
+
/** Panjang antrean */
|
|
22
|
+
queueLength: number;
|
|
23
|
+
/** Daftar konflik terdeteksi */
|
|
24
|
+
conflicts: Array<Record<string, unknown>>;
|
|
25
|
+
/** Perubahan yang dipindahkan ke dead-letter queue setelah gagal permanen */
|
|
26
|
+
deadLetters: SyncDeadLetter[];
|
|
27
|
+
/** Metrik agregat sinkronisasi untuk observability baseline */
|
|
28
|
+
metrics: SyncMetrics;
|
|
29
|
+
/** Error terakhir jika ada */
|
|
30
|
+
lastError: Error | null;
|
|
31
|
+
/** Timestamp terakhir sinkron */
|
|
32
|
+
lastSyncAt: number | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Nilai awal state sinkronisasi.
|
|
36
|
+
*/
|
|
37
|
+
export declare const initialState: State;
|
|
38
|
+
export type SyncChangeType = 'CREATE' | 'UPDATE' | 'DELETE';
|
|
39
|
+
export interface SyncChange {
|
|
40
|
+
id: string;
|
|
41
|
+
table: string;
|
|
42
|
+
type: SyncChangeType;
|
|
43
|
+
record: Record<string, unknown>;
|
|
44
|
+
updated_at: number;
|
|
45
|
+
firstQueuedAt: number;
|
|
46
|
+
retryCount: number;
|
|
47
|
+
lastAttemptAt: number | null;
|
|
48
|
+
lastErrorMessage: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface SyncDeadLetter {
|
|
51
|
+
movedAt: number;
|
|
52
|
+
reason: string;
|
|
53
|
+
attempts: number;
|
|
54
|
+
errorMessage: string | null;
|
|
55
|
+
change: SyncChange;
|
|
56
|
+
}
|
|
57
|
+
export interface SyncMetrics {
|
|
58
|
+
totalPushAttempted: number;
|
|
59
|
+
totalPushSucceeded: number;
|
|
60
|
+
totalPushFailed: number;
|
|
61
|
+
totalPullApplied: number;
|
|
62
|
+
totalConflictsRecorded: number;
|
|
63
|
+
lastQueueLatencyMs: number;
|
|
64
|
+
lastRunDurationMs: number;
|
|
65
|
+
lastRunAt: number | null;
|
|
66
|
+
}
|
|
67
|
+
type SyncTraceContext = {
|
|
68
|
+
correlationId?: string;
|
|
69
|
+
syncBatchId?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Kelas penyimpanan sinkronisasi berbasis mitt dan storage adapter.
|
|
73
|
+
*/
|
|
74
|
+
export declare class SyncStore {
|
|
75
|
+
private context;
|
|
76
|
+
private state;
|
|
77
|
+
private emitter;
|
|
78
|
+
private storage;
|
|
79
|
+
/**
|
|
80
|
+
* Membuat instance SyncStore.
|
|
81
|
+
* @param context Konteks PosCore aplikasi
|
|
82
|
+
*/
|
|
83
|
+
constructor(context: PosCore);
|
|
84
|
+
/**
|
|
85
|
+
* Berlangganan update state.
|
|
86
|
+
* @param handler Handler dipanggil saat update
|
|
87
|
+
* @returns Fungsi unsubscribe
|
|
88
|
+
*/
|
|
89
|
+
subscribe(handler: Handler<State>): () => void;
|
|
90
|
+
/**
|
|
91
|
+
* Mengambil salinan state.
|
|
92
|
+
*/
|
|
93
|
+
getState(): State;
|
|
94
|
+
/**
|
|
95
|
+
* Menggabungkan patch ke state, menyimpan, dan emit update.
|
|
96
|
+
* @param patch Partial state yang akan diterapkan
|
|
97
|
+
*/
|
|
98
|
+
private setState;
|
|
99
|
+
private normalizeChange;
|
|
100
|
+
/**
|
|
101
|
+
* Memulai proses sinkronisasi.
|
|
102
|
+
*/
|
|
103
|
+
startSync(traceContext?: SyncTraceContext): void;
|
|
104
|
+
/**
|
|
105
|
+
* Mengatur error pada state.
|
|
106
|
+
* @param error Error yang terjadi
|
|
107
|
+
*/
|
|
108
|
+
setError(error: Error, traceContext?: SyncTraceContext): void;
|
|
109
|
+
/**
|
|
110
|
+
* Membersihkan error jika sebelumnya ada.
|
|
111
|
+
*/
|
|
112
|
+
clearError(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Menambahkan perubahan ke antrean.
|
|
115
|
+
* @param change Objek perubahan
|
|
116
|
+
*/
|
|
117
|
+
enqueueChange(change: any): void;
|
|
118
|
+
/**
|
|
119
|
+
* Mengeluarkan perubahan terdepan dari antrean.
|
|
120
|
+
*/
|
|
121
|
+
dequeueChange(): void;
|
|
122
|
+
removeQueuedChange(changeId: string): void;
|
|
123
|
+
/**
|
|
124
|
+
* Menambahkan detail konflik.
|
|
125
|
+
* @param conflict Objek detail konflik
|
|
126
|
+
*/
|
|
127
|
+
addConflict(conflict: any): void;
|
|
128
|
+
markRetryAttempt(changeId: string, error?: unknown): void;
|
|
129
|
+
moveToDeadLetter(changeId: string, reason: string, error?: unknown): void;
|
|
130
|
+
requeueDeadLetter(changeId: string): boolean;
|
|
131
|
+
recordSyncMetrics(patch: Partial<SyncMetrics>): void;
|
|
132
|
+
/**
|
|
133
|
+
* Menghapus semua konflik.
|
|
134
|
+
*/
|
|
135
|
+
clearConflicts(): void;
|
|
136
|
+
/**
|
|
137
|
+
* Mengatur timestamp terakhir sinkron.
|
|
138
|
+
* @param timestamp Waktu dalam milidetik
|
|
139
|
+
*/
|
|
140
|
+
setLastSyncAt(timestamp: number): void;
|
|
141
|
+
/**
|
|
142
|
+
* Menandai selesai sinkron dan kembali ke idle.
|
|
143
|
+
*/
|
|
144
|
+
finishSync(traceContext?: SyncTraceContext): void;
|
|
145
|
+
/**
|
|
146
|
+
* Menghapus semua data antrean dan state saat logout.
|
|
147
|
+
*/
|
|
148
|
+
logoutLocal(): void;
|
|
149
|
+
/**
|
|
150
|
+
* Menyimpan state ke storage.
|
|
151
|
+
*/
|
|
152
|
+
private save;
|
|
153
|
+
/**
|
|
154
|
+
* Memuat state dari storage.
|
|
155
|
+
* @returns Promise State atau null
|
|
156
|
+
*/
|
|
157
|
+
private load;
|
|
158
|
+
/**
|
|
159
|
+
* Shutdown emitter dan listeners.
|
|
160
|
+
*/
|
|
161
|
+
shutdown(): Promise<void>;
|
|
162
|
+
}
|
|
163
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ofpos-shared-core",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Offline-first POS client-side core library, platform and database agnostic.",
|
|
5
|
+
"main": "dist/index.cjs.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"browser": "dist/index.browser.mjs",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.esm.js",
|
|
12
|
+
"require": "./dist/index.cjs.js"
|
|
13
|
+
},
|
|
14
|
+
"./browser": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.browser.mjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"types": "dist/index.d.ts",
|
|
20
|
+
"scripts": {
|
|
21
|
+
"clean": "rimraf dist",
|
|
22
|
+
"build": "npm run clean && tsc -b && node esbuild.config.js",
|
|
23
|
+
"bundle": "node esbuild.config.js",
|
|
24
|
+
"lint": "eslint \"src/**/*.{ts,js}\"",
|
|
25
|
+
"test": "jest --coverage",
|
|
26
|
+
"test:package-matrix": "bash ./scripts/verify-package-matrix.sh",
|
|
27
|
+
"verify:mode-matrix": "bash ./scripts/verify-mode-matrix.sh",
|
|
28
|
+
"build:distribution": "bash ./scripts/build-distribution-artifacts.sh",
|
|
29
|
+
"verify:distribution": "bash ./scripts/verify-distribution-artifacts.sh",
|
|
30
|
+
"verify:release-discipline": "node ./scripts/verify-release-discipline.js",
|
|
31
|
+
"verify:ofcore-spike": "node ./scripts/verify-ofcore-spike.js",
|
|
32
|
+
"verify:ofcore-bridges": "node ./scripts/verify-ofcore-bridges.js",
|
|
33
|
+
"verify:no-internal-bridge-imports": "node ./scripts/verify-no-internal-bridge-imports.js",
|
|
34
|
+
"verify:governance": "node ./scripts/verify-governance-transport.js",
|
|
35
|
+
"verify:governance:negative": "node ./scripts/verify-governance-transport-negative.js",
|
|
36
|
+
"verify:poscore-runtime-bridge": "node ./scripts/verify-poscore-runtime-bridge.js",
|
|
37
|
+
"verify:poscore-overrides": "node ./scripts/verify-poscore-overrides.js",
|
|
38
|
+
"audit:schema": "node ./scripts/schema-audit.js",
|
|
39
|
+
"docs:check-links": "bash ./scripts/check-docs-links.sh",
|
|
40
|
+
"ci:check": "npm run lint && npm test -- --runInBand && npm run build && npm run verify:release-discipline && npm run verify:ofcore-bridges && npm run verify:no-internal-bridge-imports && npm run verify:governance && npm run verify:governance:negative && npm run verify:poscore-runtime-bridge && npm run verify:poscore-overrides && npm run docs:check-links",
|
|
41
|
+
"test:watch": "jest --watch",
|
|
42
|
+
"docs": "typedoc src/index.ts --out tsdocs",
|
|
43
|
+
"prepack": "npm run build"
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/yourorg/shared-core.git"
|
|
48
|
+
},
|
|
49
|
+
"author": "Agus Made <krisnaparta@gmail.com>",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"files": [
|
|
52
|
+
"dist"
|
|
53
|
+
],
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"ofcore": "0.1.0-alpha.0",
|
|
56
|
+
"ofauth-shared-core": "0.1.0-alpha.1"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/crypto-js": "^4.2.2",
|
|
60
|
+
"@types/jest": "^30.0.0",
|
|
61
|
+
"@types/reflect-metadata": "^0.1.0",
|
|
62
|
+
"@typescript-eslint/eslint-plugin": "^8.46.1",
|
|
63
|
+
"@typescript-eslint/parser": "^8.46.1",
|
|
64
|
+
"bcryptjs": "^3.0.2",
|
|
65
|
+
"crypto-js": "^4.2.0",
|
|
66
|
+
"date-fns": "^4.1.0",
|
|
67
|
+
"dotenv": "^16.0.3",
|
|
68
|
+
"esbuild": "^0.25.11",
|
|
69
|
+
"eslint": "^9.37.0",
|
|
70
|
+
"jest": "^30.2.0",
|
|
71
|
+
"jest-html-reporters": "^3.1.7",
|
|
72
|
+
"mitt": "^3.0.1",
|
|
73
|
+
"react": "^19.2.0",
|
|
74
|
+
"reflect-metadata": "^0.2.2",
|
|
75
|
+
"rimraf": "^6.0.1",
|
|
76
|
+
"ts-jest": "^29.4.5",
|
|
77
|
+
"ts-node": "^10.9.2",
|
|
78
|
+
"typedoc": "^0.28.14",
|
|
79
|
+
"typescript": "^5.9.3",
|
|
80
|
+
"uuidv7": "^1.0.2"
|
|
81
|
+
}
|
|
82
|
+
}
|