백그라운드 가져오기

커뮤니티 그룹 보고서 초안,

이번 버전:
https://wicg.github.io/background-fetch/
이슈 추적:
GitHub
사양 내 인라인
편집자:
(Google)
(Google)

요약

사용자가 볼 수 있는 상태에서 대용량 업로드/다운로드를 백그라운드에서 처리하기 위한 API.

이 문서의 상태

본 사양은 웹 플랫폼 인큐베이터 커뮤니티 그룹에서 발행되었습니다. 이는 W3C 표준이 아니며 W3C 표준 트랙에 포함되지 않습니다. W3C 커뮤니티 기여자 라이선스 계약(CLA)하에 제한된 옵트아웃 및 기타 조건이 적용됩니다. W3C 커뮤니티 및 비즈니스 그룹에 대해 더 알아보세요.

1. 소개

서비스 워커는 오리진 저장소에 의해 제한될 뿐, 자산의 가져오기 및 캐싱을 수행할 수 있습니다. 하지만 사용자가 사이트를 떠나거나 브라우저를 닫으면 서비스 워커가 종료될 가능성이 있습니다. 이는 waitUntil()에 전달된 약속이 몇 분 안에 해결되지 않은 경우에도 발생할 수 있으며, 브라우저가 이를 서비스 워커의 남용으로 간주하고 프로세스를 종료할 수 있습니다.

이는 배터리 및 프라이버시 측면에서는 훌륭하지만, 팟캐스트 및 영화와 같은 대용량 자산의 다운로드 및 캐싱, 비디오 및 이미지 업로드는 어렵게 만듭니다.

이 사양은 다음을 목표로 합니다:

2. 영역

모든 플랫폼 객체는 별도의 명시가 없는 한 컨텍스트 객체관련 영역에서 생성됩니다.

3. 인프라

사용자 에이전트가 리소스가 곧 사용 가능해질 것이라고 판단하는 경우 리소스는 일시적으로 사용 불가로 간주됩니다. 원인은 다음과 같습니다:

백그라운드 가져오기 작업 소스작업 소스입니다.

eventLoop에 선택적으로 (기본값은 호출자의 컨텍스트 객체관련 설정 객체책임 있는 이벤트 루프) bgfetch 작업을 큐에 추가하려면, steps(단계)를 사용하여 eventLoop작업을 큐에 추가한 다음 백그라운드 가져오기 작업 소스를 사용하여 steps를 실행합니다.

3.1. 서비스 워커 등록 확장

서비스 워커 등록에는 추가적으로 다음이 포함됩니다:

3.2. 백그라운드 가져오기

백그라운드 가져오기는 다음으로 구성됩니다:

백그라운드 가져오기 (bgFetch)의 저장된 본문 바이트 총합을 얻으려면, 다음 단계를 실행합니다:
  1. total을 0으로 설정합니다.

  2. bgFetch기록record에 대해:

    1. totalrecord응답 데이터길이 값을 증가시킵니다.

  3. total을 반환합니다.

3.2.1. 디스플레이

백그라운드 가져오기 (bgFetch)를 주어진 environment (환경 설정 객체)에 대해 표시하려면, 사용자 에이전트는 다음 규칙을 따르는 사용자 인터페이스를 표시해야 합니다:

permission권한 상태로 설정합니다. PermissionDescriptor이름"background-fetch"environment를 포함합니다. 만약 permission"prompt"라면, 사용자 에이전트는 이 알고리즘의 시작에서 bgFetch일시 정지 플래그를 설정할 수 있습니다. 사용자 에이전트는 사용자가 백그라운드 가져오기를 수락하거나 (bgFetch일시 정지 플래그를 해제) 거부 (bgFetch모든 중단 플래그를 설정)할 수 있도록 허용해야 합니다. 사용자 에이전트는 항상 허용 및 항상 거부 옵션을 제공할 수도 있으며, 이는 이 권한에 대한 사용자의 의도에 대한 새로운 정보로 사용될 수 있습니다.

사용자가 미터링 연결 상태에 있거나 백그라운드에서 백그라운드 가져오기가 시작된 경우, 사용자 에이전트는 bgFetch일시 정지 플래그를 설정하는 것도 고려할 수 있습니다.

3.3. 백그라운드 가져오기 기록

백그라운드 가져오기 기록은 다음으로 구성됩니다:

3.4. 백그라운드 가져오기 응답

백그라운드 가져오기 응답은 다음으로 구성됩니다:

응답결과가 빈 문자열, "success" 또는 "bad-status"일 경우 노출될 수 있습니다.

4. 알고리즘

4.1. 백그라운드 가져오기 수행

참고: 이것은 백그라운드 가져오기 작업의 '백그라운드' 부분을 관리하는 알고리즘입니다. 각 백그라운드 가져오기당 하나의 알고리즘 인스턴스만 실행됩니다.

