code: @Override
      void synchronizationPoint( NativeObject jsRWB, Boolean hot, Object data ) {
          Map<String, Object> jRWB = (Map)Context.jsToJava(jsRWB, Map.class);
          
          SyncStatement stmt = SyncStatement.make();
          if ( hot != null ) {
              stmt = stmt.hot(hot);
          }
          Object req = jRWB.get("request");
          if ( req != null ) {
              if ( req instanceof BEvent ) {
                  stmt = stmt.request((BEvent)req);
              } else if ( req instanceof NativeArray ) {
                  NativeArray arr = (NativeArray) req;
                  stmt = stmt.request(
                          Arrays.asList( arr.getIndexIds() ).stream()
                                .map( i -> (BEvent)arr.get(i) )
                                .collect( toList() ));
              } 
          }
  
          EventSet waitForSet = convertToEventSet(jRWB.get("waitFor"));
          EventSet blockSet = convertToEventSet(jRWB.get("block"));
          EventSet interruptSet = convertToEventSet(jRWB.get("interrupt"));
          stmt = stmt.waitFor( waitForSet )
                       .block( blockSet )
                   .interrupt( interruptSet )
                        .data( data );
          boolean hasCollision = stmt.getRequest().stream().anyMatch(blockSet::contains);
          if (hasCollision) {
              System.err.println("Warning: B-thread is blocking an event it is also requesting, this may lead to a deadlock.");
          }
          
          captureBThreadState(stmt);
      }
docs: Where the actual Behavioral Programming synchronization point is done.
  
  @param jsRWB The JavaScript object {@code {request:... waitFor:...}}
  @param hot   {@code True} if this should be a "hot" synchronization point.
  @param data Optional extra data the synchronizing b-thread may want to add.