public JoinWindows after(final Duration timeDifference) throws IllegalArgumentException {
        final String msgPrefix = prepareMillisCheckFailMsgPrefix(timeDifference, "timeDifference");
        final long timeDifferenceMs = validateMillisecondDuration(timeDifference, msgPrefix);
        return new JoinWindows(beforeMs, timeDifferenceMs, graceMs, enableSpuriousResultFix);
    }
Changes the end window boundary to {@code timeDifference} but keep the start window boundary as is.
Thus, records of the same key are joinable if the timestamp of a record from the secondary stream is at most
{@code timeDifference} later than the timestamp of the record from the primary stream.
{@code timeDifference} can be negative but its absolute value must not be larger than current window "before"
value (which would result in a negative window size).

@param timeDifference relative window end time
@throws IllegalArgumentException if the resulting window size is negative or {@code timeDifference} can't be represented as {@code long milliseconds}
streams/src/main/java/org/apache/kafka/streams/kstream/JoinWindows.java