백그라운드 가져오기 수행bgFetch (백그라운드 가져오기)에 대해 실행하려면, 다음 단계를 따르십시오:
  1. swRegistrationbgFetch서비스 워커 등록으로 설정합니다.

  2. settledFetches를 0으로 설정합니다.

  3. immediateFailure를 false로 설정합니다.

  4. failureReason을 빈 문자열로 설정합니다.

  5. record에 대해 bgFetch기록에서 다음 단계를 병렬로 실행합니다:

    1. 기록 완료bgFetchrecord에 대해 실행합니다.

    2. resultrecord응답 데이터결과로 설정합니다.

    3. 만약 failureReason이 빈 문자열이 아니라면:

      1. 단언: result"redundant"가 아닙니다.

      2. failureReasonresult로 설정합니다.

    4. settledFetches를 1씩 증가시킵니다.

    5. 만약 result"download-total-exceeded"라면, immediateFailure를 true로 설정합니다.

  6. settledFetchesbgFetch기록크기와 같아지거나, immediateFailure가 true가 될 때까지 기다립니다.

  7. 만약 immediateFailure가 true라면, bgFetch모든 중단 플래그를 설정합니다.

    참고: 기록 완료 알고리즘은 이 플래그를 수신하고 설정되면 가져오기를 종료합니다.

  8. 다음 단계를 큐에 추가하여 swRegistration활성 백그라운드 가져오기 편집 큐에 실행합니다:

    1. activeBgFetchesswRegistration활성 백그라운드 가져오기로 설정합니다.

    2. idbgFetchid로 설정합니다.

    3. 만약 activeBgFetches백그라운드 가져오기 포함 bgFetch를 포함하고 있다면, activeBgFetches[id]를 제거합니다.

    4. 그렇지 않으면, failureReason"aborted"로 설정합니다.

      참고: 이것은 abort()가 성공적으로 호출되었지만 동시에 가져오기가 실패한 경우의 경쟁 조건을 처리합니다. 만약 우리가 abort()에서 true를 반환했다면, 이는 관련 중단 이벤트를 실행하도록 보장합니다.

    5. 만약 failureReason이 빈 문자열이 아니라면:

      1. bgFetch결과"failure"로 설정합니다.

      2. bgFetch실패 이유failureReason으로 설정합니다.

    6. 그렇지 않으면, bgFetch결과"success"로 설정합니다.

    7. 백그라운드 가져오기 인스턴스 업데이트bgFetch에 대해 실행합니다.

    8. eventName을 빈 문자열로 설정합니다.

    9. eventConstructor를 null로 설정합니다.

    10. 만약 failureReason"aborted"라면:

      1. eventName을 "backgroundfetchabort"로 설정합니다.

      2. eventConstructorBackgroundFetchEvent로 설정합니다.

    11. 그렇지 않고, failureReason이 빈 문자열이 아니라면:

      1. eventName을 "backgroundfetchfail"로 설정합니다.

      2. eventConstructorBackgroundFetchUpdateUIEvent로 설정합니다.

    12. 그 외의 경우:

      1. eventName을 "backgroundfetchsuccess"로 설정합니다.

      2. eventConstructorBackgroundFetchUpdateUIEvent로 설정합니다.

    13. 기능적 이벤트 실행eventName으로 실행하고, eventConstructor를 사용하여 swRegistration에서 다음 속성과 함께 실행합니다:

      registration

      이벤트 객체의 관련 영역에서 bgFetch에 대한 BackgroundFetchRegistration 인스턴스 가져오기의 결과.

      그런 다음 dispatchedEvent를 사용하여 다음 단계를 병렬로 실행합니다:

      1. dispatchedEvent활성이 아닐 때까지 기다립니다.

        ServiceWorker/1348.

      2. bgFetch기록 사용 가능 플래그를 해제합니다.

      3. 백그라운드 가져오기 인스턴스 업데이트bgFetch에 대해 실행합니다.

4.2. 레코드 완료

참고: 이 알고리즘은 백그라운드 패치 레코드의 가져오기를 관리합니다. 이 알고리즘의 인스턴스는 백그라운드 패치 레코드마다 시작되며, 가져오기를 재시도하거나 부분 응답의 다음 부분을 가져오기 위해 재귀적으로 호출됩니다.

레코드를 완료 하기 위해 bgFetch (백그라운드 패치)와 record (백그라운드 패치 레코드)에 대해 다음 단계를 실행합니다:
  1. responseDatarecord응답 데이터로 설정합니다.

  2. downloadTotalbgFetch총 다운로드 크기로 설정하되, 0인 경우에는 무한대로 설정합니다.

  3. bgFetch중단 플래그가 해제되기를 기다립니다.

  4. requestrecord요청의 복사본으로 설정합니다.

    참고: 이 시점에서 요청은 스트림으로 시작되었더라도 완전히 저장소에 보관됩니다.

  5. request유지 플래그를 설정합니다.

  6. request서비스 워커 모드를 "none"으로 설정합니다.

  7. rangeStartresponseData길이로 설정합니다.

  8. 만약 rangeStart가 0이 아니라면, request에 대해 범위 헤더를 추가합니다.

    참고: rangeStart가 0인 경우, 일반 요청이 이루어집니다. 이렇게 하면 범위 헤더가 있는 요청에 Accept-Encoding: identity가 추가되므로 초기 요청이 콘텐츠 인코딩을 활용할 수 있습니다.

  9. fetchAttemptComplete를 false로 설정합니다.

  10. lastTransmittedSize를 0으로 설정합니다.

  11. Fetch request.

    이 단계의 나머지는 fetch "콜백"을 사용하며, 현재는 작업을 대기열에 추가합니다. 이는 여기에서 바람직하지 않거나 가능하지 않으므로 작업이 대기열에 추가되지 않는다고 가정합니다. (issue)

    request에 대한 요청 본문 처리를 실행하려면, 다음 단계를 실행합니다:

    1. transmittedSizerequest본문전송된 바이트로 설정합니다.

    2. bgFetch업로드됨transmittedSize 빼기 lastTransmittedSize만큼 증가시킵니다.

    3. lastTransmittedSizetransmittedSize로 설정합니다.

    4. 백그라운드 패치 인스턴스 업데이트bgFetch에 대해 실행합니다.

    response에 대한 응답 처리를 실행하려면, 다음 단계를 실행합니다:

    1. 만약 response네트워크 오류라면:

      1. 만약 리소스가 일시적으로 사용할 수 없음이고 request메서드가 `GET`이라면, 리소스가 일시적으로 사용할 수 없음이 아닐 때까지 기다린 다음, fetchAttemptComplete를 true로 설정하고 이 단계를 중단합니다.

        참고: 만약 request메서드가 `GET`이 아니라면, 요청을 다시 보내면 원치 않는 부작용이 발생할 수 있습니다. 요청을 재개하는 표준 메서드가 제공되면 여기에서 채택될 것입니다.

      2. 만약 response중단된 네트워크 오류라면, responseData결과"aborted"로 설정하고, 그렇지 않으면 "fetch-error"로 설정합니다.

      3. fetchAttemptComplete를 true로 설정하고 이 단계를 중단합니다.

    2. 만약 response상태206이라면:

      1. 만약 부분 응답 유효성 검사rangeStart, response, 그리고 responseData응답에 대해 유효하지 않음을 반환한다면:

        1. responseData결과"fetch-error"로 설정합니다.

        2. fetchAttemptComplete를 true로 설정합니다.

        3. 진행 중인 fetch 종료를 실행하고 이 단계를 중단합니다.

    3. 그렇지 않다면:

      1. responseData결과"redundant"로 설정합니다.

      2. responseData를 새로운 백그라운드 패치 응답으로 설정합니다.

      3. record응답 데이터responseData로 설정합니다.

        참고: 레코드 객체 생성 알고리즘은 이전의 백그라운드 패치 응답에 대한 참조를 보유할 수 있습니다.

      4. 백그라운드 패치 인스턴스 업데이트bgFetch에 대해 실행합니다.

    4. 만약 rangeStart가 0이거나 response상태206이 아니라면, responseData응답response의 복사본으로 설정하되, 본문은 제외합니다.

    5. streamresponse 본문스트림으로 설정합니다.

    6. 하나 이상의 바이트가 stream에서 전송될 때마다 bytes를 전송된 바이트로 설정하고 다음 단계를 실행합니다:

      1. 만약 bgFetch저장된 본문 바이트 총합 더하기 bytes의 크기가 downloadTotal보다 크다면:

        1. 취소 stream.

        2. responseData결과"download-total-exceeded"로 설정하고, fetchAttemptComplete를 true로 설정하고 이 단계를 중단합니다.

      2. bytesresponseData바이트에 추가합니다.

      3. 할당량 제한 초과로 인해 이전 단계가 실패하면 responseData결과"quota-exceeded"로 설정하고, fetchAttemptComplete를 true로 설정하고 이 단계를 중단합니다.

      4. 백그라운드 패치 인스턴스 업데이트bgFetch에 대해 실행합니다.

    7. 어느 시점에서든 stream에 대한 바이트 전송이 정상적으로 완료되면:

      1. 만약 response상태206이라면:

        1. firstBytePos, lastBytePos, 그리고 completeLengthresponse에서 콘텐츠 범위 값 추출의 결과로 설정합니다.

        2. 만약 completeLength가 null이 아니고 responseData길이와 같다면 바이트, responseData결과"success"로 설정합니다.

          참고: 전체 리소스 또는 나머지 리소스를 요청하지만 서버가 나머지를 반환하지 않았을 수 있으며, 이 경우 추가 요청을 해야 합니다.

      2. 그렇지 않고 response상태정상 상태가 아니라면 responseData결과"bad-status"로 설정합니다.

      3. 그렇지 않으면 responseData결과"success"로 설정합니다.

      4. fetchAttemptComplete를 true로 설정합니다.

    8. 어느 시점에서든 stream오류 발생하면:

      1. 만약 리소스가 일시적으로 사용할 수 없음이고 request메서드가 `GET`이라면, 리소스가 일시적으로 사용할 수 없음이 아닐 때까지 기다린 다음, fetchAttemptComplete를 true로 설정합니다.

      2. 그렇지 않으면 responseData결과"fetch-error"로 설정하고 fetchAttemptComplete를 true로 설정합니다.

  12. result를 빈 문자열로 설정합니다.

  13. 다음 단계를 실행하되, bgFetch일시 중지 플래그 또는 모두 중단 플래그가 설정되면 중단합니다:

    1. fetchAttemptComplete가 true가 될 때까지 기다립니다.

    2. resultresponseData결과로 설정합니다.

  14. 중단된 경우:

    1. 만약 bgFetch일시 중지 플래그가 설정되어 있다면, request메서드가 `GET`임을 확인합니다.

    2. 만약 bgFetch모두 중단 플래그가 설정되어 있다면, responseData결과"aborted"로 설정합니다.

    3. resultresponseData결과로 설정합니다.

      참고: fetch를 종료하면 결과가 변경될 수 있으므로 결과가 지금 저장됩니다.

    4. 진행 중인 fetch 종료를 실행합니다.

  15. 만약 result가 빈 문자열이라면, bgFetchrecord에 대해 레코드 완료를 실행합니다.

