@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.
- package/README.md +144 -0
- package/dist/child/ChildBridge.d.ts +40 -0
- package/dist/child/ChildBridge.d.ts.map +1 -0
- package/dist/child/ChildBridge.js +124 -0
- package/dist/child/index.d.ts +4 -0
- package/dist/child/index.d.ts.map +1 -0
- package/dist/child/index.js +2 -0
- package/dist/child/utils.d.ts +7 -0
- package/dist/child/utils.d.ts.map +1 -0
- package/dist/child/utils.js +22 -0
- package/dist/constants.d.ts +29 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +28 -0
- package/dist/errors/BridgeError.d.ts +21 -0
- package/dist/errors/BridgeError.d.ts.map +1 -0
- package/dist/errors/BridgeError.js +35 -0
- package/dist/errors/errorFactory.d.ts +14 -0
- package/dist/errors/errorFactory.d.ts.map +1 -0
- package/dist/errors/errorFactory.js +13 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/parent/IframeChannel.d.ts +44 -0
- package/dist/parent/IframeChannel.d.ts.map +1 -0
- package/dist/parent/IframeChannel.js +96 -0
- package/dist/parent/ParentBridge.d.ts +41 -0
- package/dist/parent/ParentBridge.d.ts.map +1 -0
- package/dist/parent/ParentBridge.js +101 -0
- package/dist/parent/index.d.ts +6 -0
- package/dist/parent/index.d.ts.map +1 -0
- package/dist/parent/index.js +3 -0
- package/dist/parent/utils.d.ts +6 -0
- package/dist/parent/utils.d.ts.map +1 -0
- package/dist/parent/utils.js +23 -0
- package/dist/shared/EventEmitter.d.ts +13 -0
- package/dist/shared/EventEmitter.d.ts.map +1 -0
- package/dist/shared/EventEmitter.js +47 -0
- package/dist/shared/IdGenerator.d.ts +11 -0
- package/dist/shared/IdGenerator.d.ts.map +1 -0
- package/dist/shared/IdGenerator.js +16 -0
- package/dist/shared/MessageHandler.d.ts +75 -0
- package/dist/shared/MessageHandler.d.ts.map +1 -0
- package/dist/shared/MessageHandler.js +197 -0
- package/dist/shared/OriginValidator.d.ts +14 -0
- package/dist/shared/OriginValidator.d.ts.map +1 -0
- package/dist/shared/OriginValidator.js +53 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- 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
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -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
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
|
+
}
|