-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathworker.js
118 lines (99 loc) · 3.1 KB
/
worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
const { TwilioClientCommand } = require('@twilio/cli-core').baseCommands;
const globalFlags = require('../../../helpers/globalFlags.js');
const { taskrouterFlags } = require('../../../helpers/taskrouterGlobals.js');
const { validateSid } = require('../../../helpers/validation-helpers.js');
const taskrouter = require('twilio').jwt.taskrouter;
const util = taskrouter.util;
const TaskRouterCapability = taskrouter.TaskRouterCapability;
const Policy = TaskRouterCapability.Policy;
class WorkerCapabilityTokenGenerator extends TwilioClientCommand {
constructor(argv, config) {
super(argv, config);
this.showHeaders = true;
}
async run() {
await super.run();
const workerSid = await this.flags['worker-sid'];
const workspaceSid = await this.flags['workspace-sid'];
const ttl = await this.flags.ttl;
const TASKROUTER_BASE_URL = 'https://taskrouter.twilio.com';
const version = 'v1';
if (!validateSid('WK', workerSid)) {
this.logger.error(
'Invalid Worker SID, must look like WKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
);
process.exit(1);
}
if (!validateSid('WS', workspaceSid)) {
this.logger.error(
'Invalid Workspace SID, must look like WSxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
);
process.exit(1);
}
const accountSid = this.twilioClient.accountSid;
const authToken = this.twilioClient.password;
const capability = new TaskRouterCapability({
accountSid,
authToken,
workspaceSid,
channelId: workerSid,
ttl,
});
// Helper function to create Policy
function buildWorkspacePolicy(options) {
const internalOptions = options || {};
const resources = internalOptions.resources || [];
const urlComponents = [
TASKROUTER_BASE_URL,
version,
'Workspaces',
workspaceSid,
];
return new Policy({
url: urlComponents.concat(resources).join('/'),
method: internalOptions.method || 'GET',
allow: true,
});
}
// Event Bridge Policies
const eventBridgePolicies = util.defaultEventBridgePolicies(
accountSid,
workerSid,
);
// Worker Policies
const workerPolicies = util.defaultWorkerPolicies(
version,
workspaceSid,
workerSid,
);
const workspacePolicies = [
// Workspace fetch Policy
buildWorkspacePolicy(),
// Workspace subresources fetch Policy
buildWorkspacePolicy({ resources: ['**'] }),
// Workspace Activities Update Policy
buildWorkspacePolicy({ resources: ['Activities'], method: 'POST' }),
// Workspace Activities Worker Reserations Policy
buildWorkspacePolicy({
resources: ['Workers', workerSid, 'Reservations', '**'],
method: 'POST',
}),
];
eventBridgePolicies.concat(workerPolicies).concat(workspacePolicies);
for (const policy of eventBridgePolicies) {
capability.addPolicy(policy);
}
this.logger.info('Copy/paste this video token into your test application:');
this.output({ jwt: capability.toJwt() }, undefined, {
showHeaders: false,
});
}
}
const globals = { ...globalFlags };
delete globals.identity;
WorkerCapabilityTokenGenerator.flags = Object.assign(
taskrouterFlags,
TwilioClientCommand.flags,
globals,
);
module.exports = WorkerCapabilityTokenGenerator;