@kookapp/web-bridge 0.0.1

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.
Files changed (50) hide show
  1. package/README.md +144 -0
  2. package/dist/child/ChildBridge.d.ts +40 -0
  3. package/dist/child/ChildBridge.d.ts.map +1 -0
  4. package/dist/child/ChildBridge.js +124 -0
  5. package/dist/child/index.d.ts +4 -0
  6. package/dist/child/index.d.ts.map +1 -0
  7. package/dist/child/index.js +2 -0
  8. package/dist/child/utils.d.ts +7 -0
  9. package/dist/child/utils.d.ts.map +1 -0
  10. package/dist/child/utils.js +22 -0
  11. package/dist/constants.d.ts +29 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +28 -0
  14. package/dist/errors/BridgeError.d.ts +21 -0
  15. package/dist/errors/BridgeError.d.ts.map +1 -0
  16. package/dist/errors/BridgeError.js +35 -0
  17. package/dist/errors/errorFactory.d.ts +14 -0
  18. package/dist/errors/errorFactory.d.ts.map +1 -0
  19. package/dist/errors/errorFactory.js +13 -0
  20. package/dist/index.d.ts +17 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +17 -0
  23. package/dist/parent/IframeChannel.d.ts +44 -0
  24. package/dist/parent/IframeChannel.d.ts.map +1 -0
  25. package/dist/parent/IframeChannel.js +96 -0
  26. package/dist/parent/ParentBridge.d.ts +41 -0
  27. package/dist/parent/ParentBridge.d.ts.map +1 -0
  28. package/dist/parent/ParentBridge.js +101 -0
  29. package/dist/parent/index.d.ts +6 -0
  30. package/dist/parent/index.d.ts.map +1 -0
  31. package/dist/parent/index.js +3 -0
  32. package/dist/parent/utils.d.ts +6 -0
  33. package/dist/parent/utils.d.ts.map +1 -0
  34. package/dist/parent/utils.js +23 -0
  35. package/dist/shared/EventEmitter.d.ts +13 -0
  36. package/dist/shared/EventEmitter.d.ts.map +1 -0
  37. package/dist/shared/EventEmitter.js +47 -0
  38. package/dist/shared/IdGenerator.d.ts +11 -0
  39. package/dist/shared/IdGenerator.d.ts.map +1 -0
  40. package/dist/shared/IdGenerator.js +16 -0
  41. package/dist/shared/MessageHandler.d.ts +75 -0
  42. package/dist/shared/MessageHandler.d.ts.map +1 -0
  43. package/dist/shared/MessageHandler.js +197 -0
  44. package/dist/shared/OriginValidator.d.ts +14 -0
  45. package/dist/shared/OriginValidator.d.ts.map +1 -0
  46. package/dist/shared/OriginValidator.js +53 -0
  47. package/dist/types.d.ts +73 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +4 -0
  50. package/package.json +31 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Origin validator for security
