From 28937e1464355bce8a929f778f88855ea7b8992f Mon Sep 17 00:00:00 2001 From: Gabriel Brito Date: Fri, 5 Jun 2026 15:15:12 -0700 Subject: [PATCH 01/12] Initial draft --- index.bs | 103 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 17 deletions(-) diff --git a/index.bs b/index.bs index 2e5930f46..e7ae07d5b 100644 --- a/index.bs +++ b/index.bs @@ -2480,9 +2480,10 @@ returned promise with the rendered result as an interface OfflineAudioContext : BaseAudioContext { constructor(OfflineAudioContextOptions contextOptions); constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); - Promise startRendering(); + Promise startRendering(unsigned long chunkSize); Promise resume(); Promise suspend(double suspendTime); + Promise close(); readonly attribute unsigned long length; attribute EventHandler oncomplete; }; @@ -2576,7 +2577,7 @@ Constructors
         numberOfChannels: Determines how many channels the buffer will have. See {{BaseAudioContext/createBuffer()}} for the supported number of channels.
-        length: Determines the size of the buffer in sample-frames.
+        length: Determines the total size of the audio render in sample-frames.
         sampleRate: Describes the sample-rate of the [=linear PCM=] audio data in the buffer in sample-frames per second. See [[#sample-rates]] for the required supported range.
         
@@ -2587,9 +2588,11 @@ Attributes
: length :: - The size of the buffer in sample-frames. This is the same as the + The total size of the audio render in sample-frames. This is the same as the value of the length parameter for the constructor. + For undefined-length rendering, this attribute SHOULD be set to positive infinity. + : oncomplete :: The event type of this event handler is complete. The event @@ -2601,7 +2604,7 @@ Attributes Methods
- : startRendering() + : startRendering(chunkSize) :: Given the current connections and scheduled changes, starts rendering audio. @@ -2620,21 +2623,29 @@ Methods
  1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. -
  2. If the {{[[rendering started]]}} slot on the - {{OfflineAudioContext}} is true, return a rejected - promise with {{InvalidStateError}}, and abort these - steps. -
  3. Set the {{[[rendering started]]}} slot of the {{OfflineAudioContext}} to true.
  4. Let promise be a new promise. +
  5. Let bufferLength be a number initialized to the value of {{OfflineAudioContext/length}}. + +
      +
    1. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is provided: +
        +
      1. Let renderedFrames be the number of sample-frames already rendered by the {{OfflineAudioContext}}. +
      2. If renderedFrames + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} <= {{OfflineAudioContext/length}}, set bufferLength to {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. +
      3. Otherwise, set bufferLength to {{OfflineAudioContext/length}} - renderedFrames. +
      +
    2. Otherwise, if {{OfflineAudioContext/length}} is positive infinity, set bufferLength to the render quantum size. +
    +
  6. Create a new {{AudioBuffer}}, with a number of - channels, length and sample rate equal respectively to the - numberOfChannels, length and + channels and sample rate equal respectively to the + numberOfChannels and sampleRate values passed to this instance's - constructor in the contextOptions parameter. + constructor in the contextOptions parameter; + and length equal to bufferLength. Assign this buffer to an internal slot [[rendered buffer]] in the {{OfflineAudioContext}}. @@ -2658,7 +2669,7 @@ Methods
    1. Given the current connections and scheduled changes, start - rendering length sample-frames of audio into + rendering {{[[rendered buffer/length]]}} sample-frames of audio into {{[[rendered buffer]]}}
    2. For every render quantum, check and @@ -2676,7 +2687,8 @@ Methods
    3. Resolve the promise created by {{startRendering()}} with {{[[rendered buffer]]}}. -
    4. [=Queue a media element task=] to [=fire an event=] named +
    5. If {{OfflineAudioContext/length}} is not positive infinity, + [=Queue a media element task=] to [=fire an event=] named {{OfflineAudioContext/complete}} at the {{OfflineAudioContext}} using {{OfflineAudioCompletionEvent}} whose `renderedBuffer` property is set to {{[[rendered buffer]]}}. @@ -2686,9 +2698,9 @@ Methods
    -
    - No parameters. -
    +
    +            chunkSize: The size of the desired {{AudioBuffer}}.
    +        
    Return type: {{Promise}}<{{AudioBuffer}}>
    @@ -2783,6 +2795,63 @@ Methods
    Return type: {{Promise}}<{{undefined}}>
    + + : close() + :: + Closes the {{AudioContext}}. This will not automatically release + all {{AudioContext}}-created objects, but will suspend the + progression of the {{AudioContext}}'s + {{BaseAudioContext/currentTime}}, and stop + processing audio data. + +
    + When close is called, execute these steps: + + 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. + + 1. Let promise be a new Promise. + + 1. If the {{[[control thread state]]}} flag on the + {{OfflineAudioContext}} is closed reject the promise + with {{InvalidStateError}}, abort these steps, + returning promise. + + 1. Set the {{[[control thread state]]}} flag on the {{OfflineAudioContext}} to + closed. + + 1. Queue a control message to close the {{OfflineAudioContext}}. + + 1. Return promise. +
    + +
    + Running a control message to close an + {{OfflineAudioContext}} means running these steps on the + rendering thread: + + 1. Set the {{[[rendering thread state]]}} to suspended. +
    + This will stop rendering. +
    + + 1. If this control message is being run in a reaction to the + document being unloaded, abort this algorithm. +
    + There is no need to notify the control thread in this case. +
    + + 1. + queue a media element task to execute the following steps: + + 1. Resolve promise. + 1. If the {{BaseAudioContext/state}} attribute of the {{OfflineAudioContext}} is not already "{{AudioContextState/closed}}": + 1. Set the {{BaseAudioContext/state}} attribute of the {{OfflineAudioContext}} to "{{AudioContextState/closed}}". + + 1. + queue a media element task to fire + an event named {{BaseAudioContext/statechange}} at the {{OfflineAudioContext}}. +
    +

From d4834650c1db06d7bc1c79618ac13e6b3108e28c Mon Sep 17 00:00:00 2001 From: Gabriel Brito Date: Fri, 5 Jun 2026 15:37:04 -0700 Subject: [PATCH 02/12] Attempt to fix compile error --- index.bs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/index.bs b/index.bs index e7ae07d5b..23f4c6362 100644 --- a/index.bs +++ b/index.bs @@ -2668,9 +2668,12 @@ Methods

occasion.
    +
  1. Let nFrames be a number initialized to the value + of the length of {{[[rendered buffer]]}}. +
  2. Given the current connections and scheduled changes, start - rendering {{[[rendered buffer/length]]}} sample-frames of audio into - {{[[rendered buffer]]}} + rendering nFrames sample-frames of audio into + {{[[rendered buffer]]}}.
  3. For every render quantum, check and {{OfflineAudioContext/suspend()|suspend}} From 991aa95f87854ea66094dd77e56da04370e0aeb9 Mon Sep 17 00:00:00 2001 From: Gabriel Brito Date: Thu, 18 Jun 2026 15:12:21 -0700 Subject: [PATCH 03/12] Addressing some feedback --- index.bs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/index.bs b/index.bs index 0fb8d5312..2b4b91b1e 100644 --- a/index.bs +++ b/index.bs @@ -2500,7 +2500,7 @@ returned promise with the rendered result as an interface OfflineAudioContext : BaseAudioContext { constructor(OfflineAudioContextOptions contextOptions); constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); - Promise startRendering(unsigned long chunkSize); + Promise startRendering(optional unsigned long chunkSize); Promise resume(); Promise suspend(double suspendTime); Promise close(); @@ -2611,7 +2611,7 @@ Attributes The total size of the audio render in sample-frames. This is the same as the value of the length parameter for the constructor. - For undefined-length rendering, this attribute SHOULD be set to positive infinity. + For undefined-length rendering, this attribute SHOULD be set to null. : oncomplete :: @@ -2654,10 +2654,10 @@ Methods
  4. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is provided:
    1. Let renderedFrames be the number of sample-frames already rendered by the {{OfflineAudioContext}}. -
    2. If renderedFrames + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} <= {{OfflineAudioContext/length}}, set bufferLength to {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. +
    3. If renderedFrames + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is less than or equal to {{OfflineAudioContext/length}}, set bufferLength to {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}.
    4. Otherwise, set bufferLength to {{OfflineAudioContext/length}} - renderedFrames.
    -
  5. Otherwise, if {{OfflineAudioContext/length}} is positive infinity, set bufferLength to the render quantum size. +
  6. Otherwise, if {{OfflineAudioContext/length}} is null, set bufferLength to the render quantum size.
  • Create a new {{AudioBuffer}}, with a number of @@ -2688,11 +2688,11 @@ Methods occasion.
      -
    1. Let nFrames be a number initialized to the value +
    2. Let numberOfFrames be a number initialized to the value of the length of {{[[rendered buffer]]}}.
    3. Given the current connections and scheduled changes, start - rendering nFrames sample-frames of audio into + rendering numberOfFrames sample-frames of audio into {{[[rendered buffer]]}}.
    4. For every render quantum, check and @@ -2710,7 +2710,7 @@ Methods
    5. Resolve the promise created by {{startRendering()}} with {{[[rendered buffer]]}}. -
    6. If {{OfflineAudioContext/length}} is not positive infinity, +
    7. If {{OfflineAudioContext/length}} is not null, [=Queue a media element task=] to [=fire an event=] named {{OfflineAudioContext/complete}} at the {{OfflineAudioContext}} using {{OfflineAudioCompletionEvent}} whose `renderedBuffer` property is set to @@ -2722,7 +2722,7 @@ Methods
      -            chunkSize: The size of the desired {{AudioBuffer}}.
      +            chunkSize: The number of sample-frames to render during this call.
               
      Return type: {{Promise}}<{{AudioBuffer}}> @@ -2821,7 +2821,7 @@ Methods : close() :: - Closes the {{AudioContext}}. This will not automatically release + Closes the {{OfflineAudioContext}}. This will not automatically release all {{AudioContext}}-created objects, but will suspend the progression of the {{AudioContext}}'s {{BaseAudioContext/currentTime}}, and stop From 99cd099d8cfe607051da98aa78db2dd8008d5e60 Mon Sep 17 00:00:00 2001 From: Gabriel Brito Date: Thu, 18 Jun 2026 16:44:29 -0700 Subject: [PATCH 04/12] Wrap text at column 80 --- index.bs | 86 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 32 deletions(-) diff --git a/index.bs b/index.bs index 2b4b91b1e..dc3bdf605 100644 --- a/index.bs +++ b/index.bs @@ -2608,10 +2608,11 @@ Attributes
      : length :: - The total size of the audio render in sample-frames. This is the same as the - value of the length parameter for the constructor. + The total size of the audio render in sample-frames. This is the same + as the value of the length parameter for the constructor. - For undefined-length rendering, this attribute SHOULD be set to null. + For undefined-length rendering, this attribute SHOULD be set to + null. : oncomplete :: @@ -2648,16 +2649,28 @@ Methods
    8. Let promise be a new promise. -
    9. Let bufferLength be a number initialized to the value of {{OfflineAudioContext/length}}. +
    10. Let bufferLength be a number initialized to the + value of {{OfflineAudioContext/length}}.
        -
      1. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is provided: +
      2. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is provided:
          -
        1. Let renderedFrames be the number of sample-frames already rendered by the {{OfflineAudioContext}}. -
        2. If renderedFrames + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is less than or equal to {{OfflineAudioContext/length}}, set bufferLength to {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. -
        3. Otherwise, set bufferLength to {{OfflineAudioContext/length}} - renderedFrames. +
        4. Let renderedFrames be the number of + sample-frames already rendered by the + {{OfflineAudioContext}}. +
        5. If renderedFrames + + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is less than or equal to {{OfflineAudioContext/length}}, + set bufferLength to + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. +
        6. Otherwise, set bufferLength to + {{OfflineAudioContext/length}} - + renderedFrames.
        -
      3. Otherwise, if {{OfflineAudioContext/length}} is null, set bufferLength to the render quantum size. +
      4. Otherwise, if {{OfflineAudioContext/length}} is + null, set bufferLength to the + render quantum size.
    11. Create a new {{AudioBuffer}}, with a number of @@ -2688,8 +2701,8 @@ Methods occasion.
        -
      1. Let numberOfFrames be a number initialized to the value - of the length of {{[[rendered buffer]]}}. +
      2. Let numberOfFrames be a number initialized to + the value of the length of {{[[rendered buffer]]}}.
      3. Given the current connections and scheduled changes, start rendering numberOfFrames sample-frames of audio into @@ -2710,11 +2723,12 @@ Methods
      4. Resolve the promise created by {{startRendering()}} with {{[[rendered buffer]]}}. -
      5. If {{OfflineAudioContext/length}} is not null, - [=Queue a media element task=] to [=fire an event=] named - {{OfflineAudioContext/complete}} at the {{OfflineAudioContext}} using - {{OfflineAudioCompletionEvent}} whose `renderedBuffer` property is set to - {{[[rendered buffer]]}}. +
      6. If {{OfflineAudioContext/length}} is not + null, [=Queue a media element task=] to + [=fire an event=] named {{OfflineAudioContext/complete}} + at the {{OfflineAudioContext}} using + {{OfflineAudioCompletionEvent}} whose `renderedBuffer` + property is set to {{[[rendered buffer]]}}.
      @@ -2822,35 +2836,37 @@ Methods : close() :: Closes the {{OfflineAudioContext}}. This will not automatically release - all {{AudioContext}}-created objects, but will suspend the - progression of the {{AudioContext}}'s - {{BaseAudioContext/currentTime}}, and stop + all {{AudioContext}}-created objects, but will suspend the progression + of the {{AudioContext}}'s {{BaseAudioContext/currentTime}}, and stop processing audio data.
      When close is called, execute these steps: - 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. + 1. If [=this=]'s [=relevant global object=]'s + [=associated Document=] is not [=fully active=] then return + [=a promise rejected with=] "{{InvalidStateError}}" + {{DOMException}}. 1. Let promise be a new Promise. 1. If the {{[[control thread state]]}} flag on the - {{OfflineAudioContext}} is closed reject the promise - with {{InvalidStateError}}, abort these steps, + {{OfflineAudioContext}} is closed reject the + promise with {{InvalidStateError}}, abort these steps, returning promise. - 1. Set the {{[[control thread state]]}} flag on the {{OfflineAudioContext}} to - closed. + 1. Set the {{[[control thread state]]}} flag on the + {{OfflineAudioContext}} to closed. - 1. Queue a control message to close the {{OfflineAudioContext}}. + 1. Queue a control message to close the + {{OfflineAudioContext}}. 1. Return promise.
      - Running a control message to close an - {{OfflineAudioContext}} means running these steps on the - rendering thread: + Running a control message to close an {{OfflineAudioContext}} + means running these steps on the rendering thread: 1. Set the {{[[rendering thread state]]}} to suspended.
      @@ -2867,12 +2883,18 @@ Methods queue a media element task to execute the following steps: 1. Resolve promise. - 1. If the {{BaseAudioContext/state}} attribute of the {{OfflineAudioContext}} is not already "{{AudioContextState/closed}}": - 1. Set the {{BaseAudioContext/state}} attribute of the {{OfflineAudioContext}} to "{{AudioContextState/closed}}". + 1. If the {{BaseAudioContext/state}} attribute of the + {{OfflineAudioContext}} is not already + "{{AudioContextState/closed}}": + 1. Set the {{BaseAudioContext/state}} attribute of the + {{OfflineAudioContext}} to + "{{AudioContextState/closed}}". 1. - queue a media element task to fire - an event named {{BaseAudioContext/statechange}} at the {{OfflineAudioContext}}. + queue a media element task to + fire an event named + {{BaseAudioContext/statechange}} at the + {{OfflineAudioContext}}.
    12. From e82ea079c428c74fe46b9667e0e616602218e78d Mon Sep 17 00:00:00 2001 From: Gabriel Brito Date: Thu, 30 Jul 2026 19:01:16 -0700 Subject: [PATCH 05/12] checkpoint --- index.bs | 172 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 137 insertions(+), 35 deletions(-) diff --git a/index.bs b/index.bs index dc3bdf605..75d71b40f 100644 --- a/index.bs +++ b/index.bs @@ -2500,15 +2500,38 @@ returned promise with the rendered result as an interface OfflineAudioContext : BaseAudioContext { constructor(OfflineAudioContextOptions contextOptions); constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); - Promise startRendering(optional unsigned long chunkSize); + Promise startRendering(optional unsigned long chunkSize? = null); Promise resume(); Promise suspend(double suspendTime); Promise close(); - readonly attribute unsigned long length; + readonly attribute unsigned long? length; attribute EventHandler oncomplete; }; +{{OfflineAudioContext}} has the following internal slots: +
      + : [[rendering started]] + :: + A boolean flag representing whether the rendering has started. The + initial value is false. + + : [[rendered buffers]] + :: + An ordered list of {{AudioBuffers}} that are being rendered. The initial + value is an empty list. + + : [[committed frames]] + :: + Tracks the number of frames that the {{OfflineAudioContext}} has + committed to render. The initial value is 0. + + : [[rendered frames]] + :: + Tracks the number of frames that have been rendered. The initial value + is 0. +
      +

      Constructors

      @@ -2634,9 +2657,7 @@ Methods is via its promise return value, the instance will also fire an event named complete for legacy reasons. -
      - Let [[rendering started]] be an internal slot of this {{OfflineAudioContext}}. Initialize this slot to false. - +
      When startRendering is called, the following steps MUST be performed on the control thread: @@ -2644,50 +2665,119 @@ Methods
      1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. -
      2. Set the {{[[rendering started]]}} slot of the - {{OfflineAudioContext}} to true. -
      3. Let promise be a new promise. +
      4. If the {{[[control thread state]]}} on the + {{OfflineAudioContext}} is {{AudioContextState/closed}}, reject + promise with {{InvalidStateError}} and abort these + steps. + +
      5. If {{[[committed frames]]}} is greater than or equal to + {{OfflineAudioContext/length}}, reject promise with + {{InvalidStateError}} and abort these steps. +
      6. Let bufferLength be a number initialized to the - value of {{OfflineAudioContext/length}}. + value of the {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + +
          +
        1. If the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is not null: +
            +
          1. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is null or if {{[[committed frames]]}} + + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is greater than the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, set bufferLength to + {{OfflineAudioContext/length}} - {{[[committed frames]]}}. +
          +
        2. Otherwise, if the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is null: +
            +
          1. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is null, set bufferLength to + render quantum size. +
          +
        + +
          +
        1. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is not null: +
            +
          1. If the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is not null: +
              +
            1. If {{[[committed frames]]}} + + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is less than or equal to the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, set bufferLength to + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. +
            2. Otherwise, set bufferLength to + {{OfflineAudioContext/length}} - {{[[committed frames]]}}. +
            +
          2. Otherwise, set bufferLength to + {{OfflineAudioContext/length}} - {{[[committed frames]]}}. +
          +
        2. Otherwise, if the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is null, set + bufferLength to render quantum size. +
        + +
          +
        1. If {{[[committed frames]]}} + + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is less than or equal to the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, set + bufferLength to + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. +
        2. Otherwise, set bufferLength to + {{OfflineAudioContext/length}} - + {{[[committed frames]]}}. +
        +
      7. Otherwise, if the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is null, set + bufferLength to render quantum size. +
      1. If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is provided:
          -
        1. Let renderedFrames be the number of - sample-frames already rendered by the - {{OfflineAudioContext}}. -
        2. If renderedFrames + +
        3. If {{[[committed frames]]}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is less than or equal to {{OfflineAudioContext/length}}, - set bufferLength to + is less than or equal to the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, set + bufferLength to {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}.
        4. Otherwise, set bufferLength to {{OfflineAudioContext/length}} - - renderedFrames. + {{[[committed frames]]}}.
        -
      2. Otherwise, if {{OfflineAudioContext/length}} is - null, set bufferLength to the - render quantum size. +
      3. Otherwise, if the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is null, set + bufferLength to render quantum size.
      -
    13. Create a new {{AudioBuffer}}, with a number of +
    14. If bufferLength is not a multiple of + render quantum size, round it up to the next multiple of + the render quantum size. + +
    15. Create a new {{AudioBuffer}} buffer, with a number of channels and sample rate equal respectively to the numberOfChannels and sampleRate values passed to this instance's constructor in the contextOptions parameter; and length equal to bufferLength. - Assign this buffer to an internal slot - [[rendered buffer]] in the {{OfflineAudioContext}}.
    16. If an exception was thrown during the preceding - {{AudioBuffer}} constructor call, reject - promise with this exception. + {{AudioBuffer}} constructor call, reject promise with + this exception and return promise. + +
    17. Set {{[[rendering started]]}} to true. + +
    18. Set {{[[committed frames]]}} to the sum of + {{[[committed frames]]}} and the buffer's + {{AudioBuffer/length}}. -
    19. Otherwise, in the case that the buffer was successfully - constructed, begin offline rendering. +
    20. Append buffer to {{[[rendered buffers]]}} and + begin offline rendering for buffer.
    21. Append promise to {{BaseAudioContext/[[pending promises]]}}. @@ -2696,17 +2786,15 @@ Methods
      - To begin offline rendering, the following steps MUST + To begin offline rendering for an {{AudioBuffer}} buffer, the following steps MUST happen on a rendering thread that is created for the occasion.
        -
      1. Let numberOfFrames be a number initialized to - the value of the length of {{[[rendered buffer]]}}.
      2. Given the current connections and scheduled changes, start - rendering numberOfFrames sample-frames of audio into - {{[[rendered buffer]]}}. + rendering buffer's {{AudioBuffer/length}} + sample-frames of audio into buffer.
      3. For every render quantum, check and {{OfflineAudioContext/suspend()|suspend}} @@ -2721,21 +2809,35 @@ Methods
        1. Resolve the promise created by {{startRendering()}} - with {{[[rendered buffer]]}}. + with buffer. + +
        2. Remove the promise from + {{BaseAudioContext/[[pending promises]]}}. + +
        3. Remove buffer from {{[[rendered buffers]]}}. + +
        4. Set {{[[rendered frames]]}} to the sum of + {{[[rendered frames]]}} and the {{AudioBuffer/length}} + of buffer. + +
        5. if {{[[rendered frames]]}} is greater than or equal + to {{OfflineAudioContext/length}}, + Queue a control message to close the + {{OfflineAudioContext}}.
        6. If {{OfflineAudioContext/length}} is not null, [=Queue a media element task=] to [=fire an event=] named {{OfflineAudioContext/complete}} at the {{OfflineAudioContext}} using {{OfflineAudioCompletionEvent}} whose `renderedBuffer` - property is set to {{[[rendered buffer]]}}. + property is set to buffer.
      -
      +        
                   chunkSize: The number of sample-frames to render during this call.
               
      @@ -2908,7 +3010,7 @@ This specifies the options to use in constructing an dictionary OfflineAudioContextOptions { unsigned long numberOfChannels = 1; - required unsigned long length; + optional unsigned long length? = null; required float sampleRate; (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default"; }; From 3d5cab61ae83399d6b59dce3cfe08d10dc343665 Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Fri, 31 Jul 2026 13:47:22 -0700 Subject: [PATCH 06/12] Incorporating WG consensus --- index.bs | 105 ++++++++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 67 deletions(-) diff --git a/index.bs b/index.bs index 75d71b40f..e18f870be 100644 --- a/index.bs +++ b/index.bs @@ -2673,87 +2673,34 @@ Methods</h4> steps. <li> If {{[[committed frames]]}} is greater than or equal to - {{OfflineAudioContext/length}}, reject <var>promise</var> with + {{OfflineAudioContext}}'s {{OfflineAudioContext/length}}, reject <var>promise</var> with {{InvalidStateError}} and abort these steps. <lI>Let <var>bufferLength</var> be a number initialized to the value of the {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. <ol> - <li> If the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is not <code>null</code>: - <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is <code>null</code> or if {{[[committed frames]]}} + - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is greater than the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}}, set <var>bufferLength</var> to - {{OfflineAudioContext/length}} - {{[[committed frames]]}}. - </ol> - <li> Otherwise, if the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is <code>null</code>: - <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is <code>null</code>, set <var>bufferLength</var> to - <a>render quantum size</a>. - </ol> - </ol> - - <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is not <code>null</code>: - <ol> - <li> If the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is not <code>null</code>: - <ol> - <li>If {{[[committed frames]]}} + - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is less than or equal to the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}}, set <var>bufferLength</var> to - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. - <li> Otherwise, set <var>bufferLength</var> to - {{OfflineAudioContext/length}} - {{[[committed frames]]}}. - </ol> - <li>Otherwise, set <var>bufferLength</var> to - {{OfflineAudioContext/length}} - {{[[committed frames]]}}. + <li> If the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is <code>null</code>: + <ol> + <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is <code>null</code>, set <var>bufferLength</var> to + <a>render quantum size</a>. </ol> - <li> Otherwise, if the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is <code>null</code>, set - <var>bufferLength</var> to <a>render quantum size</a>. - </ol> - + <li> Otherwise, if the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is not <code>null</code>: <ol> - <li> If {{[[committed frames]]}} + + <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is not <code>null</code> and {{[[committed frames]]}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is less than or equal to the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}}, set - <var>bufferLength</var> to + is less than the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, set <var>bufferLength</var> to {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. <li> Otherwise, set <var>bufferLength</var> to - {{OfflineAudioContext/length}} - - {{[[committed frames]]}}. + {{OfflineAudioContext/length}} - {{[[committed frames]]}}. </ol> - <li> Otherwise, if the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is <code>null</code>, set - <var>bufferLength</var> to <a>render quantum size</a>. </ol> - <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is provided: - <ol> - <li> If {{[[committed frames]]}} + - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is less than or equal to the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}}, set - <var>bufferLength</var> to - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. - <li> Otherwise, set <var>bufferLength</var> to - {{OfflineAudioContext/length}} - - {{[[committed frames]]}}. - </ol> - <li> Otherwise, if the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is <code>null</code>, set - <var>bufferLength</var> to <a>render quantum size</a>. - </ol> + <lI>Let <var>bufferLength</var> be a number initialized to the + result of <a lt="calculate the buffer length for offline rendering">calculating the buffer length for offline rendering</a> given the requested <var>chunkSize</var>. <li> If <var>bufferLength</var> is not a multiple of <a>render quantum size</a>, round it up to the next multiple of @@ -2785,6 +2732,30 @@ Methods</h4> </ol> </div> + <div algorithm="calculate buffer length for offline rendering"> + To <dfn dfn for>calculate the buffer length for offline rendering</dfn> given a requested <var>chunkSize</var>, the following steps MUST be performed on the <a>control thread</a>: + <ol> + <li> If the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is <code>null</code>: + <ol> + <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is <code>null</code>, return <a>render quantum size</a>. + <li> Otherwise, return + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + </ol> + <li> Otherwise, if the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is not <code>null</code>: + <ol> + <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is not <code>null</code> and {{[[committed frames]]}} + + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is less than the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, return + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + <li> Otherwise, return + {{OfflineAudioContext/length}} - {{[[committed frames]]}}. + </ol> + </ol> + </div> + <div algorithm="begin offline rendering"> To <dfn dfn for>begin offline rendering</dfn> for an {{AudioBuffer}} <var>buffer</var>, the following steps MUST happen on a <a>rendering thread</a> that is created for the From 980bcd0522a8ce38c3580d9c5cb089d7b815aac5 Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Fri, 31 Jul 2026 13:57:17 -0700 Subject: [PATCH 07/12] formatting --- index.bs | 49 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/index.bs b/index.bs index e18f870be..c5884fc5c 100644 --- a/index.bs +++ b/index.bs @@ -2673,22 +2673,28 @@ Methods</h4> steps. <li> If {{[[committed frames]]}} is greater than or equal to - {{OfflineAudioContext}}'s {{OfflineAudioContext/length}}, reject <var>promise</var> with - {{InvalidStateError}} and abort these steps. + {{OfflineAudioContext}}'s {{OfflineAudioContext/length}}, reject + <var>promise</var> with {{InvalidStateError}} and abort these + steps. <lI>Let <var>bufferLength</var> be a number initialized to the - value of the {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + value of the + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. <ol> - <li> If the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is <code>null</code>: + <li> If the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is <code>null</code>: <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + <li> If + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is <code>null</code>, set <var>bufferLength</var> to <a>render quantum size</a>. </ol> - <li> Otherwise, if the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is not <code>null</code>: + <li> Otherwise, if the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is not <code>null</code>: <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + <li> If + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is not <code>null</code> and {{[[committed frames]]}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is less than the {{OfflineAudioContext}}'s @@ -2700,7 +2706,10 @@ Methods</h4> </ol> <lI>Let <var>bufferLength</var> be a number initialized to the - result of <a lt="calculate the buffer length for offline rendering">calculating the buffer length for offline rendering</a> given the requested <var>chunkSize</var>. + result of + <a lt="calculate the buffer length for offline rendering"> + calculating the buffer length for offline rendering</a> given + the requested <var>chunkSize</var>. <li> If <var>bufferLength</var> is not a multiple of <a>render quantum size</a>, round it up to the next multiple of @@ -2733,18 +2742,24 @@ Methods</h4> </div> <div algorithm="calculate buffer length for offline rendering"> - To <dfn dfn for>calculate the buffer length for offline rendering</dfn> given a requested <var>chunkSize</var>, the following steps MUST be performed on the <a>control thread</a>: + To <dfn dfn for>calculate the buffer length for offline rendering + </dfn> given a requested <var>chunkSize</var>, the following steps + MUST be performed on the <a>control thread</a>: <ol> - <li> If the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is <code>null</code>: + <li> If the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is <code>null</code>: <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is <code>null</code>, return <a>render quantum size</a>. + <li> If + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + is <code>null</code>, return the <a>render quantum size</a>. <li> Otherwise, return {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. </ol> - <li> Otherwise, if the {{OfflineAudioContext}}'s {{OfflineAudioContext/length}} is not <code>null</code>: + <li> Otherwise, if the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is not <code>null</code>: <ol> - <li> If {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + <li> If + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is not <code>null</code> and {{[[committed frames]]}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is less than the {{OfflineAudioContext}}'s @@ -2757,9 +2772,9 @@ Methods</h4> </div> <div algorithm="begin offline rendering"> - To <dfn dfn for>begin offline rendering</dfn> for an {{AudioBuffer}} <var>buffer</var>, the following steps MUST - happen on a <a>rendering thread</a> that is created for the - occasion. + To <dfn dfn for>begin offline rendering</dfn> for an {{AudioBuffer}} + <var>buffer</var>, the following steps MUST happen on a <a>rendering + thread</a> that is created for the occasion. <ol> From bd3b4f0aa0c926d683d77c7e1f0dc4b6e10f7a3a Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Fri, 31 Jul 2026 14:34:19 -0700 Subject: [PATCH 08/12] Fixing compile errors --- index.bs | 61 ++++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/index.bs b/index.bs index c5884fc5c..3a8fa6e46 100644 --- a/index.bs +++ b/index.bs @@ -2500,7 +2500,7 @@ returned promise with the rendered result as an interface OfflineAudioContext : BaseAudioContext { constructor(OfflineAudioContextOptions contextOptions); constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); - Promise<AudioBuffer> startRendering(optional unsigned long chunkSize? = null); + Promise<AudioBuffer> startRendering(optional unsigned long? chunkSize = null); Promise<undefined> resume(); Promise<undefined> suspend(double suspendTime); Promise<undefined> close(); @@ -2518,7 +2518,7 @@ interface OfflineAudioContext : BaseAudioContext { : <dfn>[[rendered buffers]]</dfn> :: - An ordered list of {{AudioBuffers}} that are being rendered. The initial + An ordered list of {{AudioBuffer}}s that are being rendered. The initial value is an empty list. : <dfn>[[committed frames]]</dfn> @@ -2674,27 +2674,27 @@ Methods</h4> <li> If {{[[committed frames]]}} is greater than or equal to {{OfflineAudioContext}}'s {{OfflineAudioContext/length}}, reject - <var>promise</var> with {{InvalidStateError}} and abort these - steps. + <var>promise</var> with {{InvalidStateError}} and abort these + steps. - <lI>Let <var>bufferLength</var> be a number initialized to the + <li>Let <var>bufferLength</var> be a number initialized to the value of the - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. <ol> <li> If the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is <code>null</code>: + {{OfflineAudioContext/length}} is <code>null</code>: <ol> <li> If - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is <code>null</code>, set <var>bufferLength</var> to <a>render quantum size</a>. </ol> <li> Otherwise, if the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is not <code>null</code>: + {{OfflineAudioContext/length}} is not <code>null</code>: <ol> <li> If - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is not <code>null</code> and {{[[committed frames]]}} + {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} is less than the {{OfflineAudioContext}}'s @@ -2705,11 +2705,11 @@ Methods</h4> </ol> </ol> - <lI>Let <var>bufferLength</var> be a number initialized to the + <li>Let <var>bufferLength</var> be a number initialized to the result of - <a lt="calculate the buffer length for offline rendering"> - calculating the buffer length for offline rendering</a> given - the requested <var>chunkSize</var>. + <a lt="calculate the buffer length for offline rendering"> + calculating the buffer length for offline rendering</a> given + the requested <code>chunkSize</code>. <li> If <var>bufferLength</var> is not a multiple of <a>render quantum size</a>, round it up to the next multiple of @@ -2743,28 +2743,23 @@ Methods</h4> <div algorithm="calculate buffer length for offline rendering"> To <dfn dfn for>calculate the buffer length for offline rendering - </dfn> given a requested <var>chunkSize</var>, the following steps - MUST be performed on the <a>control thread</a>: + </dfn> given a requested <var>chunkSize</var>, the following steps + MUST be performed on the <a>control thread</a>: <ol> <li> If the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is <code>null</code>: + {{OfflineAudioContext/length}} is <code>null</code>: <ol> - <li> If - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is <code>null</code>, return the <a>render quantum size</a>. - <li> Otherwise, return - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + <li> If <var>chunkSize</var> is <code>null</code>, return + the <a>render quantum size</a>. + <li> Otherwise, return <var>chunkSize</var>. </ol> <li> Otherwise, if the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}} is not <code>null</code>: + {{OfflineAudioContext/length}} is not <code>null</code>: <ol> - <li> If - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is not <code>null</code> and {{[[committed frames]]}} + - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}} - is less than the {{OfflineAudioContext}}'s - {{OfflineAudioContext/length}}, return - {{OfflineAudioContext/startRendering(chunkSize)/chunkSize}}. + <li> If <var>chunkSize</var> is not <code>null</code> and + {{[[committed frames]]}} + <var>chunkSize</var> is less than + the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}}, return <var>chunkSize</var>. <li> Otherwise, return {{OfflineAudioContext/length}} - {{[[committed frames]]}}. </ol> @@ -2773,8 +2768,8 @@ Methods</h4> <div algorithm="begin offline rendering"> To <dfn dfn for>begin offline rendering</dfn> for an {{AudioBuffer}} - <var>buffer</var>, the following steps MUST happen on a <a>rendering - thread</a> that is created for the occasion. + <var>buffer</var>, the following steps MUST happen on a <a>rendering + thread</a> that is created for the occasion. <ol> @@ -2996,7 +2991,7 @@ This specifies the options to use in constructing an <xmp class="idl"> dictionary OfflineAudioContextOptions { unsigned long numberOfChannels = 1; - optional unsigned long length? = null; + unsigned long? length = null; required float sampleRate; (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default"; }; From 857f48a208522456fd05522a02424b73ce858e7b Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Fri, 31 Jul 2026 15:58:51 -0700 Subject: [PATCH 09/12] Speculative pr preview fix --- .pr-preview.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pr-preview.json b/.pr-preview.json index 41eb56061..1c0fe5e0d 100644 --- a/.pr-preview.json +++ b/.pr-preview.json @@ -2,6 +2,6 @@ "src_file": "index.bs", "type": "bikeshed", "params": { - "force": 1 + "die-on": "nothing" } } From 7c8e511102e12450bcd55fe43facdda35adc7ef7 Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Wed, 5 Aug 2026 17:31:08 -0700 Subject: [PATCH 10/12] Revert "Speculative pr preview fix" This reverts commit 857f48a208522456fd05522a02424b73ce858e7b. --- .pr-preview.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pr-preview.json b/.pr-preview.json index 1c0fe5e0d..41eb56061 100644 --- a/.pr-preview.json +++ b/.pr-preview.json @@ -2,6 +2,6 @@ "src_file": "index.bs", "type": "bikeshed", "params": { - "die-on": "nothing" + "force": 1 } } From e8787d2b9192b327e32520b1bf4ad2aeb1718edb Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Wed, 5 Aug 2026 19:36:34 -0700 Subject: [PATCH 11/12] check length --- index.bs | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/index.bs b/index.bs index 4ecfe2ac4..3d39bbaf3 100644 --- a/index.bs +++ b/index.bs @@ -2673,7 +2673,9 @@ Methods</h4> <var>promise</var> with {{InvalidStateError}} and abort these steps. - <li> If {{[[committed frames]]}} is greater than or equal to + <li> If the {{OfflineAudioContext}}'s + {{OfflineAudioContext/length}} is not <code>null</code> and + {{[[committed frames]]}} is greater than or equal to {{OfflineAudioContext}}'s {{OfflineAudioContext/length}}, reject <var>promise</var> with {{InvalidStateError}} and abort these steps. @@ -2802,17 +2804,22 @@ Methods</h4> {{[[rendered frames]]}} and the {{AudioBuffer/length}} of <var>buffer</var>. - <li> if {{[[rendered frames]]}} is greater than or equal - to {{OfflineAudioContext/length}}, - <a>Queue a control message</a> to close the - {{OfflineAudioContext}}. - - <li>If {{OfflineAudioContext/length}} is not - <code>null</code>, [=Queue a media element task=] to - [=fire an event=] named {{OfflineAudioContext/complete}} - at the {{OfflineAudioContext}} using - {{OfflineAudioCompletionEvent}} whose `renderedBuffer` - property is set to <var>buffer</var>. + <li> If {{OfflineAudioContext/length}} is not <code>null</code>: + + <ol> + <li> If {{[[rendered frames]]}} is greater than or + equal to {{OfflineAudioContext/length}}, + <a>Queue a control message</a> to close the + {{OfflineAudioContext}}. + + <li> [=Queue a media element task=] to + [=fire an event=] named + {{OfflineAudioContext/complete}} at the + {{OfflineAudioContext}} using + {{OfflineAudioCompletionEvent}} whose + `renderedBuffer` property is set to + <var>buffer</var>. + </ol> </ol> From 257a31c1bebda6be150ae7ff2b315189b2b2c933 Mon Sep 17 00:00:00 2001 From: Gabriel Brito <gabrielbrito@microsoft.com> Date: Wed, 5 Aug 2026 19:39:10 -0700 Subject: [PATCH 12/12] Undo pr-preview.json modification --- .pr-preview.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pr-preview.json b/.pr-preview.json index 41eb56061..1c0fe5e0d 100644 --- a/.pr-preview.json +++ b/.pr-preview.json @@ -2,6 +2,6 @@ "src_file": "index.bs", "type": "bikeshed", "params": { - "force": 1 + "die-on": "nothing" } }