@azure-rest/communication-job-router 1.1.0-alpha.20250122.7 → 1.1.0-alpha.20250129.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 (2) hide show
  1. package/README.md +125 -92
  2. package/package.json +7 -7
package/README.md CHANGED
@@ -82,8 +82,8 @@ In the `RouterQuickStart` folder, install the ACS Job Router SDK by executing `n
82
82
 
83
83
  First we need to construct an `AzureCommunicationRoutingServiceClient`.
84
84
 
85
- ```js
86
- const JobRouterClient = require("@azure-rest/communication-job-router").default;
85
+ ```ts snippet:ReadmeSampleCreateClient
86
+ import JobRouterClient from "@azure-rest/communication-job-router";
87
87
 
88
88
  const connectionString =
89
89
  "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
@@ -94,20 +94,27 @@ const routerClient = JobRouterClient(connectionString);
94
94
 
95
95
  This policy determines which workers will receive job offers as jobs are distributed off their queues.
96
96
 
97
- ```js
98
- const distributionPolicyId = "distribution-policy-id-1";
99
- const distributionPolicy = await routerClient
100
- .path("/routing/distributionPolicies/{id}", distributionPolicyId)
97
+ ```ts snippet:ReadmeSampleCreateDistributionPolicy
98
+ import JobRouterClient from "@azure-rest/communication-job-router";
99
+
100
+ const connectionString =
101
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
102
+ const routerClient = JobRouterClient(connectionString);
103
+
104
+ const id = "distribution-policy-123";
105
+ const result = await routerClient
106
+ .path("/routing/distributionPolicies/{distributionPolicyId}", id)
101
107
  .patch({
102
108
  contentType: "application/merge-patch+json",
103
109
  body: {
104
- name: "Default Distribution Policy",
105
- offerExpiresAfterSeconds: 30,
110
+ name: "distribution-policy-123",
106
111
  mode: {
107
112
  kind: "longestIdle",
108
113
  minConcurrentOffers: 1,
109
- maxConcurrentOffers: 3,
114
+ maxConcurrentOffers: 5,
115
+ bypassSelectors: false,
110
116
  },
117
+ offerExpiresAfterSeconds: 120,
111
118
  },
112
119
  });
113
120
  ```
@@ -116,14 +123,20 @@ const distributionPolicy = await routerClient
116
123
 
117
124
  This queue offers jobs to workers according to our previously created distribution policy.
118
125
 
119
- ```js
120
- const salesQueueId = "sales-queue-id-1";
121
- const salesQueue = await routerClient.path("/routing/queues/{id}", salesQueueId).patch({
126
+ ```ts snippet:ReadmeSampleCreateQueue
127
+ import JobRouterClient from "@azure-rest/communication-job-router";
128
+
129
+ const connectionString =
130
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
131
+ const routerClient = JobRouterClient(connectionString);
132
+
133
+ const distributionPolicyId = "distribution-policy-123";
134
+ const queueId = "queue-123";
135
+ const result = await routerClient.path("/routing/queues/{queueId}", queueId).patch({
122
136
  contentType: "application/merge-patch+json",
123
137
  body: {
124
138
  distributionPolicyId: distributionPolicyId,
125
139
  name: "Main",
126
- labels: {},
127
140
  },
128
141
  });
