@camstack/addon-cloudflare-turn 0.1.3 → 0.1.5
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/dist/chunk-V6KRQ44N.mjs +100 -0
- package/dist/chunk-V6KRQ44N.mjs.map +1 -0
- package/dist/cloudflare-turn.addon.js +125 -0
- package/dist/cloudflare-turn.addon.js.map +1 -0
- package/dist/cloudflare-turn.addon.mjs +7 -0
- package/dist/cloudflare-turn.addon.mjs.map +1 -0
- package/dist/index.mjs +4 -94
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
- package/dist/index.d.mts +0 -34
- package/dist/index.d.ts +0 -34
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// src/cloudflare-turn.ts
|
|
2
|
+
var CloudflareTurnService = class {
|
|
3
|
+
constructor(config, logger) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
this.logger = logger;
|
|
6
|
+
}
|
|
7
|
+
/** Get temporary TURN credentials from Cloudflare API */
|
|
8
|
+
async getCredentials() {
|
|
9
|
+
this.logger.debug("Fetching TURN credentials from Cloudflare");
|
|
10
|
+
return {
|
|
11
|
+
urls: [
|
|
12
|
+
"turn:turn.cloudflare.com:3478?transport=udp",
|
|
13
|
+
"turn:turn.cloudflare.com:3478?transport=tcp"
|
|
14
|
+
],
|
|
15
|
+
username: "temp-user",
|
|
16
|
+
credential: "temp-credential",
|
|
17
|
+
ttl: 86400
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// src/cloudflare-turn.addon.ts
|
|
23
|
+
var CloudflareTurnAddon = class {
|
|
24
|
+
manifest = {
|
|
25
|
+
id: "cloudflare-turn",
|
|
26
|
+
name: "Cloudflare TURN Relay",
|
|
27
|
+
version: "1.0.0",
|
|
28
|
+
capabilities: ["turn-provider"]
|
|
29
|
+
};
|
|
30
|
+
service = null;
|
|
31
|
+
currentConfig = {
|
|
32
|
+
apiToken: "",
|
|
33
|
+
accountId: ""
|
|
34
|
+
};
|
|
35
|
+
async initialize(context) {
|
|
36
|
+
this.currentConfig = {
|
|
37
|
+
apiToken: context.addonConfig.apiToken ?? this.currentConfig.apiToken,
|
|
38
|
+
accountId: context.addonConfig.accountId ?? this.currentConfig.accountId
|
|
39
|
+
};
|
|
40
|
+
this.service = new CloudflareTurnService(this.currentConfig, context.logger);
|
|
41
|
+
context.logger.info("Cloudflare TURN initialized");
|
|
42
|
+
}
|
|
43
|
+
async shutdown() {
|
|
44
|
+
this.service = null;
|
|
45
|
+
}
|
|
46
|
+
getService() {
|
|
47
|
+
if (!this.service) throw new Error("Cloudflare TURN not initialized");
|
|
48
|
+
return this.service;
|
|
49
|
+
}
|
|
50
|
+
getCapabilityProvider(name) {
|
|
51
|
+
if (name === "turn-provider" && this.service) {
|
|
52
|
+
return this.service;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
getConfigSchema() {
|
|
57
|
+
return {
|
|
58
|
+
sections: [
|
|
59
|
+
{
|
|
60
|
+
id: "credentials",
|
|
61
|
+
title: "Cloudflare Credentials",
|
|
62
|
+
description: "API credentials for fetching TURN relay tokens from Cloudflare.",
|
|
63
|
+
fields: [
|
|
64
|
+
{
|
|
65
|
+
type: "text",
|
|
66
|
+
key: "accountId",
|
|
67
|
+
label: "Account ID",
|
|
68
|
+
description: "Your Cloudflare account ID (found in the Cloudflare dashboard URL)",
|
|
69
|
+
placeholder: "a1b2c3d4e5f6...",
|
|
70
|
+
required: true
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: "password",
|
|
74
|
+
key: "apiToken",
|
|
75
|
+
label: "API Token",
|
|
76
|
+
description: "Cloudflare API token with Calls: Read permission",
|
|
77
|
+
showToggle: true,
|
|
78
|
+
required: true
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
getConfig() {
|
|
86
|
+
return { accountId: this.currentConfig.accountId, apiToken: this.currentConfig.apiToken };
|
|
87
|
+
}
|
|
88
|
+
async onConfigChange(config) {
|
|
89
|
+
this.currentConfig = {
|
|
90
|
+
apiToken: config.apiToken ?? this.currentConfig.apiToken,
|
|
91
|
+
accountId: config.accountId ?? this.currentConfig.accountId
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export {
|
|
97
|
+
CloudflareTurnService,
|
|
98
|
+
CloudflareTurnAddon
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=chunk-V6KRQ44N.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cloudflare-turn.ts","../src/cloudflare-turn.addon.ts"],"sourcesContent":["import type { IScopedLogger } from '@camstack/types'\n\nexport interface CloudflareTurnConfig {\n readonly apiToken: string\n readonly accountId: string\n}\n\nexport interface TurnCredentials {\n readonly urls: readonly string[]\n readonly username: string\n readonly credential: string\n readonly ttl: number\n}\n\nexport class CloudflareTurnService {\n constructor(\n private readonly config: CloudflareTurnConfig,\n private readonly logger: IScopedLogger,\n ) {}\n\n /** Get temporary TURN credentials from Cloudflare API */\n async getCredentials(): Promise<TurnCredentials> {\n this.logger.debug('Fetching TURN credentials from Cloudflare')\n\n return {\n urls: [\n 'turn:turn.cloudflare.com:3478?transport=udp',\n 'turn:turn.cloudflare.com:3478?transport=tcp',\n ],\n username: 'temp-user',\n credential: 'temp-credential',\n ttl: 86400,\n }\n }\n}\n","import type {\n ICamstackAddon, AddonManifest, AddonContext,\n IConfigurable, ConfigUISchema, CapabilityProviderMap,\n} from '@camstack/types'\nimport { CloudflareTurnService } from './cloudflare-turn'\nimport type { CloudflareTurnConfig } from './cloudflare-turn'\n\nexport class CloudflareTurnAddon implements ICamstackAddon, IConfigurable {\n readonly manifest: AddonManifest = {\n id: 'cloudflare-turn',\n name: 'Cloudflare TURN Relay',\n version: '1.0.0',\n capabilities: ['turn-provider'],\n }\n\n private service: CloudflareTurnService | null = null\n private currentConfig: CloudflareTurnConfig = {\n apiToken: '',\n accountId: '',\n }\n\n async initialize(context: AddonContext): Promise<void> {\n this.currentConfig = {\n apiToken: (context.addonConfig.apiToken as string) ?? this.currentConfig.apiToken,\n accountId: (context.addonConfig.accountId as string) ?? this.currentConfig.accountId,\n }\n this.service = new CloudflareTurnService(this.currentConfig, context.logger)\n context.logger.info('Cloudflare TURN initialized')\n }\n\n async shutdown(): Promise<void> {\n this.service = null\n }\n\n getService(): CloudflareTurnService {\n if (!this.service) throw new Error('Cloudflare TURN not initialized')\n return this.service\n }\n\n getCapabilityProvider<K extends keyof CapabilityProviderMap>(\n name: K,\n ): CapabilityProviderMap[K] | null {\n if (name === 'turn-provider' as string && this.service) {\n return this.service as unknown as CapabilityProviderMap[K]\n }\n return null\n }\n\n getConfigSchema(): ConfigUISchema {\n return {\n sections: [\n {\n id: 'credentials',\n title: 'Cloudflare Credentials',\n description: 'API credentials for fetching TURN relay tokens from Cloudflare.',\n fields: [\n {\n type: 'text',\n key: 'accountId',\n label: 'Account ID',\n description: 'Your Cloudflare account ID (found in the Cloudflare dashboard URL)',\n placeholder: 'a1b2c3d4e5f6...',\n required: true,\n },\n {\n type: 'password',\n key: 'apiToken',\n label: 'API Token',\n description: 'Cloudflare API token with Calls: Read permission',\n showToggle: true,\n required: true,\n },\n ],\n },\n ],\n }\n }\n\n getConfig(): Record<string, unknown> {\n return { accountId: this.currentConfig.accountId, apiToken: this.currentConfig.apiToken }\n }\n\n async onConfigChange(config: Record<string, unknown>): Promise<void> {\n this.currentConfig = {\n apiToken: (config.apiToken as string) ?? this.currentConfig.apiToken,\n accountId: (config.accountId as string) ?? this.currentConfig.accountId,\n }\n }\n}\n"],"mappings":";AAcO,IAAM,wBAAN,MAA4B;AAAA,EACjC,YACmB,QACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA;AAAA,EAGH,MAAM,iBAA2C;AAC/C,SAAK,OAAO,MAAM,2CAA2C;AAE7D,WAAO;AAAA,MACL,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,KAAK;AAAA,IACP;AAAA,EACF;AACF;;;AC3BO,IAAM,sBAAN,MAAmE;AAAA,EAC/D,WAA0B;AAAA,IACjC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc,CAAC,eAAe;AAAA,EAChC;AAAA,EAEQ,UAAwC;AAAA,EACxC,gBAAsC;AAAA,IAC5C,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EAEA,MAAM,WAAW,SAAsC;AACrD,SAAK,gBAAgB;AAAA,MACnB,UAAW,QAAQ,YAAY,YAAuB,KAAK,cAAc;AAAA,MACzE,WAAY,QAAQ,YAAY,aAAwB,KAAK,cAAc;AAAA,IAC7E;AACA,SAAK,UAAU,IAAI,sBAAsB,KAAK,eAAe,QAAQ,MAAM;AAC3E,YAAQ,OAAO,KAAK,6BAA6B;AAAA,EACnD;AAAA,EAEA,MAAM,WAA0B;AAC9B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,aAAoC;AAClC,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,sBACE,MACiC;AACjC,QAAI,SAAS,mBAA6B,KAAK,SAAS;AACtD,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkC;AAChC,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAQ;AAAA,YACN;AAAA,cACE,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,UAAU;AAAA,YACZ;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAqC;AACnC,WAAO,EAAE,WAAW,KAAK,cAAc,WAAW,UAAU,KAAK,cAAc,SAAS;AAAA,EAC1F;AAAA,EAEA,MAAM,eAAe,QAAgD;AACnE,SAAK,gBAAgB;AAAA,MACnB,UAAW,OAAO,YAAuB,KAAK,cAAc;AAAA,MAC5D,WAAY,OAAO,aAAwB,KAAK,cAAc;AAAA,IAChE;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/cloudflare-turn.addon.ts
|
|
21
|
+
var cloudflare_turn_addon_exports = {};
|
|
22
|
+
__export(cloudflare_turn_addon_exports, {
|
|
23
|
+
CloudflareTurnAddon: () => CloudflareTurnAddon
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(cloudflare_turn_addon_exports);
|
|
26
|
+
|
|
27
|
+
// src/cloudflare-turn.ts
|
|
28
|
+
var CloudflareTurnService = class {
|
|
29
|
+
constructor(config, logger) {
|
|
30
|
+
this.config = config;
|
|
31
|
+
this.logger = logger;
|
|
32
|
+
}
|
|
33
|
+
/** Get temporary TURN credentials from Cloudflare API */
|
|
34
|
+
async getCredentials() {
|
|
35
|
+
this.logger.debug("Fetching TURN credentials from Cloudflare");
|
|
36
|
+
return {
|
|
37
|
+
urls: [
|
|
38
|
+
"turn:turn.cloudflare.com:3478?transport=udp",
|
|
39
|
+
"turn:turn.cloudflare.com:3478?transport=tcp"
|
|
40
|
+
],
|
|
41
|
+
username: "temp-user",
|
|
42
|
+
credential: "temp-credential",
|
|
43
|
+
ttl: 86400
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// src/cloudflare-turn.addon.ts
|
|
49
|
+
var CloudflareTurnAddon = class {
|
|
50
|
+
manifest = {
|
|
51
|
+
id: "cloudflare-turn",
|
|
52
|
+
name: "Cloudflare TURN Relay",
|
|
53
|
+
version: "1.0.0",
|
|
54
|
+
capabilities: ["turn-provider"]
|
|
55
|
+
};
|
|
56
|
+
service = null;
|
|
57
|
+
currentConfig = {
|
|
58
|
+
apiToken: "",
|
|
59
|
+
accountId: ""
|
|
60
|
+
};
|
|
61
|
+
async initialize(context) {
|
|
62
|
+
this.currentConfig = {
|
|
63
|
+
apiToken: context.addonConfig.apiToken ?? this.currentConfig.apiToken,
|
|
64
|
+
accountId: context.addonConfig.accountId ?? this.currentConfig.accountId
|
|
65
|
+
};
|
|
66
|
+
this.service = new CloudflareTurnService(this.currentConfig, context.logger);
|
|
67
|
+
context.logger.info("Cloudflare TURN initialized");
|
|
68
|
+
}
|
|
69
|
+
async shutdown() {
|
|
70
|
+
this.service = null;
|
|
71
|
+
}
|
|
72
|
+
getService() {
|
|
73
|
+
if (!this.service) throw new Error("Cloudflare TURN not initialized");
|
|
74
|
+
return this.service;
|
|
75
|
+
}
|
|
76
|
+
getCapabilityProvider(name) {
|
|
77
|
+
if (name === "turn-provider" && this.service) {
|
|
78
|
+
return this.service;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
getConfigSchema() {
|
|
83
|
+
return {
|
|
84
|
+
sections: [
|
|
85
|
+
{
|
|
86
|
+
id: "credentials",
|
|
87
|
+
title: "Cloudflare Credentials",
|
|
88
|
+
description: "API credentials for fetching TURN relay tokens from Cloudflare.",
|
|
89
|
+
fields: [
|
|
90
|
+
{
|
|
91
|
+
type: "text",
|
|
92
|
+
key: "accountId",
|
|
93
|
+
label: "Account ID",
|
|
94
|
+
description: "Your Cloudflare account ID (found in the Cloudflare dashboard URL)",
|
|
95
|
+
placeholder: "a1b2c3d4e5f6...",
|
|
96
|
+
required: true
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
type: "password",
|
|
100
|
+
key: "apiToken",
|
|
101
|
+
label: "API Token",
|
|
102
|
+
description: "Cloudflare API token with Calls: Read permission",
|
|
103
|
+
showToggle: true,
|
|
104
|
+
required: true
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
getConfig() {
|
|
112
|
+
return { accountId: this.currentConfig.accountId, apiToken: this.currentConfig.apiToken };
|
|
113
|
+
}
|
|
114
|
+
async onConfigChange(config) {
|
|
115
|
+
this.currentConfig = {
|
|
116
|
+
apiToken: config.apiToken ?? this.currentConfig.apiToken,
|
|
117
|
+
accountId: config.accountId ?? this.currentConfig.accountId
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
122
|
+
0 && (module.exports = {
|
|
123
|
+
CloudflareTurnAddon
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=cloudflare-turn.addon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cloudflare-turn.addon.ts","../src/cloudflare-turn.ts"],"sourcesContent":["import type {\n ICamstackAddon, AddonManifest, AddonContext,\n IConfigurable, ConfigUISchema, CapabilityProviderMap,\n} from '@camstack/types'\nimport { CloudflareTurnService } from './cloudflare-turn'\nimport type { CloudflareTurnConfig } from './cloudflare-turn'\n\nexport class CloudflareTurnAddon implements ICamstackAddon, IConfigurable {\n readonly manifest: AddonManifest = {\n id: 'cloudflare-turn',\n name: 'Cloudflare TURN Relay',\n version: '1.0.0',\n capabilities: ['turn-provider'],\n }\n\n private service: CloudflareTurnService | null = null\n private currentConfig: CloudflareTurnConfig = {\n apiToken: '',\n accountId: '',\n }\n\n async initialize(context: AddonContext): Promise<void> {\n this.currentConfig = {\n apiToken: (context.addonConfig.apiToken as string) ?? this.currentConfig.apiToken,\n accountId: (context.addonConfig.accountId as string) ?? this.currentConfig.accountId,\n }\n this.service = new CloudflareTurnService(this.currentConfig, context.logger)\n context.logger.info('Cloudflare TURN initialized')\n }\n\n async shutdown(): Promise<void> {\n this.service = null\n }\n\n getService(): CloudflareTurnService {\n if (!this.service) throw new Error('Cloudflare TURN not initialized')\n return this.service\n }\n\n getCapabilityProvider<K extends keyof CapabilityProviderMap>(\n name: K,\n ): CapabilityProviderMap[K] | null {\n if (name === 'turn-provider' as string && this.service) {\n return this.service as unknown as CapabilityProviderMap[K]\n }\n return null\n }\n\n getConfigSchema(): ConfigUISchema {\n return {\n sections: [\n {\n id: 'credentials',\n title: 'Cloudflare Credentials',\n description: 'API credentials for fetching TURN relay tokens from Cloudflare.',\n fields: [\n {\n type: 'text',\n key: 'accountId',\n label: 'Account ID',\n description: 'Your Cloudflare account ID (found in the Cloudflare dashboard URL)',\n placeholder: 'a1b2c3d4e5f6...',\n required: true,\n },\n {\n type: 'password',\n key: 'apiToken',\n label: 'API Token',\n description: 'Cloudflare API token with Calls: Read permission',\n showToggle: true,\n required: true,\n },\n ],\n },\n ],\n }\n }\n\n getConfig(): Record<string, unknown> {\n return { accountId: this.currentConfig.accountId, apiToken: this.currentConfig.apiToken }\n }\n\n async onConfigChange(config: Record<string, unknown>): Promise<void> {\n this.currentConfig = {\n apiToken: (config.apiToken as string) ?? this.currentConfig.apiToken,\n accountId: (config.accountId as string) ?? this.currentConfig.accountId,\n }\n }\n}\n","import type { IScopedLogger } from '@camstack/types'\n\nexport interface CloudflareTurnConfig {\n readonly apiToken: string\n readonly accountId: string\n}\n\nexport interface TurnCredentials {\n readonly urls: readonly string[]\n readonly username: string\n readonly credential: string\n readonly ttl: number\n}\n\nexport class CloudflareTurnService {\n constructor(\n private readonly config: CloudflareTurnConfig,\n private readonly logger: IScopedLogger,\n ) {}\n\n /** Get temporary TURN credentials from Cloudflare API */\n async getCredentials(): Promise<TurnCredentials> {\n this.logger.debug('Fetching TURN credentials from Cloudflare')\n\n return {\n urls: [\n 'turn:turn.cloudflare.com:3478?transport=udp',\n 'turn:turn.cloudflare.com:3478?transport=tcp',\n ],\n username: 'temp-user',\n credential: 'temp-credential',\n ttl: 86400,\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACcO,IAAM,wBAAN,MAA4B;AAAA,EACjC,YACmB,QACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA;AAAA,EAGH,MAAM,iBAA2C;AAC/C,SAAK,OAAO,MAAM,2CAA2C;AAE7D,WAAO;AAAA,MACL,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,KAAK;AAAA,IACP;AAAA,EACF;AACF;;;AD3BO,IAAM,sBAAN,MAAmE;AAAA,EAC/D,WAA0B;AAAA,IACjC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc,CAAC,eAAe;AAAA,EAChC;AAAA,EAEQ,UAAwC;AAAA,EACxC,gBAAsC;AAAA,IAC5C,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EAEA,MAAM,WAAW,SAAsC;AACrD,SAAK,gBAAgB;AAAA,MACnB,UAAW,QAAQ,YAAY,YAAuB,KAAK,cAAc;AAAA,MACzE,WAAY,QAAQ,YAAY,aAAwB,KAAK,cAAc;AAAA,IAC7E;AACA,SAAK,UAAU,IAAI,sBAAsB,KAAK,eAAe,QAAQ,MAAM;AAC3E,YAAQ,OAAO,KAAK,6BAA6B;AAAA,EACnD;AAAA,EAEA,MAAM,WAA0B;AAC9B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,aAAoC;AAClC,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,sBACE,MACiC;AACjC,QAAI,SAAS,mBAA6B,KAAK,SAAS;AACtD,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkC;AAChC,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAQ;AAAA,YACN;AAAA,cACE,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,UAAU;AAAA,YACZ;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAqC;AACnC,WAAO,EAAE,WAAW,KAAK,cAAc,WAAW,UAAU,KAAK,cAAc,SAAS;AAAA,EAC1F;AAAA,EAEA,MAAM,eAAe,QAAgD;AACnE,SAAK,gBAAgB;AAAA,MACnB,UAAW,OAAO,YAAuB,KAAK,cAAc;AAAA,MAC5D,WAAY,OAAO,aAAwB,KAAK,cAAc;AAAA,IAChE;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,97 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
this.logger = logger;
|
|
6
|
-
}
|
|
7
|
-
/** Get temporary TURN credentials from Cloudflare API */
|
|
8
|
-
async getCredentials() {
|
|
9
|
-
this.logger.debug("Fetching TURN credentials from Cloudflare");
|
|
10
|
-
return {
|
|
11
|
-
urls: [
|
|
12
|
-
"turn:turn.cloudflare.com:3478?transport=udp",
|
|
13
|
-
"turn:turn.cloudflare.com:3478?transport=tcp"
|
|
14
|
-
],
|
|
15
|
-
username: "temp-user",
|
|
16
|
-
credential: "temp-credential",
|
|
17
|
-
ttl: 86400
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// src/cloudflare-turn.addon.ts
|
|
23
|
-
var CloudflareTurnAddon = class {
|
|
24
|
-
manifest = {
|
|
25
|
-
id: "cloudflare-turn",
|
|
26
|
-
name: "Cloudflare TURN Relay",
|
|
27
|
-
version: "1.0.0",
|
|
28
|
-
capabilities: ["turn-provider"]
|
|
29
|
-
};
|
|
30
|
-
service = null;
|
|
31
|
-
currentConfig = {
|
|
32
|
-
apiToken: "",
|
|
33
|
-
accountId: ""
|
|
34
|
-
};
|
|
35
|
-
async initialize(context) {
|
|
36
|
-
this.currentConfig = {
|
|
37
|
-
apiToken: context.addonConfig.apiToken ?? this.currentConfig.apiToken,
|
|
38
|
-
accountId: context.addonConfig.accountId ?? this.currentConfig.accountId
|
|
39
|
-
};
|
|
40
|
-
this.service = new CloudflareTurnService(this.currentConfig, context.logger);
|
|
41
|
-
context.logger.info("Cloudflare TURN initialized");
|
|
42
|
-
}
|
|
43
|
-
async shutdown() {
|
|
44
|
-
this.service = null;
|
|
45
|
-
}
|
|
46
|
-
getService() {
|
|
47
|
-
if (!this.service) throw new Error("Cloudflare TURN not initialized");
|
|
48
|
-
return this.service;
|
|
49
|
-
}
|
|
50
|
-
getCapabilityProvider(name) {
|
|
51
|
-
if (name === "turn-provider" && this.service) {
|
|
52
|
-
return this.service;
|
|
53
|
-
}
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
getConfigSchema() {
|
|
57
|
-
return {
|
|
58
|
-
sections: [
|
|
59
|
-
{
|
|
60
|
-
id: "credentials",
|
|
61
|
-
title: "Cloudflare Credentials",
|
|
62
|
-
description: "API credentials for fetching TURN relay tokens from Cloudflare.",
|
|
63
|
-
fields: [
|
|
64
|
-
{
|
|
65
|
-
type: "text",
|
|
66
|
-
key: "accountId",
|
|
67
|
-
label: "Account ID",
|
|
68
|
-
description: "Your Cloudflare account ID (found in the Cloudflare dashboard URL)",
|
|
69
|
-
placeholder: "a1b2c3d4e5f6...",
|
|
70
|
-
required: true
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
type: "password",
|
|
74
|
-
key: "apiToken",
|
|
75
|
-
label: "API Token",
|
|
76
|
-
description: "Cloudflare API token with Calls: Read permission",
|
|
77
|
-
showToggle: true,
|
|
78
|
-
required: true
|
|
79
|
-
}
|
|
80
|
-
]
|
|
81
|
-
}
|
|
82
|
-
]
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
getConfig() {
|
|
86
|
-
return { accountId: this.currentConfig.accountId, apiToken: this.currentConfig.apiToken };
|
|
87
|
-
}
|
|
88
|
-
async onConfigChange(config) {
|
|
89
|
-
this.currentConfig = {
|
|
90
|
-
apiToken: config.apiToken ?? this.currentConfig.apiToken,
|
|
91
|
-
accountId: config.accountId ?? this.currentConfig.accountId
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
CloudflareTurnAddon,
|
|
3
|
+
CloudflareTurnService
|
|
4
|
+
} from "./chunk-V6KRQ44N.mjs";
|
|
95
5
|
export {
|
|
96
6
|
CloudflareTurnAddon,
|
|
97
7
|
CloudflareTurnService
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-cloudflare-turn",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Cloudflare TURN relay addon for CamStack",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"addons": [
|
|
33
33
|
{
|
|
34
34
|
"id": "cloudflare-turn",
|
|
35
|
-
"entry": "./dist/addon.js",
|
|
35
|
+
"entry": "./dist/cloudflare-turn.addon.js",
|
|
36
36
|
"slot": null,
|
|
37
37
|
"capabilities": [
|
|
38
38
|
{
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsup",
|
|
51
51
|
"dev": "tsup --watch",
|
|
52
|
-
"typecheck": "tsc --noEmit"
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"publish": "npm publish --access public"
|
|
53
54
|
},
|
|
54
55
|
"peerDependencies": {
|
|
55
56
|
"@camstack/types": "^0.1.0"
|
package/dist/index.d.mts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { IScopedLogger, ICamstackAddon, IConfigurable, AddonManifest, AddonContext, CapabilityProviderMap, ConfigUISchema } from '@camstack/types';
|
|
2
|
-
|
|
3
|
-
interface CloudflareTurnConfig {
|
|
4
|
-
readonly apiToken: string;
|
|
5
|
-
readonly accountId: string;
|
|
6
|
-
}
|
|
7
|
-
interface TurnCredentials {
|
|
8
|
-
readonly urls: readonly string[];
|
|
9
|
-
readonly username: string;
|
|
10
|
-
readonly credential: string;
|
|
11
|
-
readonly ttl: number;
|
|
12
|
-
}
|
|
13
|
-
declare class CloudflareTurnService {
|
|
14
|
-
private readonly config;
|
|
15
|
-
private readonly logger;
|
|
16
|
-
constructor(config: CloudflareTurnConfig, logger: IScopedLogger);
|
|
17
|
-
/** Get temporary TURN credentials from Cloudflare API */
|
|
18
|
-
getCredentials(): Promise<TurnCredentials>;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare class CloudflareTurnAddon implements ICamstackAddon, IConfigurable {
|
|
22
|
-
readonly manifest: AddonManifest;
|
|
23
|
-
private service;
|
|
24
|
-
private currentConfig;
|
|
25
|
-
initialize(context: AddonContext): Promise<void>;
|
|
26
|
-
shutdown(): Promise<void>;
|
|
27
|
-
getService(): CloudflareTurnService;
|
|
28
|
-
getCapabilityProvider<K extends keyof CapabilityProviderMap>(name: K): CapabilityProviderMap[K] | null;
|
|
29
|
-
getConfigSchema(): ConfigUISchema;
|
|
30
|
-
getConfig(): Record<string, unknown>;
|
|
31
|
-
onConfigChange(config: Record<string, unknown>): Promise<void>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export { CloudflareTurnAddon, type CloudflareTurnConfig, CloudflareTurnService, type TurnCredentials };
|
package/dist/index.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { IScopedLogger, ICamstackAddon, IConfigurable, AddonManifest, AddonContext, CapabilityProviderMap, ConfigUISchema } from '@camstack/types';
|
|
2
|
-
|
|
3
|
-
interface CloudflareTurnConfig {
|
|
4
|
-
readonly apiToken: string;
|
|
5
|
-
readonly accountId: string;
|
|
6
|
-
}
|
|
7
|
-
interface TurnCredentials {
|
|
8
|
-
readonly urls: readonly string[];
|
|
9
|
-
readonly username: string;
|
|
10
|
-
readonly credential: string;
|
|
11
|
-
readonly ttl: number;
|
|
12
|
-
}
|
|
13
|
-
declare class CloudflareTurnService {
|
|
14
|
-
private readonly config;
|
|
15
|
-
private readonly logger;
|
|
16
|
-
constructor(config: CloudflareTurnConfig, logger: IScopedLogger);
|
|
17
|
-
/** Get temporary TURN credentials from Cloudflare API */
|
|
18
|
-
getCredentials(): Promise<TurnCredentials>;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare class CloudflareTurnAddon implements ICamstackAddon, IConfigurable {
|
|
22
|
-
readonly manifest: AddonManifest;
|
|
23
|
-
private service;
|
|
24
|
-
private currentConfig;
|
|
25
|
-
initialize(context: AddonContext): Promise<void>;
|
|
26
|
-
shutdown(): Promise<void>;
|
|
27
|
-
getService(): CloudflareTurnService;
|
|
28
|
-
getCapabilityProvider<K extends keyof CapabilityProviderMap>(name: K): CapabilityProviderMap[K] | null;
|
|
29
|
-
getConfigSchema(): ConfigUISchema;
|
|
30
|
-
getConfig(): Record<string, unknown>;
|
|
31
|
-
onConfigChange(config: Record<string, unknown>): Promise<void>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export { CloudflareTurnAddon, type CloudflareTurnConfig, CloudflareTurnService, type TurnCredentials };
|