@camstack/addon-cloudflare-turn 0.1.13 → 0.1.14

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.
@@ -0,0 +1,84 @@
1
+ // src/cloudflare-turn.addon.ts
2
+ import { BaseAddon, turnProviderCapability } from "@camstack/types";
3
+
4
+ // src/cloudflare-turn.ts
5
+ var CloudflareTurnService = class {
6
+ constructor(_config, logger) {
7
+ this.logger = logger;
8
+ }
9
+ logger;
10
+ id = "cloudflare-turn";
11
+ name = "Cloudflare TURN";
12
+ /**
13
+ * Return the current TURN/STUN server list with credentials.
14
+ * Implements `turn-provider` capability.
15
+ */
16
+ getTurnServers() {
17
+ this.logger.debug("Fetching TURN servers from Cloudflare");
18
+ return [
19
+ {
20
+ urls: [
21
+ "turn:turn.cloudflare.com:3478?transport=udp",
22
+ "turn:turn.cloudflare.com:3478?transport=tcp"
23
+ ],
24
+ username: "temp-user",
25
+ credential: "temp-credential"
26
+ }
27
+ ];
28
+ }
29
+ };
30
+
31
+ // src/cloudflare-turn.addon.ts
32
+ var CloudflareTurnAddon = class extends BaseAddon {
33
+ service = null;
34
+ constructor() {
35
+ super({ apiToken: "", accountId: "" });
36
+ }
37
+ async onInitialize() {
38
+ this.service = new CloudflareTurnService(this.config, this.ctx.logger);
39
+ this.ctx.logger.info("Cloudflare TURN initialized");
40
+ return [{ capability: turnProviderCapability, provider: this.service }];
41
+ }
42
+ async onShutdown() {
43
+ this.service = null;
44
+ }
45
+ getService() {
46
+ if (!this.service) throw new Error("Cloudflare TURN not initialized");
47
+ return this.service;
48
+ }
49
+ globalSettingsSchema() {
50
+ return this.schema({
51
+ sections: [
52
+ {
53
+ id: "credentials",
54
+ title: "Cloudflare Credentials",
55
+ description: "API credentials for fetching TURN relay tokens from Cloudflare.",
56
+ fields: [
57
+ this.field({
58
+ type: "text",
59
+ key: "accountId",
60
+ label: "Account ID",
61
+ description: "Your Cloudflare account ID (found in the Cloudflare dashboard URL)",
62
+ placeholder: "a1b2c3d4e5f6...",
63
+ required: true
64
+ }),
65
+ this.field({
66
+ type: "password",
67
+ key: "apiToken",
68
+ label: "API Token",
69
+ description: "Cloudflare API token with Calls: Read permission",
70
+ showToggle: true,
71
+ required: true
72
+ })
73
+ ]
74
+ }
75
+ ]
76
+ });
77
+ }
78
+ };
79
+
80
+ export {
81
+ CloudflareTurnService,
82
+ CloudflareTurnAddon
83
+ };
84
+ //# sourceMappingURL=chunk-RRRS5VHF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cloudflare-turn.addon.ts","../src/cloudflare-turn.ts"],"sourcesContent":["import type { ProviderRegistration } from '@camstack/types'\nimport { BaseAddon, turnProviderCapability } from '@camstack/types'\nimport { CloudflareTurnService } from './cloudflare-turn'\nimport type { CloudflareTurnConfig } from './cloudflare-turn'\n\n/**\n * Settings redesign Phase 3: cloudflare-turn is node-level credentials\n * storage. Implements `getGlobalSettings`.\n */\nexport class CloudflareTurnAddon extends BaseAddon<CloudflareTurnConfig> {\n private service: CloudflareTurnService | null = null\n\n constructor() {\n super({ apiToken: '', accountId: '' })\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n this.service = new CloudflareTurnService(this.config, this.ctx.logger)\n this.ctx.logger.info('Cloudflare TURN initialized')\n return [{ capability: turnProviderCapability, provider: this.service }]\n }\n\n protected async onShutdown(): 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 protected globalSettingsSchema() {\n return this.schema({\n sections: [\n {\n id: 'credentials',\n title: 'Cloudflare Credentials',\n description: 'API credentials for fetching TURN relay tokens from Cloudflare.',\n fields: [\n this.field({\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 this.field({\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","import type { IScopedLogger } from '@camstack/types'\n\nexport interface CloudflareTurnConfig {\n readonly apiToken: string\n readonly accountId: string\n}\n\ntype TurnServer = { urls: string | string[]; username?: string; credential?: string }\n\n/**\n * Cloudflare TURN/STUN provider.\n *\n * Implements the `turn-provider` capability (system collection). Called\n * by the `webrtc` capability implementations when building ICE server\n * lists for a new peer connection. Each call SHOULD fetch fresh\n * short-lived credentials — currently stubbed with static values until\n * the Cloudflare Calls API integration is wired.\n */\nexport class CloudflareTurnService {\n readonly id = 'cloudflare-turn'\n readonly name = 'Cloudflare TURN'\n\n constructor(\n _config: CloudflareTurnConfig,\n private readonly logger: IScopedLogger,\n ) {}\n\n /**\n * Return the current TURN/STUN server list with credentials.\n * Implements `turn-provider` capability.\n */\n getTurnServers(): readonly TurnServer[] {\n this.logger.debug('Fetching TURN servers from Cloudflare')\n // TODO: implement real Cloudflare TURN integration.\n // Real integration requires a Cloudflare Calls API call using this.apiToken/accountId.\n return [\n {\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 },\n ]\n }\n}\n"],"mappings":";AACA,SAAS,WAAW,8BAA8B;;;ACiB3C,IAAM,wBAAN,MAA4B;AAAA,EAIjC,YACE,SACiB,QACjB;AADiB;AAAA,EAChB;AAAA,EADgB;AAAA,EALV,KAAK;AAAA,EACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhB,iBAAwC;AACtC,SAAK,OAAO,MAAM,uCAAuC;AAGzD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;;;ADrCO,IAAM,sBAAN,cAAkC,UAAgC;AAAA,EAC/D,UAAwC;AAAA,EAEhD,cAAc;AACZ,UAAM,EAAE,UAAU,IAAI,WAAW,GAAG,CAAC;AAAA,EACvC;AAAA,EAEA,MAAgB,eAAgD;AAC9D,SAAK,UAAU,IAAI,sBAAsB,KAAK,QAAQ,KAAK,IAAI,MAAM;AACrE,SAAK,IAAI,OAAO,KAAK,6BAA6B;AAClD,WAAO,CAAC,EAAE,YAAY,wBAAwB,UAAU,KAAK,QAAQ,CAAC;AAAA,EACxE;AAAA,EAEA,MAAgB,aAA4B;AAC1C,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,aAAoC;AAClC,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,uBAAuB;AAC/B,WAAO,KAAK,OAAO;AAAA,MACjB,UAAU;AAAA,QACR;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAQ;AAAA,YACN,KAAK,MAAM;AAAA,cACT,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,UAAU;AAAA,YACZ,CAAC;AAAA,YACD,KAAK,MAAM;AAAA,cACT,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,34 +1,47 @@
1
- import { IScopedLogger, ICamstackAddon, IConfigurable, AddonManifest, AddonContext, CapabilityProviderMap, ConfigUISchema } from '@camstack/types';
1
+ import * as _camstack_types from '@camstack/types';
2
+ import { IScopedLogger, BaseAddon, ProviderRegistration } from '@camstack/types';
2
3
 