4.3. 백그라운드 패치 인스턴스 업데이트

백그라운드 패치 인스턴스 업데이트bgFetch (백그라운드 패치)에 대해 실행하려면, bgFetch업데이트 처리 큐다음 단계를 대기열에 추가합니다:
  1. downloadedbgFetch저장된 본문 바이트 총합으로 설정합니다.

  2. uploadedbgFetch업로드됨으로 설정합니다.

  3. resultbgFetch결과로 설정합니다.

  4. failureReasonbgFetch실패 이유로 설정합니다.

  5. recordsAvailablebgFetch레코드 사용 가능 플래그가 설정되어 있으면 true로, 그렇지 않으면 false로 설정합니다.

  6. bgFetch서비스 워커 등록범위 URL출처와 동일한 환경 설정 객체 env 각각에 대해 env책임 이벤트 루프에서 bgfetch 작업을 대기열에 추가하여 다음 단계를 실행합니다:

    1. bgFetchRegistrationBackgroundFetchRegistration관련 영역 내에서 백그라운드 패치bgFetch와 동일한 인스턴스로 설정하고, 존재하지 않으면 null로 설정합니다.

      참고: BackgroundFetchRegistration 인스턴스 가져오기 알고리즘으로 인해 환경당 최대 하나만 존재합니다.

    2. 만약 bgFetchRegistration이 null이라면 이 단계를 중단합니다.

    3. 만약 recordsAvailable이 false이고 bgFetchRegistration레코드 사용 가능 플래그가 설정되어 있다면, bgFetchRegistration레코드 사용 가능 플래그를 해제합니다.

    4. 만약 bgFetchRegistration결과가 빈 문자열이 아니라면 이 단계를 중단합니다.

      참고: 이는 백그라운드 패치가 완료된 후 진행 상황이 보고되는 것을 방지합니다. 작업이 중단되었으나 일부 패치가 아직 종료되지 않은 경우에 가능합니다.

    5. 다음 조건이 모두 true라면:

      • bgFetchRegistration다운로드됨downloaded와 동일합니다.

      • bgFetchRegistration업로드됨uploaded와 동일합니다.

      • bgFetchRegistration결과result와 동일합니다.

      • bgFetchRegistration실패 이유failureReason와 동일합니다.

      그렇다면 이 단계를 중단합니다.

    6. bgFetchRegistration다운로드됨downloaded로 설정합니다.

    7. bgFetchRegistration업로드됨uploaded로 설정합니다.

    8. bgFetchRegistration결과result로 설정합니다.

    9. bgFetchRegistration실패 이유failureReason로 설정합니다.

    10. "progress"라는 이름의 이벤트를 bgFetchRegistration에서 발생시킵니다.

    이 작업은 마우스 이동 이벤트 디바운스와 유사하게 디바운스가 필요합니다.

4.4. 백그라운드 패치 클릭 이벤트 발생

백그라운드 패치 클릭 이벤트 발생bgFetch (백그라운드 패치)에 대해 실행하려면, "backgroundfetchclick"라는 이름의 기능적 이벤트BackgroundFetchEvent를 사용하여 bgFetch서비스 워커 등록에서 다음 속성으로 발생시킵니다:
registration

이벤트 객체의 관련 영역에서 bgFetch에 대해 BackgroundFetchRegistration 인스턴스를 가져오는 결과.

4.5. BackgroundFetchRegistration 인스턴스 가져오기

참고: 이 알고리즘은 백그라운드 패치에 대해 BackgroundFetchRegistration 인스턴스가 BackgroundFetchManager의 수명 동안 동일하게 유지되도록 보장합니다. 브라우저는 더 이상 하나의 인스턴스가 생성되었음을 알 수 없는 경우(예: 동등성, 확장 또는 약하게 연결된 데이터 등)를 조건으로 최적화할 수 있습니다.

