@@ -29,7 +29,11 @@ import {
29
29
TypedSearchAttributes ,
30
30
WorkflowExecutionAlreadyStartedError ,
31
31
} from '@temporalio/common' ;
32
- import { reservedPrefixes } from '@temporalio/common/lib/reserved' ;
32
+ import {
33
+ TEMPORAL_RESERVED_PREFIX ,
34
+ STACK_TRACE_RESERVED_NAME ,
35
+ ENHANCED_STACK_TRACE_RESERVED_NAME ,
36
+ } from '@temporalio/common/lib/reserved' ;
33
37
import { signalSchedulingWorkflow } from './activities/helpers' ;
34
38
import { activityStartedSignal } from './workflows/definitions' ;
35
39
import * as workflows from './workflows' ;
@@ -1426,18 +1430,23 @@ test('Workflow can return root workflow', async (t) => {
1426
1430
} ) ;
1427
1431
} ) ;
1428
1432
1433
+ const reservedNames = [ TEMPORAL_RESERVED_PREFIX , STACK_TRACE_RESERVED_NAME , ENHANCED_STACK_TRACE_RESERVED_NAME ] ;
1434
+
1429
1435
test ( 'Cannot register activities using reserved prefixes' , async ( t ) => {
1430
1436
const { createWorker } = helpers ( t ) ;
1431
1437
1432
- for ( const prefix of reservedPrefixes ) {
1433
- const activityName = prefix + '_test' ;
1438
+ for ( const name of reservedNames ) {
1439
+ const activityName = name === TEMPORAL_RESERVED_PREFIX ? name + '_test' : name ;
1434
1440
await t . throwsAsync (
1435
1441
createWorker ( {
1436
1442
activities : { [ activityName ] : ( ) => { } } ,
1437
1443
} ) ,
1438
1444
{
1439
- name : 'ReservedPrefixError' ,
1440
- message : `Cannot use activity name: '${ activityName } ', with reserved prefix: '${ prefix } '` ,
1445
+ name : 'TypeError' ,
1446
+ message :
1447
+ name === TEMPORAL_RESERVED_PREFIX
1448
+ ? `Cannot use activity name: '${ activityName } ', with reserved prefix: '${ name } '`
1449
+ : `Cannot use activity name: '${ activityName } ', which is a reserved name` ,
1441
1450
}
1442
1451
) ;
1443
1452
}
@@ -1446,16 +1455,45 @@ test('Cannot register activities using reserved prefixes', async (t) => {
1446
1455
test ( 'Cannot register task queues using reserved prefixes' , async ( t ) => {
1447
1456
const { createWorker } = helpers ( t ) ;
1448
1457
1449
- for ( const prefix of reservedPrefixes ) {
1450
- const taskQueue = prefix + '_test' ;
1458
+ for ( const name of reservedNames ) {
1459
+ const taskQueue = name === TEMPORAL_RESERVED_PREFIX ? name + '_test' : name ;
1451
1460
1452
1461
await t . throwsAsync (
1453
1462
createWorker ( {
1454
1463
taskQueue,
1455
1464
} ) ,
1456
1465
{
1457
- name : 'ReservedPrefixError' ,
1458
- message : `Cannot use task queue name: '${ taskQueue } ', with reserved prefix: '${ prefix } '` ,
1466
+ name : 'TypeError' ,
1467
+ message :
1468
+ name === TEMPORAL_RESERVED_PREFIX
1469
+ ? `Cannot use task queue name: '${ taskQueue } ', with reserved prefix: '${ name } '`
1470
+ : `Cannot use task queue name: '${ taskQueue } ', which is a reserved name` ,
1471
+ }
1472
+ ) ;
1473
+ }
1474
+ } ) ;
1475
+
1476
+ test ( 'Cannot register sinks using reserved prefixes' , async ( t ) => {
1477
+ const { createWorker } = helpers ( t ) ;
1478
+
1479
+ for ( const name of reservedNames ) {
1480
+ const sinkName = name === TEMPORAL_RESERVED_PREFIX ? name + '_test' : name ;
1481
+ await t . throwsAsync (
1482
+ createWorker ( {
1483
+ sinks : {
1484
+ [ sinkName ] : {
1485
+ test : {
1486
+ fn : ( ) => { } ,
1487
+ } ,
1488
+ } ,
1489
+ } ,
1490
+ } ) ,
1491
+ {
1492
+ name : 'TypeError' ,
1493
+ message :
1494
+ name === TEMPORAL_RESERVED_PREFIX
1495
+ ? `Cannot use sink name: '${ sinkName } ', with reserved prefix: '${ name } '`
1496
+ : `Cannot use sink name: '${ sinkName } ', which is a reserved name` ,
1459
1497
}
1460
1498
) ;
1461
1499
}
@@ -1466,25 +1504,25 @@ interface HandlerError {
1466
1504
message : string ;
1467
1505
}
1468
1506
1469
- export async function workflowBadPrefixHandler ( prefix : string ) : Promise < HandlerError [ ] > {
1507
+ export async function workflowReservedNameHandler ( name : string ) : Promise < HandlerError [ ] > {
1470
1508
// Re-package errors, default payload converter has trouble converting native errors (no 'data' field).
1471
1509
const expectedErrors : HandlerError [ ] = [ ] ;
1472
1510
try {
1473
- setHandler ( defineSignal ( prefix + '_signal' ) , ( ) => { } ) ;
1511
+ setHandler ( defineSignal ( name === TEMPORAL_RESERVED_PREFIX ? name + '_signal' : name ) , ( ) => { } ) ;
1474
1512
} catch ( e ) {
1475
1513
if ( e instanceof Error ) {
1476
1514
expectedErrors . push ( { name : e . name , message : e . message } ) ;
1477
1515
}
1478
1516
}
1479
1517
try {
1480
- setHandler ( defineUpdate ( prefix + '_update' ) , ( ) => { } ) ;
1518
+ setHandler ( defineUpdate ( name === TEMPORAL_RESERVED_PREFIX ? name + '_update' : name ) , ( ) => { } ) ;
1481
1519
} catch ( e ) {
1482
1520
if ( e instanceof Error ) {
1483
1521
expectedErrors . push ( { name : e . name , message : e . message } ) ;
1484
1522
}
1485
1523
}
1486
1524
try {
1487
- setHandler ( defineQuery ( prefix + '_query' ) , ( ) => { } ) ;
1525
+ setHandler ( defineQuery ( name === TEMPORAL_RESERVED_PREFIX ? name + '_query' : name ) , ( ) => { } ) ;
1488
1526
} catch ( e ) {
1489
1527
if ( e instanceof Error ) {
1490
1528
expectedErrors . push ( { name : e . name , message : e . message } ) ;
@@ -1497,22 +1535,31 @@ test('Workflow failure if define signals/updates/queries with reserved prefixes'
1497
1535
const { createWorker, executeWorkflow } = helpers ( t ) ;
1498
1536
const worker = await createWorker ( ) ;
1499
1537
await worker . runUntil ( async ( ) => {
1500
- for ( const prefix of reservedPrefixes ) {
1501
- const result = await executeWorkflow ( workflowBadPrefixHandler , {
1502
- args : [ prefix ] ,
1538
+ for ( const name of reservedNames ) {
1539
+ const result = await executeWorkflow ( workflowReservedNameHandler , {
1540
+ args : [ name ] ,
1503
1541
} ) ;
1504
1542
t . deepEqual ( result , [
1505
1543
{
1506
- name : 'ReservedPrefixError' ,
1507
- message : `Cannot use signal name: '${ prefix } _signal', with reserved prefix: '${ prefix } '` ,
1544
+ name : 'TypeError' ,
1545
+ message :
1546
+ name === TEMPORAL_RESERVED_PREFIX
1547
+ ? `Cannot use signal name: '${ name } _signal', with reserved prefix: '${ name } '`
1548
+ : `Cannot use signal name: '${ name } ', which is a reserved name` ,
1508
1549
} ,
1509
1550
{
1510
- name : 'ReservedPrefixError' ,
1511
- message : `Cannot use update name: '${ prefix } _update', with reserved prefix: '${ prefix } '` ,
1551
+ name : 'TypeError' ,
1552
+ message :
1553
+ name === TEMPORAL_RESERVED_PREFIX
1554
+ ? `Cannot use update name: '${ name } _update', with reserved prefix: '${ name } '`
1555
+ : `Cannot use update name: '${ name } ', which is a reserved name` ,
1512
1556
} ,
1513
1557
{
1514
- name : 'ReservedPrefixError' ,
1515
- message : `Cannot use query name: '${ prefix } _query', with reserved prefix: '${ prefix } '` ,
1558
+ name : 'TypeError' ,
1559
+ message :
1560
+ name === TEMPORAL_RESERVED_PREFIX
1561
+ ? `Cannot use query name: '${ name } _query', with reserved prefix: '${ name } '`
1562
+ : `Cannot use query name: '${ name } ', which is a reserved name` ,
1516
1563
} ,
1517
1564
] ) ;
1518
1565
}
@@ -1557,53 +1604,57 @@ test('Default handlers fail given reserved prefix', async (t) => {
1557
1604
} ;
1558
1605
1559
1606
await worker . runUntil ( async ( ) => {
1560
- for ( const prefix of reservedPrefixes ) {
1561
- // Reserved query
1562
- let handle = await startWorkflow ( workflowWithDefaultHandlers ) ;
1563
- await asyncRetry ( async ( ) => {
1564
- if ( ! ( await handle . query ( wfReadyQuery ) ) ) {
1565
- throw new Error ( 'Workflow not ready yet' ) ;
1566
- }
1567
- } ) ;
1568
- const queryName = `${ prefix } _query` ;
1569
- await t . throwsAsync (
1570
- handle . query ( queryName ) ,
1571
- {
1572
- // ReservedPrefixError transforms to a QueryNotRegisteredError on the way back from server
1573
- name : 'QueryNotRegisteredError' ,
1574
- message : `Cannot use query name: '${ queryName } ', with reserved prefix: '${ prefix } '` ,
1575
- } ,
1576
- `Query ${ queryName } should fail`
1577
- ) ;
1578
- await handle . terminate ( ) ;
1579
-
1580
- // Reserved signal
1581
- handle = await startWorkflow ( workflowWithDefaultHandlers ) ;
1582
- await asyncRetry ( async ( ) => {
1583
- if ( ! ( await handle . query ( wfReadyQuery ) ) ) {
1584
- throw new Error ( 'Workflow not ready yet' ) ;
1585
- }
1586
- } ) ;
1587
- const signalName = `${ prefix } _signal` ;
1588
- await handle . signal ( signalName ) ;
1589
- await assertWftFailure ( handle , `Cannot use signal name: '${ signalName } ', with reserved prefix: '${ prefix } '` ) ;
1590
- await handle . terminate ( ) ;
1591
-
1592
- // Reserved update
1593
- handle = await startWorkflow ( workflowWithDefaultHandlers ) ;
1594
- await asyncRetry ( async ( ) => {
1595
- if ( ! ( await handle . query ( wfReadyQuery ) ) ) {
1596
- throw new Error ( 'Workflow not ready yet' ) ;
1597
- }
1598
- } ) ;
1599
- const updateName = `${ prefix } _update` ;
1600
- handle . executeUpdate ( updateName ) . catch ( ( ) => {
1601
- // Expect failure. The error caught here is a WorkflowNotFound because
1602
- // the workflow will have already failed, so the update cannot go through.
1603
- // We assert on the expected failure below.
1604
- } ) ;
1605
- await assertWftFailure ( handle , `Cannot use update name: '${ updateName } ', with reserved prefix: '${ prefix } '` ) ;
1606
- await handle . terminate ( ) ;
1607
- }
1607
+ // Reserved query
1608
+ let handle = await startWorkflow ( workflowWithDefaultHandlers ) ;
1609
+ await asyncRetry ( async ( ) => {
1610
+ if ( ! ( await handle . query ( wfReadyQuery ) ) ) {
1611
+ throw new Error ( 'Workflow not ready yet' ) ;
1612
+ }
1613
+ } ) ;
1614
+ const queryName = `${ TEMPORAL_RESERVED_PREFIX } _query` ;
1615
+ await t . throwsAsync (
1616
+ handle . query ( queryName ) ,
1617
+ {
1618
+ // TypeError transforms to a QueryNotRegisteredError on the way back from server
1619
+ name : 'QueryNotRegisteredError' ,
1620
+ message : `Cannot use query name: '${ queryName } ', with reserved prefix: '${ TEMPORAL_RESERVED_PREFIX } '` ,
1621
+ } ,
1622
+ `Query ${ queryName } should fail`
1623
+ ) ;
1624
+ await handle . terminate ( ) ;
1625
+
1626
+ // Reserved signal
1627
+ handle = await startWorkflow ( workflowWithDefaultHandlers ) ;
1628
+ await asyncRetry ( async ( ) => {
1629
+ if ( ! ( await handle . query ( wfReadyQuery ) ) ) {
1630
+ throw new Error ( 'Workflow not ready yet' ) ;
1631
+ }
1632
+ } ) ;
1633
+ const signalName = `${ TEMPORAL_RESERVED_PREFIX } _signal` ;
1634
+ await handle . signal ( signalName ) ;
1635
+ await assertWftFailure (
1636
+ handle ,
1637
+ `Cannot use signal name: '${ signalName } ', with reserved prefix: '${ TEMPORAL_RESERVED_PREFIX } '`
1638
+ ) ;
1639
+ await handle . terminate ( ) ;
1640
+
1641
+ // Reserved update
1642
+ handle = await startWorkflow ( workflowWithDefaultHandlers ) ;
1643
+ await asyncRetry ( async ( ) => {
1644
+ if ( ! ( await handle . query ( wfReadyQuery ) ) ) {
1645
+ throw new Error ( 'Workflow not ready yet' ) ;
1646
+ }
1647
+ } ) ;
1648
+ const updateName = `${ TEMPORAL_RESERVED_PREFIX } _update` ;
1649
+ handle . executeUpdate ( updateName ) . catch ( ( ) => {
1650
+ // Expect failure. The error caught here is a WorkflowNotFound because
1651
+ // the workflow will have already failed, so the update cannot go through.
1652
+ // We assert on the expected failure below.
1653
+ } ) ;
1654
+ await assertWftFailure (
1655
+ handle ,
1656
+ `Cannot use update name: '${ updateName } ', with reserved prefix: '${ TEMPORAL_RESERVED_PREFIX } '`
1657
+ ) ;
1658
+ await handle . terminate ( ) ;
1608
1659
} ) ;
1609
1660
} ) ;
0 commit comments