129
142
  ```
@@ -135,44 +148,20 @@ These workers are assigned to our previously created "Sales" queue and have some
135
148
  - setting `availableForOffers` to `true` means these workers are ready to accept job offers.
136
149
  - refer to our [labels documentation](https://learn.microsoft.com/azure/communication-services/concepts/router/concepts#labels) to better understand labels and label selectors.
137
150
 
138
- ```js
139
- // Create worker "Alice".
140
- const workerAliceId = "773accfb-476e-42f9-a202-b211b41a4ea4";
141
- const workerAlice = await routerClient.path("/routing/workers/{id}", workerAliceId).patch({
142
- contentType: "application/merge-patch+json",
143
- body: {
144
- capacity: 120,
145
- queues: [salesQueueId],
146
- labels: {
147
- Xbox: 5,
148
- german: 4,
149
- name: "Alice",
150
- },
151
- channels: [
152
- {
153
- channelId: "CustomChatChannel",
154
- capacityCostPerJob: 10,
155
- },
156
- {
157
- channelId: "CustomVoiceChannel",
158
- capacityCostPerJob: 100,
159
- },
160
- ],
161
- },
162
- });
151
+ ```ts snippet:ReadmeSampleCreateWorkers
152
+ import JobRouterClient from "@azure-rest/communication-job-router";
163
153
 
164
- // Create worker "Bob".
165
- const workerBobId = "21837c88-6967-4078-86b9-1207821a8392";
166
- const workerBob = await routerClient.path("/routing/workers/{id}", workerBobId).patch({
154
+ const connectionString =
155
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
156
+ const routerClient = JobRouterClient(connectionString);
157
+
158
+ const id = "router-worker-123";
159
+ const result = await routerClient.path("/routing/workers/{workerId}", id).patch({
167
160
  contentType: "application/merge-patch+json",
168
161
  body: {
169
162
  capacity: 100,
170
- queues: [salesQueueId],
171
- labels: {
172
- Xbox: 5,
173
- english: 3,
174
- name: "Alice",
175
- },
163
+ queues: ["MainQueue", "SecondaryQueue"],
164
+ labels: {},
176
165
  channels: [
177
166
  {
178
167
  channelId: "CustomChatChannel",
@@ -193,17 +182,24 @@ Refer to our [job lifecycle documentation](https://learn.microsoft.com/azure/com
193
182
 
194
183
  ### Create a Job
195
184
 
196
- This job is enqueued on our previously created "Sales" queue.
185
+ We can create a job with the following:
197
186
 
198
- ```js
187
+ ```ts snippet:ReadmeSampleCreateJob
188
+ import JobRouterClient from "@azure-rest/communication-job-router";
189
+
190
+ const connectionString =
191
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
192
+ const routerClient = JobRouterClient(connectionString);
193
+
194
+ const queueId = "queue-123";
199
195
  const jobId = "router-job-123";
200
- const result = await routerClient.path("/routing/jobs/{id}", jobId).patch({
196
+ const result = await routerClient.path("/routing/jobs/{jobId}", jobId).patch({
201
197
  contentType: "application/merge-patch+json",
202
198
  body: {
203
- channelReference: "66e4362e-aad5-4d71-bb51-448672ebf492",
204
- channelId: "voice",
199
+ channelId: "ChatChannel",
200
+ queueId: queueId,
201
+ channelReference: "abc",
205
202
  priority: 2,
206
- queueId: salesQueueId,
207
203
  labels: {},
208
204
  },
209
205
  });
@@ -215,31 +211,40 @@ const result = await routerClient.path("/routing/jobs/{id}", jobId).patch({
215
211
 
216
212
  This policy classifies jobs upon creation.
217
213
 
218
- ```js
219
- const classificationPolicyId = "classification-policy-1";
220
- const classificationPolicy = await routerClient
221
- .path("/routing/classificationPolicies/{id}", classificationPolicyId)
214
+ ```ts snippet:ReadmeSampleCreateClassificationPolicy
215
+ import JobRouterClient from "@azure-rest/communication-job-router";
216
+
217
+ const connectionString =
218
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
219
+ const routerClient = JobRouterClient(connectionString);
220
+
221
+ const classificationPolicyId = "classification-policy-123";
222
+
223
+ const result = await routerClient
224
+ .path("/routing/classificationPolicies/{classificationPolicyId}", classificationPolicyId)
222
225
  .patch({
223
226
  contentType: "application/merge-patch+json",
224
227
  body: {
225
- name: "Default Classification Policy",
226
- fallbackQueueId: salesQueueId,
228
+ name: "test-policy",
229
+ fallbackQueueId: "queue-123",
227
230
  queueSelectorAttachments: [
228
231
  {
229
- kind: "static",
230
- queueSelector: { key: "department", labelOperator: "equal", value: "xbox" },
231
- },
232
- ],
233
- workerSelectorAttachments: [
234
- {
235
- kind: "static",
236
- workerSelector: { key: "english", labelOperator: "greaterThan", value: 5 },
232
+ kind: "conditional",
233
+ queueSelectors: [
234
+ {
235
+ key: "foo",
236
+ labelOperator: "equal",
237
+ value: { default: 10 },
238
+ },
239
+ ],
240
+ condition: {
241
+ kind: "direct-map-rule",
242
+ },
237
243
  },
238
244
  ],
239
245
  prioritizationRule: {
240
- kind: "expression",
241
- language: "powerFx",
242
- expression: 'If(job.department = "xbox", 2, 1)',
246
+ kind: "static",
247
+ value: { default: 2 },
243
248
  },
244
249
  },
245
250
  });
@@ -252,13 +257,21 @@ const classificationPolicy = await routerClient
252
257
 
253
258
  This job will be classified with our previously created classification policy. It also has a label.
254
259
 
255
- ```js
256
- const job = await routerClient.path("/routing/jobs/{id}", jobId).patch({
260
+ ```ts snippet:ReadmeSampleCreateJobWithClassificationPolicy
261
+ import JobRouterClient from "@azure-rest/communication-job-router";
262
+
263
+ const connectionString =
264
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
265
+ const routerClient = JobRouterClient(connectionString);
266
+
267
+ const jobId = "router-job-123";
268
+ const classificationPolicyId = "classification-policy-123";
269
+ const job = await routerClient.path("/routing/jobs/{jobId}", jobId).patch({
257
270
  contentType: "application/merge-patch+json",
258
271
  body: {
259
272
  channelReference: "66e4362e-aad5-4d71-bb51-448672ebf492",
260
273
  channelId: "voice",
261
- classificationPolicyId: classificationPolicy.body.id,
274
+ classificationPolicyId: classificationPolicyId,
262
275
  labels: {
263
276
  department: "xbox",
264
277
  },
@@ -320,9 +333,7 @@ One way to subscribe to ACS Job Router events is through the Azure Portal.
320
333
 
321
334
  Refer to our ["subscribe to Job Router events" documentation](https://learn.microsoft.com/azure/communication-services/how-tos/router-sdk/subscribe-events) to better understand subscribing to Job Router events.
322
335
 
323
- The route in your NodeJS application that receives events may look something like this:
324
-
325
- ```js
336
+ ```ts snippet:ignore
326
337
  app.post('/event', (req, res) => {
327
338
  req.body.forEach(eventGridEvent => {
328
339
  // Deserialize the event data into the appropriate type
@@ -343,11 +354,21 @@ Once you receive a `RouterWorkerOfferIssued` event you can accept or decline the
343
354
  - `workerId` - Id of the worker accepting or declining the job offer.
344
355
  - `offerId` - Id of the offer being accepted or declined.
345
356
 
346
- ```js
357
+ ```ts snippet:ReadmeSampleAcceptOrDeclineOffer
358
+ import JobRouterClient from "@azure-rest/communication-job-router";
359
+
360
+ const connectionString =
361
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
362
+ const routerClient = JobRouterClient(connectionString);
363
+
364
+ const workerId = "router-worker-123";
365
+ const offerId = "offer-id";
366
+
367
+ // Accept the job offer
347
368
  const acceptResponse = await routerClient
348
369
  .path("/routing/workers/{workerId}/offers/{offerId}:accept", workerId, offerId)
349
370
  .post();
350
- // or
371
+ // or decline the job offer
351
372
  const declineResponse = await routerClient
352
373
  .path("/routing/workers/{workerId}/offers/{offerId}:decline", workerId, offerId)
353
374
  .post();
@@ -357,13 +378,19 @@ const declineResponse = await routerClient
357
378
 
358
379
  The `assignmentId` received from the previous step's response is required to complete the job. Completing the job puts it in the wrap-up phase of its lifecycle.
359
380
 
360
- ```ts
381
+ ```ts snippet:ReadmeSampleCompleteJob
382
+ import JobRouterClient from "@azure-rest/communication-job-router";
383
+
384
+ const connectionString =
385
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
386
+ const routerClient = JobRouterClient(connectionString);
387
+
388
+ const workerId = "router-worker-123";
389
+ const jobId = "job-id";
390
+ const assignmentId = "assignment-id";
391
+
361
392
  const completeJob = await routerClient
362
- .path(
363
- "/routing/jobs/{jobId}/assignments/{assignmentId}:complete",
364
- jobId,
365
- acceptResponse.body.assignmentId,
366
- )
393
+ .path("/routing/jobs/{jobId}/assignments/{assignmentId}:complete", jobId, assignmentId)
367
394
  .post({
368
395
  body: {
369
396
  note: `Job has been completed by ${workerId} at ${new Date()}`,
@@ -375,13 +402,19 @@ const completeJob = await routerClient
375
402
 
376
403
  Once the worker has completed the wrap-up phase of the job we can close the job and attach a note to it for future reference.
377
404
 
378
- ```ts
405
+ ```ts snippet:ReadmeSampleCloseJob
406
+ import JobRouterClient from "@azure-rest/communication-job-router";
407
+
408
+ const connectionString =
409
+ "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
410
+ const routerClient = JobRouterClient(connectionString);
411
+
412
+ const workerId = "router-worker-123";
413
+ const jobId = "job-id";
414
+ const assignmentId = "assignment-id";
415
+
379
416
  const closeJob = await routerClient
380
- .path(
381
- "/routing/jobs/{jobId}/assignments/{assignmentId}:close",
382
- jobId,
383
- acceptResponse.body.assignmentId,
384
- )
417
+ .path("/routing/jobs/{jobId}/assignments/{assignmentId}:close", jobId, assignmentId)
385
418
  .post({
386
419
  body: {
387
420
  note: `Job has been closed by ${workerId} at ${new Date()}`,
@@ -395,8 +428,8 @@ const closeJob = await routerClient
395
428
 
396
429
  Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`:
397
430
 
398
- ```javascript
399
- const { setLogLevel } = require("@azure/logger");
431
+ ```ts snippet:SetLogLevel
432
+ import { setLogLevel } from "@azure/logger";
400
433
 
401
434
  setLogLevel("info");
402
435
  ```
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@azure-rest/communication-job-router",
3
3
  "sdk-type": "client",
4
4
  "author": "Microsoft Corporation",
5
- "version": "1.1.0-alpha.20250122.7",
5
+ "version": "1.1.0-alpha.20250129.1",
6
6
  "description": "Azure client library for Azure Communication Job Router services",
7
7
  "keywords": [
8
8
  "node",
@@ -38,7 +38,7 @@
38
38
  "check-format": "dev-tool run vendored prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"*.{js,json}\" \"test/**/*.ts\"",
39
39
  "clean": "dev-tool run vendored rimraf --glob dist dist-browser dist-esm test-dist temp types *.tgz *.log",
40
40
  "execute:samples": "dev-tool samples run samples-dev",
41
- "extract-api": "dev-tool run vendored rimraf review && dev-tool run vendored mkdirp ./review && dev-tool run extract-api",
41
+ "extract-api": "dev-tool run vendored rimraf review && dev-tool run extract-api",
42
42
  "format": "dev-tool run vendored prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"*.{js,json}\" \"test/**/*.ts\"",
43
43
  "generate:client": "echo skipped",
44
44
  "integration-test": "npm run integration-test:node && npm run integration-test:browser",
@@ -53,7 +53,7 @@
53
53
  "unit-test": "npm run unit-test:node && npm run unit-test:browser",
54
54
  "unit-test:browser": "npm run clean && dev-tool run build-package && dev-tool run build-test && dev-tool run test:vitest --browser",
55
55
  "unit-test:node": "dev-tool run test:vitest",
56
- "update-snippets": "echo skipped"
56
+ "update-snippets": "dev-tool run update-snippets"
57
57
  },
58
58
  "sideEffects": false,
59
59
  "autoPublish": false,
@@ -72,16 +72,16 @@
72
72
  "@azure/core-util": "^1.11.0",
73
73
  "@azure/dev-tool": ">=1.0.0-alpha <1.0.0-alphb",
74
74
  "@azure/eslint-plugin-azure-sdk": ">=3.0.0-alpha <3.0.0-alphb",
75
- "@azure/identity": "^4.0.1",
75
+ "@azure/identity": "^4.5.0",
76
76
  "@types/node": "^18.0.0",
77
- "@vitest/browser": "^2.1.5",
78
- "@vitest/coverage-istanbul": "^2.1.5",
77
+ "@vitest/browser": "^3.0.3",
78
+ "@vitest/coverage-istanbul": "^3.0.3",
79
79
  "autorest": "latest",
80
80
  "dotenv": "^16.0.0",
81
81
  "eslint": "^9.9.0",
82
82
  "playwright": "^1.48.2",
83
83
  "typescript": "~5.7.2",
84
- "vitest": "^2.1.5"
84
+ "vitest": "^3.0.3"
85
85
  },
86
86
  "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication/communication-job-router-rest/README.md",
87
87
  "//metadata": {