BackgroundFetchRegistration 인스턴스 가져오기realm (Realm)의 bgFetch (백그라운드 패치)에 대해 실행하려면, 다음 단계를 실행합니다:
  1. instancesMap를 이 realm 내의 BackgroundFetchManagerBackgroundFetchRegistration 인스턴스로 설정합니다.

  2. 만약 instancesMap[bgFetch]가 존재한다면, instancesMap[bgFetch]를 반환합니다.

  3. instancerealm 내의 새로운 BackgroundFetchRegistration로 설정하고, 백그라운드 패치bgFetch로 설정합니다.

  4. instancesMap[bgFetch]를 instance로 설정합니다.

  5. instance를 반환합니다.

4.6. 부분 응답 유효성 검사

참고: 이 알고리즘은 부분 응답이 요청된 내용과 합리적으로 일치하는지 확인하고, 선택적으로 이전 응답과 결합해야 하는지 확인합니다.

부분 응답 유효성 검사expectedRangeStart (숫자), partialResponse (응답), 그리고 선택적인 previousResponse (응답 또는 null, 명시되지 않은 경우 null)에서 실행하려면, 다음 단계를 실행합니다:
  1. 단언: partialResponse상태206입니다.

  2. responseFirstBytePos, responseLastBytePos, 그리고 responseCompleteLengthpartialResponse에서 콘텐츠 범위 값 추출의 결과로 설정합니다. 이 작업이 실패하면, 유효하지 않음을 반환합니다.

  3. 만약 responseFirstBytePosexpectedRangeStart와 같지 않다면, 유효하지 않음을 반환합니다.

  4. 만약 previousResponse가 null이 아니라면, 다음을 실행합니다:

    1. « `ETag`, `Last-Modified` »의 각 headerName에 대해:

      1. 만약 previousResponse헤더 목록headerName을 포함하고, previousResponse헤더 목록결합된 headerName의 값이 partialResponse헤더 목록결합된 headerName의 값과 같지 않다면, 유효하지 않음을 반환합니다.

    2. 만약 previousResponse상태206이라면:

      1. previousResponseFirstBytePos, previousResponseLastBytePos, 그리고 previousResponseCompleteLengthpreviousResponse에서 콘텐츠 범위 값 추출의 결과로 설정합니다. 이 작업이 실패하면, 유효하지 않음을 반환합니다.

      2. 만약 previousResponseCompleteLength가 null이 아니고, responseCompleteLengthpreviousResponseCompleteLength와 같지 않다면, 유효하지 않음을 반환합니다.

  5. 유효함을 반환합니다.

4.7. 콘텐츠 범위 값 추출

참고: 이 알고리즘은 `Content-Range`를 단일 바이트 콘텐츠 범위로 구문 분석하고 값을 추출합니다.

콘텐츠 범위 값 추출response (응답)에서 실행하려면, 다음 단계를 실행합니다:
  1. 만약 response헤더 목록이 `Content-Range`를 포함하지 않는다면, 실패를 반환합니다.

  2. contentRangeValueresponse헤더 목록에서 헤더으로 설정합니다. 이때 이름은 `Content-Range`와 바이트 대소문자 무시 일치여야 합니다.

  3. 만약 contentRangeValue단일 바이트 콘텐츠 범위로 구문 분석하는 데 실패하면, 실패를 반환합니다.

  4. firstBytePoscontentRangeValue에서 단일 바이트 콘텐츠 범위로 분석된 값 중 first-byte-pos에 해당하는 부분으로 설정하고, 정수로 구문 분석합니다.

  5. lastBytePoscontentRangeValue에서 단일 바이트 콘텐츠 범위로 분석된 값 중 last-byte-pos에 해당하는 부분으로 설정하고, 정수로 구문 분석합니다.

  6. completeLengthcontentRangeValue에서 단일 바이트 콘텐츠 범위로 분석된 값 중 complete-length에 해당하는 부분으로 설정합니다.

  7. 만약 completeLength"*"라면, completeLength를 null로 설정하고, 그렇지 않으면 completeLength를 정수로 구문 분석하여 설정합니다.

  8. firstBytePos, lastBytePos, 그리고 completeLength를 반환합니다.

정수로 구문 분석 infra/189.

4.8. 레코드 객체 생성

참고: 이 알고리즘은 백그라운드 패치 레코드를 위한 플랫폼 객체를 생성합니다. 또한 저장된 바이트로부터 응답의 스트리밍을 관리합니다. 이 시점에서 백그라운드 패치 작업이 여전히 진행 중일 수 있습니다.

레코드 객체 생성records (목록백그라운드 패치 레코드)에서 realm (Realm)에 대해 실행하려면, 다음 단계를 실행합니다:

모든 플랫폼 객체는 realm에서 생성되어야 합니다.

  1. recordObjects를 새로운 목록으로 설정합니다.

  2. records의 각 record에 대해:

    1. responseDatarecord응답 데이터로 설정합니다.

    2. recordObject를 새로운 BackgroundFetchRecord로 설정합니다.

    3. recordObjectresponseReady새로운 promise로 설정합니다.

    4. requestObject를 다음으로 설정된 새로운 Request 객체로 설정합니다:

      Request

      record요청의 복사본. 본문 포함.

      헤더

      이 요청과 연결된 새로운 Headers 객체. 요청헤더 목록과 관련됨.

    5. recordObjectrequestrequestObject로 설정합니다.

    6. transmittedBytes를 0으로 설정합니다.

    7. stream새로운 읽기 가능한 스트림으로 설정하며, pull 작업을 실행하고 다음을 병렬로 실행하여 새로운 promise promise를 반환합니다:

      1. responseData길이transmittedBytes보다 크거나, responseData결과가 빈 문자열이 아닌 경우를 대기합니다.

      2. bytes를 null로 설정합니다.

      3. 만약 responseData길이transmittedBytes보다 크고 responseData공개될 수 있다면:

        1. bytesresponseData바이트의 사용자 에이전트가 결정한 슬라이스로 설정하며, transmittedBytes의 오프셋에서 시작합니다.

          참고: 이는 사용자 에이전트가 적절한 속도로 저장소에서 리소스를 스트리밍할 수 있도록 합니다.

        2. bytes길이만큼 transmittedBytes를 증가시킵니다.

      4. 작업을 대기열에 추가하고 stream관련 설정 객체책임 이벤트 루프에서 실행합니다:

        1. 만약 bytes가 null이 아니라면:

          1. arraybytes의 새 Uint8Array로 설정합니다.

          2. 배열을 추가하여 stream에 대기열에 넣습니다.

        2. 만약 responseData공개될 수 있고, responseData결과가 빈 문자열이 아니며, transmittedBytesresponseData바이트길이와 동일하다면, 스트림을 닫습니다.

        3. 그렇지 않고 responseData결과"aborted"라면, 스트림을 오류로 설정하고 AbortError DOMException를 발생시킵니다.

        4. 그렇지 않고 responseData공개될 수 없다면, 스트림을 오류로 설정하고 TypeError를 발생시킵니다.

        5. promise를 완료합니다.

    8. 다음 단계를 병렬로 실행합니다:

      1. responseData응답이 null이 아닌 상태로 대기합니다.

      2. 만약 responseData공개될 수 있다면:

        1. responseresponseData응답의 복사본으로 설정합니다.

        2. response의 헤더 목록에서 `Content-Range`를 삭제합니다.

        3. response의 헤더 목록에서 `Content-Length`를 삭제합니다.

        4. body를 새로운 본문으로 설정하며, 스트림stream으로 설정합니다.

        5. response본문body로 설정합니다.

        6. recordObject작업 대기열에서 실행합니다:

          1. responseObject를 새로운 Response 객체로 설정:

            응답

            response.

            헤더

            이 응답과 연결된 새로운 Headers 객체.

          2. promise 완료를 실행하여 recordObjectresponseReadyresponseObject로 설정합니다.

      3. 그렇지 않고 responseData결과"aborted"라면, promise 거부를 실행하여 recordObjectresponseReady를 설정하고 AbortError를 발생시킵니다.

      4. 그렇지 않으면, promise 거부를 실행하여 recordObjectresponseReady를 설정하고 TypeError를 발생시킵니다.

    9. 레코드 객체 추가를 실행하여 recordObjectrecordObjects에 삽입합니다.

  3. recordObjects를 반환합니다.

