snice 1.13.2 → 1.13.4
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/bin/templates/base/README.md +1 -1
- package/dist/components/accordion/snice-accordion-item.d.ts +25 -0
- package/dist/components/accordion/snice-accordion-item.js +260 -0
- package/dist/components/accordion/snice-accordion-item.js.map +1 -0
- package/dist/components/accordion/snice-accordion.d.ts +28 -0
- package/dist/components/accordion/snice-accordion.js +221 -0
- package/dist/components/accordion/snice-accordion.js.map +1 -0
- package/dist/components/accordion/snice-accordion.types.d.ts +29 -0
- package/dist/components/accordion/snice-accordion.types.js +2 -0
- package/dist/components/accordion/snice-accordion.types.js.map +1 -0
- package/dist/components/alert/snice-alert.d.ts +26 -0
- package/dist/components/alert/snice-alert.js +191 -0
- package/dist/components/alert/snice-alert.js.map +1 -0
- package/dist/components/alert/snice-alert.types.d.ts +11 -0
- package/dist/components/alert/snice-alert.types.js +2 -0
- package/dist/components/alert/snice-alert.types.js.map +1 -0
- package/dist/components/avatar/snice-avatar.d.ts +24 -0
- package/dist/components/avatar/snice-avatar.js +177 -0
- package/dist/components/avatar/snice-avatar.js.map +1 -0
- package/dist/components/avatar/snice-avatar.types.d.ts +12 -0
- package/dist/components/avatar/snice-avatar.types.js +2 -0
- package/dist/components/avatar/snice-avatar.types.js.map +1 -0
- package/dist/components/badge/snice-badge.d.ts +25 -0
- package/dist/components/badge/snice-badge.js +157 -0
- package/dist/components/badge/snice-badge.js.map +1 -0
- package/dist/components/badge/snice-badge.types.d.ts +15 -0
- package/dist/components/badge/snice-badge.types.js +2 -0
- package/dist/components/badge/snice-badge.types.js.map +1 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.d.ts +27 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.js +212 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.types.d.ts +23 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.types.js +2 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.types.js.map +1 -0
- package/dist/components/breadcrumbs/snice-crumb.d.ts +9 -0
- package/dist/components/breadcrumbs/snice-crumb.js +50 -0
- package/dist/components/breadcrumbs/snice-crumb.js.map +1 -0
- package/dist/components/button/snice-button.d.ts +32 -0
- package/dist/components/button/snice-button.js +212 -0
- package/dist/components/button/snice-button.js.map +1 -0
- package/dist/components/button/snice-button.types.d.ts +23 -0
- package/dist/components/button/snice-button.types.js +2 -0
- package/dist/components/button/snice-button.types.js.map +1 -0
- package/dist/components/card/snice-card.d.ts +19 -0
- package/dist/components/card/snice-card.js +132 -0
- package/dist/components/card/snice-card.js.map +1 -0
- package/dist/components/card/snice-card.types.d.ts +9 -0
- package/dist/components/card/snice-card.types.js +2 -0
- package/dist/components/card/snice-card.types.js.map +1 -0
- package/dist/components/checkbox/snice-checkbox.d.ts +34 -0
- package/dist/components/checkbox/snice-checkbox.js +289 -0
- package/dist/components/checkbox/snice-checkbox.js.map +1 -0
- package/dist/components/checkbox/snice-checkbox.types.d.ts +20 -0
- package/dist/components/checkbox/snice-checkbox.types.js +2 -0
- package/dist/components/checkbox/snice-checkbox.types.js.map +1 -0
- package/dist/components/chip/snice-chip.d.ts +28 -0
- package/dist/components/chip/snice-chip.js +203 -0
- package/dist/components/chip/snice-chip.js.map +1 -0
- package/dist/components/chip/snice-chip.types.d.ts +14 -0
- package/dist/components/chip/snice-chip.types.js +2 -0
- package/dist/components/chip/snice-chip.types.js.map +1 -0
- package/dist/components/date-picker/snice-date-picker.d.ts +82 -0
- package/dist/components/date-picker/snice-date-picker.js +880 -0
- package/dist/components/date-picker/snice-date-picker.js.map +1 -0
- package/dist/components/date-picker/snice-date-picker.types.d.ts +71 -0
- package/dist/components/date-picker/snice-date-picker.types.js +2 -0
- package/dist/components/date-picker/snice-date-picker.types.js.map +1 -0
- package/dist/components/divider/snice-divider.d.ts +17 -0
- package/dist/components/divider/snice-divider.js +111 -0
- package/dist/components/divider/snice-divider.js.map +1 -0
- package/dist/components/divider/snice-divider.types.d.ts +14 -0
- package/dist/components/divider/snice-divider.types.js +2 -0
- package/dist/components/divider/snice-divider.types.js.map +1 -0
- package/dist/components/drawer/snice-drawer.d.ts +37 -0
- package/dist/components/drawer/snice-drawer.js +335 -0
- package/dist/components/drawer/snice-drawer.js.map +1 -0
- package/dist/components/drawer/snice-drawer.types.d.ts +16 -0
- package/dist/components/drawer/snice-drawer.types.js +2 -0
- package/dist/components/drawer/snice-drawer.types.js.map +1 -0
- package/dist/components/input/snice-input.d.ts +65 -0
- package/dist/components/input/snice-input.js +603 -0
- package/dist/components/input/snice-input.js.map +1 -0
- package/dist/components/input/snice-input.types.d.ts +53 -0
- package/dist/components/input/snice-input.types.js +2 -0
- package/dist/components/input/snice-input.types.js.map +1 -0
- package/dist/components/layout/snice-layout-blog.d.ts +4 -0
- package/dist/components/layout/snice-layout-blog.js +56 -0
- package/dist/components/layout/snice-layout-blog.js.map +1 -0
- package/dist/components/layout/snice-layout-card.d.ts +6 -0
- package/dist/components/layout/snice-layout-card.js +53 -0
- package/dist/components/layout/snice-layout-card.js.map +1 -0
- package/dist/components/layout/snice-layout-centered.d.ts +5 -0
- package/dist/components/layout/snice-layout-centered.js +38 -0
- package/dist/components/layout/snice-layout-centered.js.map +1 -0
- package/dist/components/layout/snice-layout-dashboard.d.ts +4 -0
- package/dist/components/layout/snice-layout-dashboard.js +53 -0
- package/dist/components/layout/snice-layout-dashboard.js.map +1 -0
- package/dist/components/layout/snice-layout-fullscreen.d.ts +5 -0
- package/dist/components/layout/snice-layout-fullscreen.js +50 -0
- package/dist/components/layout/snice-layout-fullscreen.js.map +1 -0
- package/dist/components/layout/snice-layout-landing.d.ts +4 -0
- package/dist/components/layout/snice-layout-landing.js +55 -0
- package/dist/components/layout/snice-layout-landing.js.map +1 -0
- package/dist/components/layout/snice-layout-minimal.d.ts +4 -0
- package/dist/components/layout/snice-layout-minimal.js +27 -0
- package/dist/components/layout/snice-layout-minimal.js.map +1 -0
- package/dist/components/layout/snice-layout-sidebar.d.ts +5 -0
- package/dist/components/layout/snice-layout-sidebar.js +64 -0
- package/dist/components/layout/snice-layout-sidebar.js.map +1 -0
- package/dist/components/layout/snice-layout-split.d.ts +6 -0
- package/dist/components/layout/snice-layout-split.js +47 -0
- package/dist/components/layout/snice-layout-split.js.map +1 -0
- package/dist/components/layout/snice-layout.d.ts +4 -0
- package/dist/components/layout/snice-layout.js +43 -0
- package/dist/components/layout/snice-layout.js.map +1 -0
- package/dist/components/layout/snice-layout.types.d.ts +3 -0
- package/dist/components/layout/snice-layout.types.js +2 -0
- package/dist/components/layout/snice-layout.types.js.map +1 -0
- package/dist/components/login/snice-login.d.ts +45 -0
- package/dist/components/login/snice-login.js +385 -0
- package/dist/components/login/snice-login.js.map +1 -0
- package/dist/components/login/snice-login.types.d.ts +31 -0
- package/dist/components/login/snice-login.types.js +2 -0
- package/dist/components/login/snice-login.types.js.map +1 -0
- package/dist/components/modal/snice-modal.d.ts +32 -0
- package/dist/components/modal/snice-modal.js +288 -0
- package/dist/components/modal/snice-modal.js.map +1 -0
- package/dist/components/modal/snice-modal.types.d.ts +18 -0
- package/dist/components/modal/snice-modal.types.js +2 -0
- package/dist/components/modal/snice-modal.types.js.map +1 -0
- package/dist/components/pagination/snice-pagination.d.ts +26 -0
- package/dist/components/pagination/snice-pagination.js +373 -0
- package/dist/components/pagination/snice-pagination.js.map +1 -0
- package/dist/components/pagination/snice-pagination.types.d.ts +18 -0
- package/dist/components/pagination/snice-pagination.types.js +2 -0
- package/dist/components/pagination/snice-pagination.types.js.map +1 -0
- package/dist/components/progress/snice-progress.d.ts +35 -0
- package/dist/components/progress/snice-progress.js +295 -0
- package/dist/components/progress/snice-progress.js.map +1 -0
- package/dist/components/progress/snice-progress.types.d.ts +18 -0
- package/dist/components/progress/snice-progress.types.js +2 -0
- package/dist/components/progress/snice-progress.types.js.map +1 -0
- package/dist/components/radio/snice-radio.d.ts +33 -0
- package/dist/components/radio/snice-radio.js +286 -0
- package/dist/components/radio/snice-radio.js.map +1 -0
- package/dist/components/radio/snice-radio.types.d.ts +19 -0
- package/dist/components/radio/snice-radio.types.js +2 -0
- package/dist/components/radio/snice-radio.types.js.map +1 -0
- package/dist/components/select/snice-option.d.ts +17 -0
- package/dist/components/select/snice-option.js +77 -0
- package/dist/components/select/snice-option.js.map +1 -0
- package/dist/components/select/snice-option.types.d.ts +14 -0
- package/dist/components/select/snice-option.types.js +2 -0
- package/dist/components/select/snice-option.types.js.map +1 -0
- package/dist/components/select/snice-select.d.ts +89 -0
- package/dist/components/select/snice-select.js +900 -0
- package/dist/components/select/snice-select.js.map +1 -0
- package/dist/components/select/snice-select.types.d.ts +49 -0
- package/dist/components/select/snice-select.types.js +2 -0
- package/dist/components/select/snice-select.types.js.map +1 -0
- package/dist/components/skeleton/snice-skeleton.d.ts +16 -0
- package/dist/components/skeleton/snice-skeleton.js +159 -0
- package/dist/components/skeleton/snice-skeleton.js.map +1 -0
- package/dist/components/skeleton/snice-skeleton.types.d.ts +10 -0
- package/dist/components/skeleton/snice-skeleton.types.js +2 -0
- package/dist/components/skeleton/snice-skeleton.types.js.map +1 -0
- package/dist/components/switch/snice-switch.d.ts +38 -0
- package/dist/components/switch/snice-switch.js +309 -0
- package/dist/components/switch/snice-switch.js.map +1 -0
- package/dist/components/switch/snice-switch.types.d.ts +21 -0
- package/dist/components/switch/snice-switch.types.js +2 -0
- package/dist/components/switch/snice-switch.types.js.map +1 -0
- package/dist/components/symbols.d.ts +1 -0
- package/dist/components/symbols.js +20 -0
- package/dist/components/symbols.js.map +1 -0
- package/dist/components/table/snice-cell-boolean.d.ts +21 -0
- package/dist/components/table/snice-cell-boolean.js +152 -0
- package/dist/components/table/snice-cell-boolean.js.map +1 -0
- package/dist/components/table/snice-cell-date.d.ts +24 -0
- package/dist/components/table/snice-cell-date.js +240 -0
- package/dist/components/table/snice-cell-date.js.map +1 -0
- package/dist/components/table/snice-cell-duration.d.ts +16 -0
- package/dist/components/table/snice-cell-duration.js +123 -0
- package/dist/components/table/snice-cell-duration.js.map +1 -0
- package/dist/components/table/snice-cell-filesize.d.ts +16 -0
- package/dist/components/table/snice-cell-filesize.js +119 -0
- package/dist/components/table/snice-cell-filesize.js.map +1 -0
- package/dist/components/table/snice-cell-number.d.ts +23 -0
- package/dist/components/table/snice-cell-number.js +202 -0
- package/dist/components/table/snice-cell-number.js.map +1 -0
- package/dist/components/table/snice-cell-progress.d.ts +17 -0
- package/dist/components/table/snice-cell-progress.js +114 -0
- package/dist/components/table/snice-cell-progress.js.map +1 -0
- package/dist/components/table/snice-cell-rating.d.ts +17 -0
- package/dist/components/table/snice-cell-rating.js +113 -0
- package/dist/components/table/snice-cell-rating.js.map +1 -0
- package/dist/components/table/snice-cell-sparkline.d.ts +29 -0
- package/dist/components/table/snice-cell-sparkline.js +290 -0
- package/dist/components/table/snice-cell-sparkline.js.map +1 -0
- package/dist/components/table/snice-cell-text.d.ts +19 -0
- package/dist/components/table/snice-cell-text.js +153 -0
- package/dist/components/table/snice-cell-text.js.map +1 -0
- package/dist/components/table/snice-cell.d.ts +32 -0
- package/dist/components/table/snice-cell.js +451 -0
- package/dist/components/table/snice-cell.js.map +1 -0
- package/dist/components/table/snice-column.d.ts +62 -0
- package/dist/components/table/snice-column.js +440 -0
- package/dist/components/table/snice-column.js.map +1 -0
- package/dist/components/table/snice-header.d.ts +33 -0
- package/dist/components/table/snice-header.js +303 -0
- package/dist/components/table/snice-header.js.map +1 -0
- package/dist/components/table/snice-progress.d.ts +10 -0
- package/dist/components/table/snice-progress.js +91 -0
- package/dist/components/table/snice-progress.js.map +1 -0
- package/dist/components/table/snice-rating.d.ts +9 -0
- package/dist/components/table/snice-rating.js +68 -0
- package/dist/components/table/snice-rating.js.map +1 -0
- package/dist/components/table/snice-row.d.ts +43 -0
- package/dist/components/table/snice-row.js +365 -0
- package/dist/components/table/snice-row.js.map +1 -0
- package/dist/components/table/snice-table.d.ts +69 -0
- package/dist/components/table/snice-table.js +814 -0
- package/dist/components/table/snice-table.js.map +1 -0
- package/dist/components/table/snice-table.types.d.ts +137 -0
- package/dist/components/table/snice-table.types.js +2 -0
- package/dist/components/table/snice-table.types.js.map +1 -0
- package/dist/components/tabs/snice-tab-panel.d.ts +12 -0
- package/dist/components/tabs/snice-tab-panel.js +78 -0
- package/dist/components/tabs/snice-tab-panel.js.map +1 -0
- package/dist/components/tabs/snice-tab.d.ts +13 -0
- package/dist/components/tabs/snice-tab.js +90 -0
- package/dist/components/tabs/snice-tab.js.map +1 -0
- package/dist/components/tabs/snice-tabs.d.ts +34 -0
- package/dist/components/tabs/snice-tabs.js +367 -0
- package/dist/components/tabs/snice-tabs.js.map +1 -0
- package/dist/components/tabs/snice-tabs.types.d.ts +23 -0
- package/dist/components/tabs/snice-tabs.types.js +2 -0
- package/dist/components/tabs/snice-tabs.types.js.map +1 -0
- package/dist/components/toast/snice-toast-container.d.ts +25 -0
- package/dist/components/toast/snice-toast-container.js +251 -0
- package/dist/components/toast/snice-toast-container.js.map +1 -0
- package/dist/components/toast/snice-toast.d.ts +23 -0
- package/dist/components/toast/snice-toast.js +316 -0
- package/dist/components/toast/snice-toast.js.map +1 -0
- package/dist/components/toast/snice-toast.types.d.ts +30 -0
- package/dist/components/toast/snice-toast.types.js +2 -0
- package/dist/components/toast/snice-toast.types.js.map +1 -0
- package/dist/components/tooltip/snice-tooltip.d.ts +50 -0
- package/dist/components/tooltip/snice-tooltip.js +656 -0
- package/dist/components/tooltip/snice-tooltip.js.map +1 -0
- package/dist/components/tooltip/snice-tooltip.types.d.ts +18 -0
- package/dist/components/tooltip/snice-tooltip.types.js +2 -0
- package/dist/components/tooltip/snice-tooltip.types.js.map +1 -0
- package/dist/components/transitions.d.ts +11 -0
- package/dist/components/transitions.js +69 -0
- package/dist/components/transitions.js.map +1 -0
- package/dist/src/controller.d.ts +61 -0
- package/dist/src/controller.js +297 -0
- package/dist/src/controller.js.map +1 -0
- package/dist/src/element.d.ts +77 -0
- package/dist/src/element.js +805 -0
- package/dist/src/element.js.map +1 -0
- package/dist/src/events.d.ts +37 -0
- package/dist/src/events.js +289 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/global.d.ts +7 -0
- package/dist/src/global.js +23 -0
- package/dist/src/global.js.map +1 -0
- package/{src/index.ts → dist/src/index.d.ts} +1 -1
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/observe.d.ts +26 -0
- package/dist/src/observe.js +329 -0
- package/dist/src/observe.js.map +1 -0
- package/dist/src/request-response.d.ts +46 -0
- package/dist/src/request-response.js +267 -0
- package/dist/src/request-response.js.map +1 -0
- package/dist/src/router.d.ts +87 -0
- package/dist/src/router.js +375 -0
- package/dist/src/router.js.map +1 -0
- package/dist/src/symbols.d.ts +29 -0
- package/{src/symbols.ts → dist/src/symbols.js} +2 -12
- package/dist/src/symbols.js.map +1 -0
- package/dist/src/transitions.d.ts +50 -0
- package/dist/src/transitions.js +199 -0
- package/dist/src/transitions.js.map +1 -0
- package/package.json +6 -8
- package/src/controller.ts +0 -347
- package/src/element.ts +0 -897
- package/src/events.ts +0 -349
- package/src/global.ts +0 -31
- package/src/observe.ts +0 -414
- package/src/request-response.ts +0 -336
- package/src/router.ts +0 -552
- package/src/transitions.ts +0 -264
package/src/request-response.ts
DELETED
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
import { CHANNEL_HANDLERS, CLEANUP, IS_CONTROLLER_INSTANCE } from './symbols';
|
|
2
|
-
|
|
3
|
-
// Pragmatic type for @request decorated methods
|
|
4
|
-
// - Eliminates TypeScript implicit 'any' warnings
|
|
5
|
-
// - Allows property access on returned values (result.data works)
|
|
6
|
-
// - Documents the expected return type T
|
|
7
|
-
// - The @request decorator transforms async generators to return Promise<T> at runtime
|
|
8
|
-
export type Response<T = any> = T | any;
|
|
9
|
-
|
|
10
|
-
export interface RequestOptions extends EventInit {
|
|
11
|
-
/**
|
|
12
|
-
* Timeout for waiting for responses (in ms) - defaults to 5000ms
|
|
13
|
-
*/
|
|
14
|
-
timeout?: number;
|
|
15
|
-
/**
|
|
16
|
-
* Timeout for finding a handler (in ms) - defaults to 50ms
|
|
17
|
-
*/
|
|
18
|
-
discoveryTimeout?: number;
|
|
19
|
-
/**
|
|
20
|
-
* Debounce the request by specified milliseconds
|
|
21
|
-
*/
|
|
22
|
-
debounce?: number;
|
|
23
|
-
/**
|
|
24
|
-
* Throttle the request by specified milliseconds
|
|
25
|
-
*/
|
|
26
|
-
throttle?: number;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Decorator for making requests from elements or controllers.
|
|
31
|
-
* Uses async generator pattern for bidirectional communication.
|
|
32
|
-
*
|
|
33
|
-
* @param requestName The name of the request
|
|
34
|
-
* @param options Optional configuration
|
|
35
|
-
*/
|
|
36
|
-
export function request(requestName: string, options?: RequestOptions) {
|
|
37
|
-
return function (_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
|
|
38
|
-
const originalMethod = descriptor.value;
|
|
39
|
-
|
|
40
|
-
// Create timing variables for debounce/throttle
|
|
41
|
-
let debounceTimeout: any;
|
|
42
|
-
let throttleLastCall = 0;
|
|
43
|
-
let throttleTimeout: any;
|
|
44
|
-
|
|
45
|
-
descriptor.value = async function (this: any, ...args: any[]) {
|
|
46
|
-
const actualRequest = async () => {
|
|
47
|
-
// @request always acts as requester (client side)
|
|
48
|
-
const responseTimeout = options?.timeout ?? 120000; // Default 2 minute timeout
|
|
49
|
-
const discoveryTimeout = options?.discoveryTimeout ?? 50; // Default 50ms discovery timeout
|
|
50
|
-
|
|
51
|
-
// Create the generator
|
|
52
|
-
const generator = originalMethod.apply(this, args);
|
|
53
|
-
|
|
54
|
-
// Get the first yield (the request payload)
|
|
55
|
-
const { value: payload, done } = await generator.next();
|
|
56
|
-
|
|
57
|
-
if (done) {
|
|
58
|
-
// Generator returned without yielding
|
|
59
|
-
return payload;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Create data promise and expose resolve/reject
|
|
63
|
-
let dataResolve: (value: any) => void;
|
|
64
|
-
let dataReject: (reason?: any) => void;
|
|
65
|
-
const dataPromise = new Promise((resolve, reject) => {
|
|
66
|
-
dataResolve = resolve;
|
|
67
|
-
dataReject = reject;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Create discovery timeout promise and expose resolve/reject
|
|
71
|
-
let discoveryResolve: () => void;
|
|
72
|
-
let discoveryReject: (reason?: any) => void;
|
|
73
|
-
let discoveryTimeoutId: NodeJS.Timeout;
|
|
74
|
-
const discoveryPromise = new Promise<void>((resolve, reject) => {
|
|
75
|
-
discoveryResolve = resolve;
|
|
76
|
-
discoveryReject = reject;
|
|
77
|
-
discoveryTimeoutId = setTimeout(() => {
|
|
78
|
-
reject(new Error(`Request "${requestName}" timed out after ${discoveryTimeout}ms - no handler found`));
|
|
79
|
-
}, discoveryTimeout);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// Dispatch event with promises
|
|
83
|
-
const eventName = `@request/${requestName}`;
|
|
84
|
-
const event = new CustomEvent(eventName, {
|
|
85
|
-
bubbles: options?.bubbles !== undefined ? options.bubbles : true,
|
|
86
|
-
cancelable: options?.cancelable || false,
|
|
87
|
-
composed: true, // Allow crossing shadow DOM boundaries
|
|
88
|
-
detail: {
|
|
89
|
-
payload,
|
|
90
|
-
discovery: {
|
|
91
|
-
resolve: () => {
|
|
92
|
-
clearTimeout(discoveryTimeoutId);
|
|
93
|
-
discoveryResolve();
|
|
94
|
-
},
|
|
95
|
-
reject: discoveryReject!
|
|
96
|
-
},
|
|
97
|
-
data: {
|
|
98
|
-
resolve: dataResolve!,
|
|
99
|
-
reject: dataReject!
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
// Check if this is a controller instance using the symbol
|
|
105
|
-
const isController = this[IS_CONTROLLER_INSTANCE] === true;
|
|
106
|
-
const dispatcher = isController && this.element ? this.element : this;
|
|
107
|
-
dispatcher.dispatchEvent(event);
|
|
108
|
-
|
|
109
|
-
try {
|
|
110
|
-
// Wait for discovery timeout to be cleared (handler found) or discovery timeout to reject (no handler)
|
|
111
|
-
await discoveryPromise;
|
|
112
|
-
|
|
113
|
-
// If we get here, a handler was found and discovery timeout was cleared
|
|
114
|
-
// Now wait for the actual data response with the full response timeout
|
|
115
|
-
const responseTimeoutId = setTimeout(() => {
|
|
116
|
-
dataReject!(new Error(`Request "${requestName}" timed out after ${responseTimeout}ms`));
|
|
117
|
-
}, responseTimeout);
|
|
118
|
-
|
|
119
|
-
const response = await dataPromise;
|
|
120
|
-
clearTimeout(responseTimeoutId);
|
|
121
|
-
|
|
122
|
-
// Send response back to generator and get final return value
|
|
123
|
-
const { value: finalValue } = await generator.next(response);
|
|
124
|
-
return finalValue;
|
|
125
|
-
} catch (error) {
|
|
126
|
-
// Send error to generator
|
|
127
|
-
try {
|
|
128
|
-
await generator.throw(error);
|
|
129
|
-
} catch (generatorError) {
|
|
130
|
-
throw generatorError;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}; // Close actualRequest function
|
|
134
|
-
|
|
135
|
-
// Apply debounce or throttle if specified
|
|
136
|
-
if (options?.debounce) {
|
|
137
|
-
return new Promise((resolve, reject) => {
|
|
138
|
-
clearTimeout(debounceTimeout);
|
|
139
|
-
debounceTimeout = setTimeout(async () => {
|
|
140
|
-
try {
|
|
141
|
-
const result = await actualRequest();
|
|
142
|
-
resolve(result);
|
|
143
|
-
} catch (error) {
|
|
144
|
-
reject(error);
|
|
145
|
-
}
|
|
146
|
-
}, options.debounce);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (options?.throttle) {
|
|
151
|
-
const now = Date.now();
|
|
152
|
-
const remaining = options.throttle - (now - throttleLastCall);
|
|
153
|
-
|
|
154
|
-
if (remaining <= 0) {
|
|
155
|
-
clearTimeout(throttleTimeout);
|
|
156
|
-
throttleLastCall = now;
|
|
157
|
-
return actualRequest();
|
|
158
|
-
} else if (!throttleTimeout) {
|
|
159
|
-
return new Promise((resolve, reject) => {
|
|
160
|
-
throttleTimeout = setTimeout(async () => {
|
|
161
|
-
throttleLastCall = Date.now();
|
|
162
|
-
throttleTimeout = null;
|
|
163
|
-
try {
|
|
164
|
-
const result = await actualRequest();
|
|
165
|
-
resolve(result);
|
|
166
|
-
} catch (error) {
|
|
167
|
-
reject(error);
|
|
168
|
-
}
|
|
169
|
-
}, remaining);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// If throttled and timeout already exists, return empty promise
|
|
174
|
-
return Promise.resolve();
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// No timing applied, execute immediately
|
|
178
|
-
return actualRequest();
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
return descriptor;
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export interface RespondOptions {
|
|
186
|
-
/**
|
|
187
|
-
* Debounce the response by specified milliseconds
|
|
188
|
-
*/
|
|
189
|
-
debounce?: number;
|
|
190
|
-
/**
|
|
191
|
-
* Throttle the response by specified milliseconds
|
|
192
|
-
*/
|
|
193
|
-
throttle?: number;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Decorator for responding to requests in elements or controllers.
|
|
198
|
-
*
|
|
199
|
-
* @param requestName The name of the request to respond to
|
|
200
|
-
* @param options Optional configuration
|
|
201
|
-
*/
|
|
202
|
-
export function respond(requestName: string, options?: RespondOptions) {
|
|
203
|
-
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
204
|
-
const originalMethod = descriptor.value;
|
|
205
|
-
|
|
206
|
-
// Store response metadata on the prototype
|
|
207
|
-
// This will be picked up by setupResponseHandlers
|
|
208
|
-
if (!target[CHANNEL_HANDLERS]) {
|
|
209
|
-
target[CHANNEL_HANDLERS] = [];
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
target[CHANNEL_HANDLERS].push({
|
|
213
|
-
channelName: requestName,
|
|
214
|
-
methodName: propertyKey,
|
|
215
|
-
method: originalMethod,
|
|
216
|
-
options: options
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
return descriptor;
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Helper to setup response handlers for elements and controllers
|
|
224
|
-
export function setupResponseHandlers(instance: any, element: HTMLElement) {
|
|
225
|
-
const handlers = instance.constructor.prototype[CHANNEL_HANDLERS];
|
|
226
|
-
if (!handlers) return;
|
|
227
|
-
|
|
228
|
-
// Store cleanup functions
|
|
229
|
-
// Initialize cleanup object if needed
|
|
230
|
-
if (!instance[CLEANUP]) {
|
|
231
|
-
instance[CLEANUP] = { events: [], channels: [] };
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
for (const handler of handlers) {
|
|
235
|
-
const boundMethod = handler.method.bind(instance);
|
|
236
|
-
const eventName = `@request/${handler.channelName}`;
|
|
237
|
-
|
|
238
|
-
// Create timing variables for debounce/throttle per handler
|
|
239
|
-
let debounceTimeout: any;
|
|
240
|
-
let throttleLastCall = 0;
|
|
241
|
-
let throttleTimeout: any;
|
|
242
|
-
|
|
243
|
-
// Create wrapped method with timing if needed
|
|
244
|
-
const createTimedMethod = (originalMethod: Function) => {
|
|
245
|
-
if (handler.options?.debounce) {
|
|
246
|
-
return (...args: any[]) => {
|
|
247
|
-
return new Promise((resolve, reject) => {
|
|
248
|
-
clearTimeout(debounceTimeout);
|
|
249
|
-
debounceTimeout = setTimeout(async () => {
|
|
250
|
-
try {
|
|
251
|
-
const result = await originalMethod(...args);
|
|
252
|
-
resolve(result);
|
|
253
|
-
} catch (error) {
|
|
254
|
-
reject(error);
|
|
255
|
-
}
|
|
256
|
-
}, handler.options.debounce);
|
|
257
|
-
});
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
if (handler.options?.throttle) {
|
|
262
|
-
return (...args: any[]) => {
|
|
263
|
-
const now = Date.now();
|
|
264
|
-
const remaining = handler.options.throttle! - (now - throttleLastCall);
|
|
265
|
-
|
|
266
|
-
if (remaining <= 0) {
|
|
267
|
-
clearTimeout(throttleTimeout);
|
|
268
|
-
throttleLastCall = now;
|
|
269
|
-
return originalMethod(...args);
|
|
270
|
-
} else if (!throttleTimeout) {
|
|
271
|
-
return new Promise((resolve, reject) => {
|
|
272
|
-
throttleTimeout = setTimeout(async () => {
|
|
273
|
-
throttleLastCall = Date.now();
|
|
274
|
-
throttleTimeout = null;
|
|
275
|
-
try {
|
|
276
|
-
const result = await originalMethod(...args);
|
|
277
|
-
resolve(result);
|
|
278
|
-
} catch (error) {
|
|
279
|
-
reject(error);
|
|
280
|
-
}
|
|
281
|
-
}, remaining);
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// If throttled and timeout already exists, return cached/empty response
|
|
286
|
-
return Promise.resolve(undefined);
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return originalMethod;
|
|
291
|
-
};
|
|
292
|
-
|
|
293
|
-
const timedMethod = createTimedMethod(boundMethod);
|
|
294
|
-
|
|
295
|
-
// Setup response handler
|
|
296
|
-
const responseHandler = (event: CustomEvent) => {
|
|
297
|
-
// Extract promises and payload
|
|
298
|
-
const { data, discovery, payload } = event.detail;
|
|
299
|
-
|
|
300
|
-
// Prevent other responders from responding
|
|
301
|
-
event.preventDefault();
|
|
302
|
-
event.stopImmediatePropagation();
|
|
303
|
-
event.stopPropagation();
|
|
304
|
-
|
|
305
|
-
// Clear the discovery timeout immediately - we found a handler
|
|
306
|
-
discovery.resolve();
|
|
307
|
-
|
|
308
|
-
// Call the timed responder method and handle the result
|
|
309
|
-
Promise.resolve(timedMethod(payload))
|
|
310
|
-
.then(result => {
|
|
311
|
-
data.resolve(result);
|
|
312
|
-
})
|
|
313
|
-
.catch(error => {
|
|
314
|
-
data.reject(error);
|
|
315
|
-
console.error(`Error in response handler ${handler.methodName}:`, error);
|
|
316
|
-
});
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
element.addEventListener(eventName, responseHandler as EventListener);
|
|
320
|
-
|
|
321
|
-
instance[CLEANUP].channels.push(() => {
|
|
322
|
-
element.removeEventListener(eventName, responseHandler as EventListener);
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Helper to cleanup response handlers
|
|
328
|
-
export function cleanupResponseHandlers(instance: any) {
|
|
329
|
-
if (instance[CLEANUP]?.channels) {
|
|
330
|
-
for (const cleanup of instance[CLEANUP].channels) {
|
|
331
|
-
cleanup();
|
|
332
|
-
}
|
|
333
|
-
instance[CLEANUP].channels = [];
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|