3
4
  interface CloudflareTurnConfig {
4
5
  readonly apiToken: string;
5
6
  readonly accountId: string;
6
7
  }
7
- interface TurnCredentials {
8
- readonly urls: readonly string[];
9
- readonly username: string;
10
- readonly credential: string;
11
- readonly ttl: number;
12
- }
8
+ type TurnServer = {
9
+ urls: string | string[];
10
+ username?: string;
11
+ credential?: string;
12
+ };
13
+ /**
14
+ * Cloudflare TURN/STUN provider.
15
+ *
16
+ * Implements the `turn-provider` capability (system collection). Called
17
+ * by the `webrtc` capability implementations when building ICE server
18
+ * lists for a new peer connection. Each call SHOULD fetch fresh
19
+ * short-lived credentials — currently stubbed with static values until
20
+ * the Cloudflare Calls API integration is wired.
21
+ */
13
22
  declare class CloudflareTurnService {
14
- private readonly config;
15
23
  private readonly logger;
16
- constructor(config: CloudflareTurnConfig, logger: IScopedLogger);
17
- /** Get temporary TURN credentials from Cloudflare API */
18
- getCredentials(): Promise<TurnCredentials>;
24
+ readonly id = "cloudflare-turn";
25
+ readonly name = "Cloudflare TURN";
26
+ constructor(_config: CloudflareTurnConfig, logger: IScopedLogger);
27
+ /**
28
+ * Return the current TURN/STUN server list with credentials.
29
+ * Implements `turn-provider` capability.
30
+ */
31
+ getTurnServers(): readonly TurnServer[];
19
32
  }