4.9. 백그라운드 패치 포함 여부

map ()이 bgFetch (백그라운드 패치)를 포함하는지 확인하려면, 다음 단계를 실행합니다:
  1. idbgFetchid로 설정합니다.

  2. 만약 map[id]가 존재하지 않는다면, false를 반환합니다.

  3. 만약 map[id]가 bgFetch와 같지 않다면, false를 반환합니다.

  4. true를 반환합니다.

map ()이 bgFetch (백그라운드 패치)를 포함하지 않는지 확인하려면, 다음 단계를 실행합니다:
  1. 만약 mapbgFetch포함 한다면, false를 반환합니다.

  2. true를 반환합니다.

5. 헤더 문법

다음은 HTTP ABNF로 작성된 단일 바이트 콘텐츠 범위입니다:

"bytes=" first-byte-pos "-" last-byte-pos "/" complete-length
first-byte-pos = 1*DIGIT
last-byte-pos  = 1*DIGIT
complete-length = ( 1*DIGIT / "*" )

참고: 이는 RFC 7233에서 허용하는 것의 하위 집합입니다.

위 내용을 철도 다이어그램으로 표현한 예:

"bytes=" first-byte-pos digit /first-byte-pos "/" last-byte-pos digit /last-byte-pos "/" complete-length "*" digit /complete-length

6. API

6.1. ServiceWorkerGlobalScope에 대한 확장

partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onbackgroundfetchsuccess;
  attribute EventHandler onbackgroundfetchfail;
  attribute EventHandler onbackgroundfetchabort;
  attribute EventHandler onbackgroundfetchclick;
};

6.1.1. 이벤트

다음은 모든 ServiceWorker 인터페이스를 구현하는 객체에서 이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 해당 이벤트 핸들러 이벤트 유형입니다:

이벤트 핸들러 이벤트 유형 이벤트 핸들러 인터페이스
backgroundfetchsuccess onbackgroundfetchsuccess BackgroundFetchUpdateUIEvent
backgroundfetchfail onbackgroundfetchfail BackgroundFetchUpdateUIEvent
backgroundfetchabort onbackgroundfetchabort BackgroundFetchEvent
backgroundfetchclick onbackgroundfetchclick BackgroundFetchEvent

6.2. ServiceWorkerRegistration에 대한 확장

partial interface ServiceWorkerRegistration {
  readonly attribute BackgroundFetchManager backgroundFetch;
};

ServiceWorkerRegistration에는 백그라운드 패치 관리자 (BackgroundFetchManager)가 있습니다. 초기에는 서비스 워커 등록문맥 객체서비스 워커 등록인 새로운 BackgroundFetchManager로 설정됩니다.

backgroundFetch 속성의 getter는 문맥 객체백그라운드 패치 관리자를 반환해야 합니다.

6.3. BackgroundFetchManager

[Exposed=(Window,Worker)]
interface BackgroundFetchManager {
  Promise<BackgroundFetchRegistration> fetch(DOMString id, (RequestInfo or sequence<RequestInfo>) requests, optional BackgroundFetchOptions options = {});
  Promise<BackgroundFetchRegistration?> get(DOMString id);
  Promise<sequence<DOMString>> getIds();
};

dictionary BackgroundFetchUIOptions {
  sequence<ImageResource> icons;
  DOMString title;
};

dictionary BackgroundFetchOptions : BackgroundFetchUIOptions {
  unsigned long long downloadTotal = 0;
};

BackgroundFetchManager에는 다음이 포함됩니다:

6.3.1. fetch()