3
+ */
4
+ import { ValidationResult } from '@/types';
5
+ export declare class OriginValidator {
6
+ private allowedOrigins;
7
+ private debug;
8
+ constructor(allowedOrigins: string[], debug?: boolean);
9
+ validate(messageOrigin: string): ValidationResult;
10
+ isOriginAllowed(messageOrigin: string): boolean;
11
+ updateAllowedOrigins(origins: string[]): void;
12
+ getAllowedOrigins(): string[];
13
+ }
14
+ //# sourceMappingURL=OriginValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OriginValidator.d.ts","sourceRoot":"","sources":["../../src/shared/OriginValidator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,KAAK,CAAS;gBAEV,cAAc,EAAE,MAAM,EAAE,EAAE,KAAK,UAAQ;IAKnD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB;IAuCjD,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAI/C,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAI7C,iBAAiB,IAAI,MAAM,EAAE;CAG9B"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Origin validator for security
3
+ */
4
+ export class OriginValidator {
5
+ constructor(allowedOrigins, debug = false) {
6
+ this.allowedOrigins = allowedOrigins;
7
+ this.debug = debug;
8
+ }
9
+ validate(messageOrigin) {
10
+ if (!messageOrigin) {
11
+ return { valid: false, error: 'Message origin is missing' };
12
+ }
13
+ for (const pattern of this.allowedOrigins) {
14
+ // Wildcard pattern (allow all - use for development only)
15
+ if (pattern === '*') {
16
+ if (this.debug) {
17
+ console.warn('[WebBridge] Using wildcard origin validation - not recommended for production');
18
+ }
19
+ return { valid: true };
20
+ }
21
+ // Exact match
22
+ if (pattern === messageOrigin) {
23
+ return { valid: true };
24
+ }
25
+ // Regex pattern
26
+ try {
27
+ const regex = new RegExp(pattern);
28
+ if (regex.test(messageOrigin)) {
29
+ return { valid: true };
30
+ }
31
+ }
32
+ catch (error) {
33
+ // If pattern is not a valid regex, skip
34
+ if (this.debug) {
35
+ console.warn(`[WebBridge] Invalid regex pattern: ${pattern}`);
36
+ }
37
+ }
38
+ }
39
+ return {
40
+ valid: false,
41
+ error: `Origin "${messageOrigin}" is not allowed. Allowed origins: ${this.allowedOrigins.join(', ')}`
42
+ };
43
+ }
44
+ isOriginAllowed(messageOrigin) {
45
+ return this.validate(messageOrigin).valid;
46
+ }
47
+ updateAllowedOrigins(origins) {
48
+ this.allowedOrigins = origins;
49
+ }
50
+ getAllowedOrigins() {
51
+ return [...this.allowedOrigins];
52
+ }
53
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Core type definitions for WebBridge
3
+ */
4
+ export type MessageType = 'call' | 'response' | 'register' | 'ready';
5
+ export type Handler = (data?: any, callback?: (result: any) => void) => void | Promise<any>;
6
+ /**
7
+ * Bridge configuration interface
8
+ */
9
+ export interface BridgeConfig {
10
+ allowedOrigins: string[];
11
+ timeout?: number;
12
+ debug?: boolean;
13
+ maxRetries?: number;
14
+ }
15
+ /**
16
+ * Parent Bridge specific config
17
+ */
18
+ export interface ParentBridgeConfig extends BridgeConfig {
19
+ }
20
+ /**
21
+ * Child Bridge specific config
22
+ */
23
+ export interface ChildBridgeConfig extends BridgeConfig {
24
+ }
25
+ /**
26
+ * Bridge message structure
27
+ */
28
+ export interface BridgeMessage {
29
+ type: MessageType;
30
+ id: string;
31
+ handlerName?: string;
32
+ data?: any;
33
+ error?: string;
34
+ _version?: string;
35
+ }
36
+ /**
37
+ * Internal pending request tracker
38
+ */
39
+ export interface PendingRequest {
40
+ id: string;
41
+ timeout: NodeJS.Timeout;
42
+ resolve: (value: any) => void;
43
+ reject: (reason?: any) => void;
44
+ }
45
+ /**
46
+ * Handler registry
47
+ */
48
+ export type HandlerRegistry = Map<string, Handler>;
49
+ /**
50
+ * Event types for EventEmitter
51
+ */
52
+ export type BridgeEventType = 'ready' | 'disconnect' | 'error' | 'message';
53
+ export interface BridgeEvent {
54
+ type: BridgeEventType;
55
+ data?: any;
56
+ }
57
+ /**
58
+ * iframe Channel interface
59
+ */
60
+ export interface IframeChannelInterface {
61
+ callHandler(handlerName: string, data?: any, callback?: (result: any) => void): Promise<any>;
62
+ getIframe(): HTMLIFrameElement;
63
+ isConnected(): boolean;
64
+ destroy(): void;
65
+ }
66
+ /**
67
+ * Validator result
68
+ */
69
+ export interface ValidationResult {
70
+ valid: boolean;
71
+ error?: string;
72
+ }
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAA;AAGpE,MAAM,MAAM,OAAO,GAAG,CACpB,IAAI,CAAC,EAAE,GAAG,EACV,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,KAC7B,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAExB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,YAAY;CAEvD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,YAAY;CAEtD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAC,OAAO,CAAA;IACvB,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAElD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAA;AAE1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,CAAC,EAAE,GAAG,CAAA;CACX;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,CACT,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,GAAG,EACV,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAC/B,OAAO,CAAC,GAAG,CAAC,CAAA;IACf,SAAS,IAAI,iBAAiB,CAAA;IAC9B,WAAW,IAAI,OAAO,CAAA;IACtB,OAAO,IAAI,IAAI,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Core type definitions for WebBridge
3
+ */
4
+ export {};
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@kookapp/web-bridge",
3
+ "version": "0.0.1",
4
+ "description": "PostMessage-based bridge for iframe communication",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "test": "jest",
11
+ "test:watch": "jest --watch"
12
+ },
13
+ "author": "",
14
+ "license": "MIT",
15
+ "devDependencies": {
16
+ "@types/jest": "^29.5.0",
17
+ "typescript": "^5.0.0",
18
+ "jest": "^29.5.0",
19
+ "jest-environment-jsdom": "^29.5.0",
20
+ "ts-jest": "^29.1.0"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "publishConfig": {
26
+ "registry": "https://registry.npmjs.org"
27
+ },
28
+ "exports": {
29
+ ".": "./dist/index.js"
30
+ }
31
+ }