20
33
 
21
- declare class CloudflareTurnAddon implements ICamstackAddon, IConfigurable {
22
- readonly manifest: AddonManifest;
34
+ /**
35
+ * Settings redesign Phase 3: cloudflare-turn is node-level credentials
36
+ * storage. Implements `getGlobalSettings`.
37
+ */
38
+ declare class CloudflareTurnAddon extends BaseAddon<CloudflareTurnConfig> {
23
39
  private service;
24
- private currentConfig;
25
- initialize(context: AddonContext): Promise<void>;
26
- shutdown(): Promise<void>;
40
+ constructor();
41
+ protected onInitialize(): Promise<ProviderRegistration[]>;
42
+ protected onShutdown(): Promise<void>;
27
43
  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>;
44
+ protected globalSettingsSchema(): _camstack_types.ConfigUISchema;
32
45
  }
33
46
 
34
- export { type CloudflareTurnConfig as C, CloudflareTurnAddon, type TurnCredentials as T, CloudflareTurnService as a };
47
+ export { type CloudflareTurnConfig as C, CloudflareTurnAddon, CloudflareTurnService as a };
@@ -1,34 +1,47 @@
1
- import { IScopedLogger, ICamstackAddon, IConfigurable, AddonManifest, AddonContext, CapabilityProviderMap, ConfigUISchema } from '@camstack/types';
1
+ import * as _camstack_types from '@camstack/types';
2
+ import { IScopedLogger, BaseAddon, ProviderRegistration } from '@camstack/types';
2
3
 
3
4
  interface CloudflareTurnConfig {
4
5
  readonly apiToken: string;
5
6
  readonly accountId: string;
6
7
  }
7
- interface TurnCredentials {
8
- readonly urls: readonly string[];
9
- readonly username: string;
10
- readonly credential: string;
11
- readonly ttl: number;
12
- }
8
+ type TurnServer = {
9
+ urls: string | string[];
10
+ username?: string;
11
+ credential?: string;
12
+ };
13
+ /**
14
+ * Cloudflare TURN/STUN provider.
15
+ *
16
+ * Implements the `turn-provider` capability (system collection). Called
17
+ * by the `webrtc` capability implementations when building ICE server
18
+ * lists for a new peer connection. Each call SHOULD fetch fresh
19
+ * short-lived credentials — currently stubbed with static values until
20
+ * the Cloudflare Calls API integration is wired.
21
+ */
13
22
  declare class CloudflareTurnService {
14
- private readonly config;
15
23
  private readonly logger;
16
- constructor(config: CloudflareTurnConfig, logger: IScopedLogger);
17
- /** Get temporary TURN credentials from Cloudflare API */
18
- getCredentials(): Promise<TurnCredentials>;
24
+ readonly id = "cloudflare-turn";
25
+ readonly name = "Cloudflare TURN";
26
+ constructor(_config: CloudflareTurnConfig, logger: IScopedLogger);
27
+ /**
28
+ * Return the current TURN/STUN server list with credentials.
29
+ * Implements `turn-provider` capability.
30
+ */
31
+ getTurnServers(): readonly TurnServer[];
19
32
  }
20
33
 
21
- declare class CloudflareTurnAddon implements ICamstackAddon, IConfigurable {
22
- readonly manifest: AddonManifest;
34
+ /**
35
+ * Settings redesign Phase 3: cloudflare-turn is node-level credentials
36
+ * storage. Implements `getGlobalSettings`.
37
+ */
38
+ declare class CloudflareTurnAddon extends BaseAddon<CloudflareTurnConfig> {
23
39
  private service;
24
- private currentConfig;
25
- initialize(context: AddonContext): Promise<void>;
26
- shutdown(): Promise<void>;
40
+ constructor();
41
+ protected onInitialize(): Promise<ProviderRegistration[]>;
42
+ protected onShutdown(): Promise<void>;
27
43
  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>;
44
+ protected globalSettingsSchema(): _camstack_types.ConfigUISchema;
32
45
  }
33
46
 
34
- export { type CloudflareTurnConfig as C, CloudflareTurnAddon, type TurnCredentials as T, CloudflareTurnService as a };
47
+ export { type CloudflareTurnConfig as C, CloudflareTurnAddon, CloudflareTurnService as a };
@@ -23,99 +23,81 @@ __export(cloudflare_turn_addon_exports, {
23
23
  CloudflareTurnAddon: () => CloudflareTurnAddon
24
24
  });
25
25
  module.exports = __toCommonJS(cloudflare_turn_addon_exports);
26
+ var import_types = require("@camstack/types");
26
27
 
27
28
  // src/cloudflare-turn.ts
28
29
  var CloudflareTurnService = class {
29
- constructor(config, logger) {
30
- this.config = config;
30
+ constructor(_config, logger) {
31
31
  this.logger = logger;
32
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
- };
33
+ logger;
34
+ id = "cloudflare-turn";
35
+ name = "Cloudflare TURN";
36
+ /**
37
+ * Return the current TURN/STUN server list with credentials.
38
+ * Implements `turn-provider` capability.
39
+ */
40
+ getTurnServers() {
41
+ this.logger.debug("Fetching TURN servers from Cloudflare");
42
+ return [
43
+ {
44
+ urls: [
45
+ "turn:turn.cloudflare.com:3478?transport=udp",
46
+ "turn:turn.cloudflare.com:3478?transport=tcp"
47
+ ],
48
+ username: "temp-user",
49
+ credential: "temp-credential"
50
+ }
51
+ ];
45
52
  }
46
53
  };
47
54
 
48
55
  // 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
+ var CloudflareTurnAddon = class extends import_types.BaseAddon {
56
57
  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");
58
+ constructor() {
59
+ super({ apiToken: "", accountId: "" });
68
60
  }
69
- async shutdown() {
61
+ async onInitialize() {
62
+ this.service = new CloudflareTurnService(this.config, this.ctx.logger);
63
+ this.ctx.logger.info("Cloudflare TURN initialized");
64
+ return [{ capability: import_types.turnProviderCapability, provider: this.service }];
65
+ }
66
+ async onShutdown() {
70
67
  this.service = null;
71
68
  }
72
69
  getService() {
73
70
  if (!this.service) throw new Error("Cloudflare TURN not initialized");
74
71
  return this.service;
75
72
  }
76
- getCapabilityProvider(name) {
77
- if (name === "turn-provider" && this.service) {
78
- return this.service;
79
- }
80
- return null;
81
- }
82
- getConfigSchema() {
83
- return {
73
+ globalSettingsSchema() {
74
+ return this.schema({
84
75
  sections: [
85
76
  {
86
77
  id: "credentials",
87
78
  title: "Cloudflare Credentials",
88
79
  description: "API credentials for fetching TURN relay tokens from Cloudflare.",
89
80
  fields: [
90
- {
81
+ this.field({
91
82
  type: "text",
92
83
  key: "accountId",
93
84
  label: "Account ID",
94
85
  description: "Your Cloudflare account ID (found in the Cloudflare dashboard URL)",
95
86
  placeholder: "a1b2c3d4e5f6...",
96
87
  required: true
97
- },
98
- {
88
+ }),
89
+ this.field({
99
90
  type: "password",
100
91
  key: "apiToken",
101
92
  label: "API Token",
102
93
  description: "Cloudflare API token with Calls: Read permission",
103
94
  showToggle: true,
104
95
  required: true
105
- }
96
+ })
106
97
  ]
107
98
  }
108
99
  ]
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
- };
100
+ });
119
101
  }
120
102
  };
121
103
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../src/cloudflare-turn.addon.ts","../src/cloudflare-turn.ts"],"sourcesContent":["import type { ProviderRegistration } from '@camstack/types'\nimport { BaseAddon, turnProviderCapability } from '@camstack/types'\nimport { CloudflareTurnService } from './cloudflare-turn'\nimport type { CloudflareTurnConfig } from './cloudflare-turn'\n\n/**\n * Settings redesign Phase 3: cloudflare-turn is node-level credentials\n * storage. Implements `getGlobalSettings`.\n */\nexport class CloudflareTurnAddon extends BaseAddon<CloudflareTurnConfig> {\n private service: CloudflareTurnService | null = null\n\n constructor() {\n super({ apiToken: '', accountId: '' })\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n this.service = new CloudflareTurnService(this.config, this.ctx.logger)\n this.ctx.logger.info('Cloudflare TURN initialized')\n return [{ capability: turnProviderCapability, provider: this.service }]\n }\n\n protected async onShutdown(): 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 protected globalSettingsSchema() {\n return this.schema({\n sections: [\n {\n id: 'credentials',\n title: 'Cloudflare Credentials',\n description: 'API credentials for fetching TURN relay tokens from Cloudflare.',\n fields: [\n this.field({\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 this.field({\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","import type { IScopedLogger } from '@camstack/types'\n\nexport interface CloudflareTurnConfig {\n readonly apiToken: string\n readonly accountId: string\n}\n\ntype TurnServer = { urls: string | string[]; username?: string; credential?: string }\n\n/**\n * Cloudflare TURN/STUN provider.\n *\n * Implements the `turn-provider` capability (system collection). Called\n * by the `webrtc` capability implementations when building ICE server\n * lists for a new peer connection. Each call SHOULD fetch fresh\n * short-lived credentials — currently stubbed with static values until\n * the Cloudflare Calls API integration is wired.\n */\nexport class CloudflareTurnService {\n readonly id = 'cloudflare-turn'\n readonly name = 'Cloudflare TURN'\n\n constructor(\n _config: CloudflareTurnConfig,\n private readonly logger: IScopedLogger,\n ) {}\n\n /**\n * Return the current TURN/STUN server list with credentials.\n * Implements `turn-provider` capability.\n */\n getTurnServers(): readonly TurnServer[] {\n this.logger.debug('Fetching TURN servers from Cloudflare')\n // TODO: implement real Cloudflare TURN integration.\n // Real integration requires a Cloudflare Calls API call using this.apiToken/accountId.\n return [\n {\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 },\n ]\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAkD;;;ACiB3C,IAAM,wBAAN,MAA4B;AAAA,EAIjC,YACE,SACiB,QACjB;AADiB;AAAA,EAChB;AAAA,EADgB;AAAA,EALV,KAAK;AAAA,EACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhB,iBAAwC;AACtC,SAAK,OAAO,MAAM,uCAAuC;AAGzD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;;;ADrCO,IAAM,sBAAN,cAAkC,uBAAgC;AAAA,EAC/D,UAAwC;AAAA,EAEhD,cAAc;AACZ,UAAM,EAAE,UAAU,IAAI,WAAW,GAAG,CAAC;AAAA,EACvC;AAAA,EAEA,MAAgB,eAAgD;AAC9D,SAAK,UAAU,IAAI,sBAAsB,KAAK,QAAQ,KAAK,IAAI,MAAM;AACrE,SAAK,IAAI,OAAO,KAAK,6BAA6B;AAClD,WAAO,CAAC,EAAE,YAAY,qCAAwB,UAAU,KAAK,QAAQ,CAAC;AAAA,EACxE;AAAA,EAEA,MAAgB,aAA4B;AAC1C,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,aAAoC;AAClC,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,uBAAuB;AAC/B,WAAO,KAAK,OAAO;AAAA,MACjB,UAAU;AAAA,QACR;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAQ;AAAA,YACN,KAAK,MAAM;AAAA,cACT,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,UAAU;AAAA,YACZ,CAAC;AAAA,YACD,KAAK,MAAM;AAAA,cACT,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CloudflareTurnAddon
3
- } from "./chunk-V6KRQ44N.mjs";
3
+ } from "./chunk-RRRS5VHF.mjs";
4
4
  export {
5
5
  CloudflareTurnAddon
6
6
  };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { CloudflareTurnAddon, C as CloudflareTurnConfig, a as CloudflareTurnService, T as TurnCredentials } from './cloudflare-turn.addon.mjs';
1
+ export { CloudflareTurnAddon, C as CloudflareTurnConfig, a as CloudflareTurnService } from './cloudflare-turn.addon.mjs';
2
2
  import '@camstack/types';
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { CloudflareTurnAddon, C as CloudflareTurnConfig, a as CloudflareTurnService, T as TurnCredentials } from './cloudflare-turn.addon.js';
1
+ export { CloudflareTurnAddon, C as CloudflareTurnConfig, a as CloudflareTurnService } from './cloudflare-turn.addon.js';
2
2
  import '@camstack/types';
package/dist/index.js CHANGED
@@ -27,96 +27,78 @@ module.exports = __toCommonJS(index_exports);
27
27
 
28
28
  // src/cloudflare-turn.ts
29
29
  var CloudflareTurnService = class {
30
- constructor(config, logger) {
31
- this.config = config;
30
+ constructor(_config, logger) {
32
31
  this.logger = logger;
33
32
  }
34
- /** Get temporary TURN credentials from Cloudflare API */
35
- async getCredentials() {
36
- this.logger.debug("Fetching TURN credentials from Cloudflare");
37
- return {
38
- urls: [
39
- "turn:turn.cloudflare.com:3478?transport=udp",
40
- "turn:turn.cloudflare.com:3478?transport=tcp"
41
- ],
42
- username: "temp-user",
43
- credential: "temp-credential",
44
- ttl: 86400
45
- };
33
+ logger;
34
+ id = "cloudflare-turn";
35
+ name = "Cloudflare TURN";
36
+ /**
37
+ * Return the current TURN/STUN server list with credentials.
38
+ * Implements `turn-provider` capability.
39
+ */
40
+ getTurnServers() {
41
+ this.logger.debug("Fetching TURN servers from Cloudflare");
42
+ return [
43
+ {
44
+ urls: [
45
+ "turn:turn.cloudflare.com:3478?transport=udp",
46
+ "turn:turn.cloudflare.com:3478?transport=tcp"
47
+ ],
48
+ username: "temp-user",
49
+ credential: "temp-credential"
50
+ }
51
+ ];
46
52
  }
47
53
  };
48
54
 
49
55
  // src/cloudflare-turn.addon.ts
50
- var CloudflareTurnAddon = class {
51
- manifest = {
52
- id: "cloudflare-turn",
53
- name: "Cloudflare TURN Relay",
54
- version: "1.0.0",
55
- capabilities: ["turn-provider"]
56
- };
56
+ var import_types = require("@camstack/types");
57
+ var CloudflareTurnAddon = class extends import_types.BaseAddon {
57
58
  service = null;
58
- currentConfig = {
59
- apiToken: "",
60
- accountId: ""
61
- };
62
- async initialize(context) {
63
- this.currentConfig = {
64
- apiToken: context.addonConfig.apiToken ?? this.currentConfig.apiToken,
65
- accountId: context.addonConfig.accountId ?? this.currentConfig.accountId
66
- };
67
- this.service = new CloudflareTurnService(this.currentConfig, context.logger);
68
- context.logger.info("Cloudflare TURN initialized");
59
+ constructor() {
60
+ super({ apiToken: "", accountId: "" });
69
61
  }
70
- async shutdown() {
62
+ async onInitialize() {
63
+ this.service = new CloudflareTurnService(this.config, this.ctx.logger);
64
+ this.ctx.logger.info("Cloudflare TURN initialized");
65
+ return [{ capability: import_types.turnProviderCapability, provider: this.service }];
66
+ }
67
+ async onShutdown() {
71
68
  this.service = null;
72
69
  }
73
70
  getService() {
74
71
  if (!this.service) throw new Error("Cloudflare TURN not initialized");
75
72
  return this.service;
76
73
  }
77
- getCapabilityProvider(name) {
78
- if (name === "turn-provider" && this.service) {
79
- return this.service;
80
- }
81
- return null;
82
- }
83
- getConfigSchema() {
84
- return {
74
+ globalSettingsSchema() {
75
+ return this.schema({
85
76
  sections: [
86
77
  {
87
78
  id: "credentials",
88
79
  title: "Cloudflare Credentials",
89
80
  description: "API credentials for fetching TURN relay tokens from Cloudflare.",
90
81
  fields: [
91
- {
82
+ this.field({
92
83
  type: "text",
93
84
  key: "accountId",
94
85
  label: "Account ID",
95
86
  description: "Your Cloudflare account ID (found in the Cloudflare dashboard URL)",
96
87
  placeholder: "a1b2c3d4e5f6...",
97
88
  required: true
98
- },
99
- {
89
+ }),
90
+ this.field({
100
91
  type: "password",
101
92
  key: "apiToken",
102
93
  label: "API Token",
103
94
  description: "Cloudflare API token with Calls: Read permission",
104
95
  showToggle: true,
105
96
  required: true
106
- }
97
+ })
107
98
  ]
108
99
  }
109
100
  ]
110
- };
111
- }
112
- getConfig() {
113
- return { accountId: this.currentConfig.accountId, apiToken: this.currentConfig.apiToken };
114
- }
115
- async onConfigChange(config) {
116
- this.currentConfig = {
117
- apiToken: config.apiToken ?? this.currentConfig.apiToken,
118
- accountId: config.accountId ?? this.currentConfig.accountId
119
- };
101
+ });
120
102
  }
121
103
  };
122
104
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cloudflare-turn.ts","../src/cloudflare-turn.addon.ts"],"sourcesContent":["export { CloudflareTurnService } from './cloudflare-turn'\nexport type { CloudflareTurnConfig, TurnCredentials } from './cloudflare-turn'\nexport { CloudflareTurnAddon } from './cloudflare-turn.addon'\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","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":";;;;;;;;;;;;;;;;;;;;AAAA;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;;;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":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cloudflare-turn.ts","../src/cloudflare-turn.addon.ts"],"sourcesContent":["export { CloudflareTurnService } from './cloudflare-turn'\nexport type { CloudflareTurnConfig } from './cloudflare-turn'\nexport { CloudflareTurnAddon } from './cloudflare-turn.addon'\n","import type { IScopedLogger } from '@camstack/types'\n\nexport interface CloudflareTurnConfig {\n readonly apiToken: string\n readonly accountId: string\n}\n\ntype TurnServer = { urls: string | string[]; username?: string; credential?: string }\n\n/**\n * Cloudflare TURN/STUN provider.\n *\n * Implements the `turn-provider` capability (system collection). Called\n * by the `webrtc` capability implementations when building ICE server\n * lists for a new peer connection. Each call SHOULD fetch fresh\n * short-lived credentials — currently stubbed with static values until\n * the Cloudflare Calls API integration is wired.\n */\nexport class CloudflareTurnService {\n readonly id = 'cloudflare-turn'\n readonly name = 'Cloudflare TURN'\n\n constructor(\n _config: CloudflareTurnConfig,\n private readonly logger: IScopedLogger,\n ) {}\n\n /**\n * Return the current TURN/STUN server list with credentials.\n * Implements `turn-provider` capability.\n */\n getTurnServers(): readonly TurnServer[] {\n this.logger.debug('Fetching TURN servers from Cloudflare')\n // TODO: implement real Cloudflare TURN integration.\n // Real integration requires a Cloudflare Calls API call using this.apiToken/accountId.\n return [\n {\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 },\n ]\n }\n}\n","import type { ProviderRegistration } from '@camstack/types'\nimport { BaseAddon, turnProviderCapability } from '@camstack/types'\nimport { CloudflareTurnService } from './cloudflare-turn'\nimport type { CloudflareTurnConfig } from './cloudflare-turn'\n\n/**\n * Settings redesign Phase 3: cloudflare-turn is node-level credentials\n * storage. Implements `getGlobalSettings`.\n */\nexport class CloudflareTurnAddon extends BaseAddon<CloudflareTurnConfig> {\n private service: CloudflareTurnService | null = null\n\n constructor() {\n super({ apiToken: '', accountId: '' })\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n this.service = new CloudflareTurnService(this.config, this.ctx.logger)\n this.ctx.logger.info('Cloudflare TURN initialized')\n return [{ capability: turnProviderCapability, provider: this.service }]\n }\n\n protected async onShutdown(): 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 protected globalSettingsSchema() {\n return this.schema({\n sections: [\n {\n id: 'credentials',\n title: 'Cloudflare Credentials',\n description: 'API credentials for fetching TURN relay tokens from Cloudflare.',\n fields: [\n this.field({\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 this.field({\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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACkBO,IAAM,wBAAN,MAA4B;AAAA,EAIjC,YACE,SACiB,QACjB;AADiB;AAAA,EAChB;AAAA,EADgB;AAAA,EALV,KAAK;AAAA,EACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhB,iBAAwC;AACtC,SAAK,OAAO,MAAM,uCAAuC;AAGzD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;;;AC7CA,mBAAkD;AAQ3C,IAAM,sBAAN,cAAkC,uBAAgC;AAAA,EAC/D,UAAwC;AAAA,EAEhD,cAAc;AACZ,UAAM,EAAE,UAAU,IAAI,WAAW,GAAG,CAAC;AAAA,EACvC;AAAA,EAEA,MAAgB,eAAgD;AAC9D,SAAK,UAAU,IAAI,sBAAsB,KAAK,QAAQ,KAAK,IAAI,MAAM;AACrE,SAAK,IAAI,OAAO,KAAK,6BAA6B;AAClD,WAAO,CAAC,EAAE,YAAY,qCAAwB,UAAU,KAAK,QAAQ,CAAC;AAAA,EACxE;AAAA,EAEA,MAAgB,aAA4B;AAC1C,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,aAAoC;AAClC,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,uBAAuB;AAC/B,WAAO,KAAK,OAAO;AAAA,MACjB,UAAU;AAAA,QACR;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAQ;AAAA,YACN,KAAK,MAAM;AAAA,cACT,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,aAAa;AAAA,cACb,UAAU;AAAA,YACZ,CAAC;AAAA,YACD,KAAK,MAAM;AAAA,cACT,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CloudflareTurnAddon,
3
3
  CloudflareTurnService
4
- } from "./chunk-V6KRQ44N.mjs";
4
+ } from "./chunk-RRRS5VHF.mjs";
5
5
  export {
6
6
  CloudflareTurnAddon,
7
7
  CloudflareTurnService
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-cloudflare-turn",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "Cloudflare TURN relay addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",
@@ -32,12 +32,16 @@
32
32
  "addons": [
33
33
  {
34
34
  "id": "cloudflare-turn",
35
+ "name": "Cloudflare TURN Relay",
36
+ "version": "1.0.0",
35
37
  "entry": "./dist/cloudflare-turn.addon.js",
36
- "slot": null,
38
+ "execution": {
39
+ "placement": "any-node",
40
+ "group": "cloudflare-turn"
41
+ },
37
42
  "capabilities": [
38
43
  {
39
- "name": "turn-provider",
40
- "mode": "collection"
44
+ "name": "turn-provider"
41
45
  }
42
46
  ]
43
47
  }
@@ -1,100 +0,0 @@
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
@@ -1 +0,0 @@
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":[]}