fetch(id, requests, options) 메서드를 호출하면 다음 단계를 실행합니다:
  1. registration문맥 객체서비스 워커 등록으로 설정합니다.

  2. records를 새로운 목록으로 설정합니다.

  3. uploadTotal을 0으로 설정합니다.

  4. 만약 requestsRequestInfo라면, requests를 « requests »로 설정합니다.

  5. 만약 requests비어있다면, promise를 거부하고 TypeError를 반환합니다.

  6. requestsrequest에 대해:

    1. internalRequestrequest를 사용하여 Request 생성자를 호출한 결과의 request로 설정합니다. 예외가 발생하면 promise를 거부하고 예외를 반환합니다.

    2. 만약 internalRequestmode가 "no-cors"라면, promise를 거부하고 TypeError를 반환합니다.

    3. internalRequestclient를 null로 설정합니다.

    4. record를 새로운 백그라운드 패치 레코드로 설정합니다.

    5. recordrequestinternalRequest로 설정합니다.

    6. 레코드 추가를 실행하여 recordrecords에 추가합니다.

  7. promise새로운 promise로 설정합니다.

  8. 다음 단계를 대기열에 추가하여 registration활성 백그라운드 패치 편집 큐에서 실행합니다:

    1. permissionPermissionDescriptorname "background-fetch", 그리고 문맥 객체관련 설정 객체에 대한 권한 상태로 설정합니다.

    2. 만약 permission"denied"라면, promiseNotAllowedError DOMException로 거부하고 이 단계를 중단합니다.

    3. bgFetchMapregistration활성 백그라운드 패치로 설정합니다.

    4. 만약 registration활성 워커가 null이라면, promiseTypeError로 거부하고 이 단계를 중단합니다.

    5. 만약 bgFetchMap[id] 존재한다면, promise를 거부하고 TypeError를 반환합니다.

    6. requestBodiesRemainingrequests크기로 설정합니다.

    7. requestReadFailed를 false로 설정합니다.

    8. requestsrequest에 대해:

      1. 만약 request본문이 null이라면, 다음으로 계속.

      2. streamrequest본문스트림으로 설정합니다.

      3. 다음 단계를 병렬로 실행합니다:

        1. 다음 단계를 실행하지만 중단 조건requestReadFailed가 true일 때 실행합니다:

          1. request본문대기합니다.

          2. 만약 stream오류라면, requestReadFailed를 true로 설정합니다.

        2. uploadTotalrequest본문총 바이트만큼 증가시킵니다.

        3. requestBodiesRemaining을 1 감소시킵니다.

    9. 어느 시점에서든 requests 저장이 할당량 제한 초과로 실패하면, promise를 거부하고 QuotaExceededError DOMException를 반환합니다.

    10. requestBodiesRemaining이 0이 되거나 requestReadFailed가 true가 될 때까지 대기합니다.

    11. 만약 requestReadFailed가 true라면, promise를 거부하고 TypeError를 반환합니다.

    12. bgFetch를 새로운 백그라운드 패치로 설정하며 다음을 포함합니다:

      id

      id.

      records

      records.

      총 다운로드

      optionsdownloadTotal 멤버.

      총 업로드

      uploadTotal.

      아이콘

      존재하면 optionsicons 멤버, 그렇지 않으면 빈 목록.

      제목

      존재하면 optionstitle 멤버, 그렇지 않으면 빈 문자열.

      서비스 워커 등록

      registration.

    13. bgFetchMap[id]을 bgFetch로 설정합니다.

    14. bgfetch 작업을 대기열에 추가하고 다음 단계를 실행합니다:

      1. promise를 완료하고 BackgroundFetchRegistration 인스턴스를 가져옵니다 bgFetch와 관련된 문맥 객체관련 Realm에서.

    15. 병렬로 실행하고 bgFetch를 표시하며 문맥 객체관련 설정 객체를 사용합니다.

    16. 병렬로 실행하고 백그라운드 패치를 수행하며 bgFetch를 사용합니다.

  9. promise를 반환합니다.

6.3.2. get()

get(id) 메서드가 호출되면, 새로운 promise promise를 반환하고 다음 단계를 병렬로 실행합니다:
  1. registration문맥 객체의 관련된 서비스 워커 등록으로 설정합니다.

  2. bgFetchregistration활성 백그라운드 패치[id]로 설정합니다.

  3. 만약 bgFetch가 undefined라면, promise를 완료하고 undefined를 반환하며 이 단계를 중단합니다.

  4. 다음 단계를 대기열에 추가하여 bgFetch업데이트 처리 큐에서 실행합니다:

    1. bgfetch 작업을 대기열에 추가하고 task로 설정하여 다음 단계를 실행합니다:

      1. bgFetchRegistrationBackgroundFetchRegistration 인스턴스를 가져오는 결과로 설정하며, bgFetch와 관련된 문맥 객체관련 Realm에서 가져옵니다.

      2. promise를 완료하고 bgFetchRegistration을 반환합니다.

    2. task가 완료될 때까지 대기합니다.

      참고: 이는 새로운 BackgroundFetchRegistration 인스턴스가 progress 이벤트를 놓치지 않도록 보장합니다.

6.3.3. getIds()

getIds() 메서드를 호출하면, 새로운 promise promise를 반환하고 다음 단계를 병렬로 실행합니다:
  1. registration문맥 객체의 관련된 서비스 워커 등록으로 설정합니다.

  2. promise를 완료하고, registration활성 백그라운드 패치키를 가져오는 결과를 반환합니다.

6.4. BackgroundFetchRegistration

[Exposed=(Window,Worker)]
interface BackgroundFetchRegistration : EventTarget {
  readonly attribute DOMString id;
  readonly attribute unsigned long long uploadTotal;
  readonly attribute unsigned long long uploaded;
  readonly attribute unsigned long long downloadTotal;
  readonly attribute unsigned long long downloaded;
  readonly attribute BackgroundFetchResult result;
  readonly attribute BackgroundFetchFailureReason failureReason;
  readonly attribute boolean recordsAvailable;

  attribute EventHandler onprogress;

  Promise<boolean> abort();
  Promise<BackgroundFetchRecord> match(RequestInfo request, optional CacheQueryOptions options = {});
  Promise<sequence<BackgroundFetchRecord>> matchAll(optional RequestInfo request, optional CacheQueryOptions options = {});
};

enum BackgroundFetchResult { "", "success", "failure" };

enum BackgroundFetchFailureReason {
  // 백그라운드 패치가 아직 완료되지 않았거나, 성공했습니다.
  "",
  // 작업이 사용자에 의해 중단되었거나, abort()가 호출되었습니다.
  "aborted",
  // 응답이 올바르지 않은 상태를 가졌습니다.
  "bad-status",
  // CORS, MIX, 잘못된 부분 응답, 또는 재시도할 수 없는 일반 네트워크 실패 등의 이유로 페치가 실패했습니다.
  "fetch-error",
  // 작업 중 저장소 할당량이 초과되었습니다.
  "quota-exceeded",
  // 제공된 downloadTotal이 초과되었습니다.
  "download-total-exceeded"
};

BackgroundFetchRegistration 인스턴스는 다음을 포함합니다:

참고: 위 값들은 동기적으로 사용할 수 있도록 복사됩니다.

id 속성의 getter는 문맥 객체id를 반환해야 합니다.

uploadTotal 속성의 getter는 문맥 객체업로드 총합을 반환해야 합니다.

downloadTotal 속성의 getter는 문맥 객체다운로드 총합을 반환해야 합니다.

uploaded 속성의 getter는 문맥 객체업로드됨을 반환해야 합니다.

downloaded 속성의 getter는 문맥 객체다운로드됨을 반환해야 합니다.

result 속성의 getter는 문맥 객체결과를 반환해야 합니다.

failureReason 속성의 getter는 문맥 객체실패 이유를 반환해야 합니다.

recordsAvailable 속성의 getter는 문맥 객체레코드 사용 가능 플래그가 설정되어 있으면 true를, 그렇지 않으면 false를 반환해야 합니다.

6.4.1. 이벤트

onprogress 이벤트 핸들러이벤트 핸들러 이벤트 유형progress입니다.

progress 이벤트는 Event 인터페이스를 사용합니다.

6.4.2. abort()

abort() 메서드가 호출되면, 새로운 promise promise를 반환하고 다음 단계를 병렬로 실행해야 합니다:
  1. bgFetch문맥 객체와 관련된 백그라운드 패치로 설정합니다.

  2. swRegistrationbgFetch서비스 워커 등록으로 설정합니다.

  3. 다음 단계를 대기열에 추가하여 swRegistration활성 백그라운드 패치 편집 큐에서 실행합니다:

    1. activeBgFetchesswRegistration활성 백그라운드 패치로 설정합니다.

    2. idbgFetchid로 설정합니다.

    3. 만약 activeBgFetches백그라운드 패치를 포함하지 않는다면 bgFetch, promise를 완료하고 false를 반환하며 이 단계를 중단합니다.

    4. activeBgFetches[id]를 제거합니다.

    5. promise를 완료하고 true를 반환합니다.

    6. bgFetch모두 중단 플래그를 설정합니다.

6.4.3. match()

match(request, options) 메서드가 호출되면, 다음 단계를 실행해야 합니다:
  1. promisematchAll() 알고리즘을 호출하여 requestoptions를 전달한 결과로 설정합니다.

  2. promise가 해결되었을 때 반응하여 promise의 결과를 반환합니다. 완료 핸들러가 호출되었을 때, matches를 인수로 받아 matches[0]을 반환합니다.

참고: 사용자 에이전트는 위 단계를 최적화하여 matchAll()을 호출하는 것보다 빠르게 실행하도록 권장됩니다.

6.4.4. matchAll()

matchAll(request, options) 메서드가 호출되면, 다음 단계를 실행해야 합니다:
  1. 만약 문맥 객체레코드 사용 가능 플래그가 해제되어 있다면, promise를 거부하고 InvalidStateError DOMException를 반환합니다.

  2. promise새로운 promise로 설정합니다.

  3. 다음 단계를 병렬로 실행합니다:

    1. matchingRecords를 비어 있는 목록으로 설정합니다.

    2. 문맥 객체백그라운드 패치레코드 중 각 record에 대해:

      1. 만약 request가 캐시된 항목과 일치하고, request, record요청, record응답 데이터응답, 그리고 options가 true를 반환한다면, 목록에 추가하여 recordmatchingRecords에 넣습니다.

    3. bgfetch 작업을 대기열에 추가하고, promise를 완료하여 레코드 객체 생성 결과를 matchingRecords에서 문맥 객체관련 Realm으로 반환합니다.

  4. promise를 반환합니다.

6.5. BackgroundFetchRecord

[Exposed=(Window,Worker)]
interface BackgroundFetchRecord {
  readonly attribute Request request;
  readonly attribute Promise<Response> responseReady;
};

BackgroundFetchRecord 는 다음을 포함합니다:

request 속성의 getter는 문맥 객체request를 반환해야 합니다.

responseReady 속성의 getter는 문맥 객체response promise를 반환해야 합니다.

6.6. BackgroundFetchEvent

[Exposed=ServiceWorker]
interface BackgroundFetchEvent : ExtendableEvent {
  constructor(DOMString type, BackgroundFetchEventInit init);
  readonly attribute BackgroundFetchRegistration registration;
};

dictionary BackgroundFetchEventInit : ExtendableEventInit {
  required BackgroundFetchRegistration registration;
};

BackgroundFetchEvent백그라운드 패치 (background fetch)를 포함하며, 초기값은 registration이 초기화된 상태의 백그라운드 패치입니다.

registration 속성은 초기화된 값을 반환해야 합니다.

6.7. BackgroundFetchUpdateUIEvent

[Exposed=ServiceWorker]
interface BackgroundFetchUpdateUIEvent : BackgroundFetchEvent {
  constructor(DOMString type, BackgroundFetchEventInit init);
  Promise<undefined> updateUI(optional BackgroundFetchUIOptions options = {});
};

BackgroundFetchUpdateUIEventUI 업데이트 플래그를 포함하며, 초기값은 해제된 상태입니다.

6.7.1. updateUI()

updateUI(options) 메서드가 호출되면, 새로운 promise promise를 반환하고 다음 단계를 병렬로 실행해야 합니다:
  1. 다음 중 하나라도 true라면:

    InvalidStateError DOMException를 던집니다.

  2. 문맥 객체UI 업데이트 플래그를 설정합니다.

  3. options가 null이면, 반환합니다.

  4. bgFetch문맥 객체백그라운드 패치로 설정합니다.

  5. optionsicons 멤버가 존재하면, bgFetchiconsoptionsicons로 설정합니다.

  6. optionstitle 멤버가 존재하면, bgFetchtitleoptionstitle로 설정합니다.

  7. promise를 완료합니다.

7. 자동화

사용자 에이전트 자동화 및 애플리케이션 테스트 목적으로, 본 문서는 확장 명령[WebDriver] 명세에 대해 정의합니다.

7.1. 클릭

메서드 URI 템플릿
POST /session/{session id}/backgroundfetch/{id}/click

백그라운드 패치 클릭 확장 명령디스플레이를 활성화하는 사용자를 시뮬레이션합니다. 원격 끝 단계는 다음과 같습니다:

  1. 만약 현재 최상위 브라우징 컨텍스트더 이상 열리지 않았다면, WebDriver 오류WebDriver 오류 코드 해당 창 없음과 함께 반환합니다.

  2. pageURL현재 최상위 브라우징 컨텍스트활성 문서URL로 설정합니다.

  3. swRegistrationpageURL에 대한 일치하는 서비스 워커 등록으로 설정합니다.

  4. 만약 swRegistration이 null이라면, WebDriver 오류상태 400 및 JSON 오류 코드 "invalid service worker state"와 함께 반환합니다.

  5. bgFetch백그라운드 패치idurl 변수 id이고, 서비스 워커 등록swRegistration인 가장 최신의 것으로 설정하며, 존재하지 않을 경우 null로 설정합니다.

  6. 만약 bgFetch가 null이라면, WebDriver 오류상태 404 및 JSON 오류 코드 "background fetch not found"와 함께 반환합니다.

  7. 백그라운드 패치 클릭 이벤트를 발생시킵니다. bgFetch에 대해.

  8. WebDriver 성공을 반환합니다.

8. 개인정보 및 대역폭 사용

패치는 크기가 클 수 있으며 완료하는 데 시간이 오래 걸릴 수 있습니다. 이 기간 동안 사용자는 하나 이상의 서버에서 데이터를 패치하게 됩니다. 작업 중 사용자의 IP 주소는 변할 수 있으며, 시간이 지남에 따라 사용자의 위치를 추적하는 데 사용될 수 있습니다.

이를 완화하기 위해 백그라운드 패치표시하는 단계는 다음을 요구합니다:

이 단계는 또한 사용자가 계량 연결을 사용하는 경우 사용자 에이전트가 백그라운드 패치를 일시 중지할 수 있도록 합니다.

모든 저장된 데이터는 특정 서비스 워커 등록과 연관되어 있습니다. 서비스 워커 등록을 삭제하면 관련된 모든 백그라운드 패치가 삭제됩니다.

적합성

문서 관례

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. 본 문서의 규범적인 부분에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"이라는 주요 단어는 RFC 2119에 설명된 대로 해석되어야 합니다. 그러나 가독성을 위해 이 사양에서는 이러한 단어들이 모두 대문자로 나타나지 않습니다.

이 사양의 모든 텍스트는 비규범적으로 명시된 섹션, 예제 및 주석을 제외하고 규범적입니다. [RFC2119]

이 사양의 예제는 "예를 들어"라는 단어로 소개되거나 class="example"로 규범 텍스트와 구분됩니다, 예를 들어:

이것은 정보성 예제의 예입니다.

정보성 주석은 "참고"라는 단어로 시작하며 class="note"로 규범 텍스트와 구분됩니다, 예를 들어:

참고, 이것은 정보성 참고입니다.

적합한 알고리즘

알고리즘의 일부로서 명령형으로 표현된 요구사항 (예: "모든 선행 공백 문자를 제거하십시오" 또는 "false를 반환하고 이러한 단계를 중단하십시오") 은 알고리즘을 도입할 때 사용된 주요 단어("must", "should", "may" 등)의 의미로 해석되어야 합니다.

알고리즘 또는 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등하기만 하면 어떤 방식으로든 구현 가능합니다. 특히, 이 사양에서 정의된 알고리즘은 이해하기 쉽게 설계되었으며 성능을 목표로 하지 않습니다. 구현자들은 최적화를 권장합니다.

색인

이 명세서에서 정의된 용어

참조에 의해 정의된 용어

참조

규범적 참조

[DOM]
Anne van Kesteren. DOM 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 언어 명세. URL: https://tc39.es/ecma262/
[FETCH]
Anne van Kesteren. Fetch 표준. 현행 표준. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[IMAGE-RESOURCE]
Aaron Gustafson; Rayan Kanso; Marcos Caceres. 이미지 리소스. 2021년 3월 29일. WD. URL: https://www.w3.org/TR/image-resource/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Mounir Lamouri; Marcos Caceres; Jeffrey Yasskin. 권한. 2020년 7월 20일. WD. URL: https://www.w3.org/TR/permissions/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내는 키워드. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[SERVICE-WORKERS-1]
Alex Russell; et al. 서비스 워커 1. 2019년 11월 19일. CR. URL: https://www.w3.org/TR/service-workers-1/
[STREAMS]
Adam Rice; Domenic Denicola; 吉野剛史 (Takeshi Yoshino). 스트림 표준. 현행 표준. URL: https://streams.spec.whatwg.org/
[URL]
Anne van Kesteren. URL 표준. 현행 표준. URL: https://url.spec.whatwg.org/
[WebDriver]
Simon Stewart; David Burns. WebDriver. 2018년 6월 5일. REC. URL: https://www.w3.org/TR/webdriver1/
[WebIDL]
Boris Zbarsky. Web IDL. 2016년 12월 15일. ED. URL: https://heycam.github.io/webidl/

IDL 색인

partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onbackgroundfetchsuccess;
  attribute EventHandler onbackgroundfetchfail;
  attribute EventHandler onbackgroundfetchabort;
  attribute EventHandler onbackgroundfetchclick;
};

partial interface ServiceWorkerRegistration {
  readonly attribute BackgroundFetchManager backgroundFetch;
};

[Exposed=(Window,Worker)]
interface BackgroundFetchManager {
  Promise<BackgroundFetchRegistration> fetch(DOMString id, (RequestInfo or sequence<RequestInfo>) requests, optional BackgroundFetchOptions options = {});
  Promise<BackgroundFetchRegistration?> get(DOMString id);
  Promise<sequence<DOMString>> getIds();
};

dictionary BackgroundFetchUIOptions {
  sequence<ImageResource> icons;
  DOMString title;
};

dictionary BackgroundFetchOptions : BackgroundFetchUIOptions {
  unsigned long long downloadTotal = 0;
};

[Exposed=(Window,Worker)]
interface BackgroundFetchRegistration : EventTarget {
  readonly attribute DOMString id;
  readonly attribute unsigned long long uploadTotal;
  readonly attribute unsigned long long uploaded;
  readonly attribute unsigned long long downloadTotal;
  readonly attribute unsigned long long downloaded;
  readonly attribute BackgroundFetchResult result;
  readonly attribute BackgroundFetchFailureReason failureReason;
  readonly attribute boolean recordsAvailable;

  attribute EventHandler onprogress;

  Promise<boolean> abort();
  Promise<BackgroundFetchRecord> match(RequestInfo request, optional CacheQueryOptions options = {});
  Promise<sequence<BackgroundFetchRecord>> matchAll(optional RequestInfo request, optional CacheQueryOptions options = {});
};

enum BackgroundFetchResult { "", "success", "failure" };

enum BackgroundFetchFailureReason {
  // The background fetch has not completed yet, or was successful.
  "",
  // The operation was aborted by the user, or abort() was called.
  "aborted",
  // A response had a not-ok-status.
  "bad-status",
  // A fetch failed for other reasons, e.g. CORS, MIX, an invalid partial response,
  // or a general network failure for a fetch that cannot be retried.
  "fetch-error",
  // Storage quota was reached during the operation.
  "quota-exceeded",
  // The provided downloadTotal was exceeded.
  "download-total-exceeded"
};

[Exposed=(Window,Worker)]
interface BackgroundFetchRecord {
  readonly attribute Request request;
  readonly attribute Promise<Response> responseReady;
};

[Exposed=ServiceWorker]
interface BackgroundFetchEvent : ExtendableEvent {
  constructor(DOMString type, BackgroundFetchEventInit init);
  readonly attribute BackgroundFetchRegistration registration;
};

dictionary BackgroundFetchEventInit : ExtendableEventInit {
  required BackgroundFetchRegistration registration;
};

[Exposed=ServiceWorker]
interface BackgroundFetchUpdateUIEvent : BackgroundFetchEvent {
  constructor(DOMString type, BackgroundFetchEventInit init);
  Promise<undefined> updateUI(optional BackgroundFetchUIOptions options = {});
};

이슈 색인

manifest/pull/710.
ServiceWorker/1348.
이 단계의 나머지는 fetch "callbacks"를 사용하며, 현재 작업을 대기열에 추가합니다. 이는 여기서 바람직하지 않거나 가능하지 않으므로, 작업이 대기열에 추가되지 않는다고 가정합시다. (issue)
마우스 이동 이벤트 디바운스와 유사하게 이 작업을 디바운스해야 합니다.
정수로 파싱하기 infra/189.
ServiceWorker/1348.