백그라운드 가져오기

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

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

요약

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

이 문서의 상태

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

1. 소개

서비스 워커는 자산을 페치하고 캐시할 수 있으며, 그 크기는 오리진 저장소에 의해서만 제한된다. 그러나 사용자가 사이트에서 벗어나거나 브라우저를 닫으면 서비스 워커가 종료될 가능성이 높다. 이런 일은 대기 중인 프로미스가 waitUntil()에 전달된 경우에도 발생할 수 있다. - 해당 프로미스가 몇 분 안에 이행되지 않으면 브라우저는 이를 서비스 워커의 악용으로 간주하고 프로세스를 종료할 수 있다.

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

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

2. 영역

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

3. 인프라

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

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

bgfetch 태스크를 큐에 넣기는 선택적 eventLoop (이벤트 루프, 기본값은 호출자의 콘텍스트 객체관련 설정 객체담당 이벤트 루프)와 steps(단계)를 사용하며, 태스크를 큐에 넣을 대상은 eventLoop이며, 백그라운드 페치 태스크 소스를 사용해 steps를 실행한다.

3.1. 서비스 워커 등록 확장

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

3.2. 백그라운드 가져오기

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

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

  2. bgFetch기록record에 대해:

    1. total을 다음 길이, 즉 record응답 데이터바이트 길이만큼 증가시킨다.

  3. total을 반환합니다.

3.2.1. 디스플레이

표시백그라운드 페치(bgFetch)를 주어진 environment(환경 설정 객체)에 표시하는 절차이다. 사용자 에이전트는 다음 규칙을 따르는 사용자 인터페이스를 제공해야 한다:

permission을 다음 권한 상태로 한다. PermissionDescriptorname"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. requestkeepalive 플래그를 설정한다.

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

  7. rangeStart를 다음 길이, 즉 responseData바이트 길이로 한다.

  8. rangeStart가 0이 아니면 범위 헤더를 추가한다. 대상은 request이며 rangeStart를 사용한다.

    참고: rangeStart가 0이면 일반 요청이 이루어진다. 범위 헤더가 있는 요청에는 Accept-Encoding: identity가 추가되므로 초기 요청에서 콘텐츠 인코딩을 사용할 수 있다.

  9. fetchAttemptComplete를 false로 한다.

  10. lastTransmittedSize를 0으로 한다.

  11. 다음을 페치한다: request.

    이 단계의 나머지는 현재 태스크를 큐에 넣는 fetch "콜백"을 사용한다. 여기서는 바람직하지도 가능하지도 않으므로 태스크가 큐에 들어가지 않는 것으로 간주하자. (이슈)

    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, responseresponseData응답에 대해 수행한 결과가 유효하지 않으면:

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

        2. fetchAttemptComplete를 true로 설정한다.

        3. 종료할 대상은 진행 중인 페치이며, 이 단계를 중단한다.

    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, lastBytePoscompleteLengthcontent-range 값 추출 결과로 한다. 추출 대상은 response이다.

        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결과로 설정한다.

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

    4. 종료할 대상은 진행 중인 페치이다.

  15. result가 빈 문자열이면 레코드 완료bgFetchrecord에 대해 수행한다.

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

다음 백그라운드 페치 인스턴스 업데이트bgFetch(백그라운드 페치)에 수행하려면, 다음 단계를 큐에 넣는다. 대상은 bgFetch업데이트 처리 큐이다:
  1. downloadedbgFetch저장된 본문 바이트 총량으로 한다.

  2. uploadedbgFetch업로드된 양으로 한다.

  3. resultbgFetch결과로 한다.

  4. failureReasonbgFetch실패 이유로 한다.

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

  6. 환경 설정 객체 env 중 그 출처bgFetch서비스 워커 등록범위 URL출처와 같은 것에 대해, bgfetch 태스크를 큐에 넣는다. 대상은 env담당 이벤트 루프이며 다음 단계를 실행한다:

    1. bgFetchRegistrationBackgroundFetchRegistration 인스턴스로 한다. 이 인스턴스는 관련 Realm 안에 있고, 그 백그라운드 페치bgFetch와 같아야 한다. 존재하지 않으면 null로 한다.

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

    2. bgFetchRegistration이 null이면 이 단계를 중단한다.

    3. recordsAvailable이 false이고 bgFetchRegistration레코드 사용 가능 플래그가 설정되어 있으면 bgFetchRegistration레코드 사용 가능 플래그를 해제한다.

    4. bgFetchRegistration결과가 빈 문자열이 아니면 이 단계를 중단한다.

      참고: 이는 백그라운드 페치의 결과가 확정된 후 진행 상황이 보고되는 것을 방지한다. 작업은 중단되었지만 일부 페치가 아직 종료되지 않은 경우 이런 일이 발생할 수 있다.

    5. 다음 조건이 모두 true인 경우:

      그러면 이 단계를 중단한다.

    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의 수명 내내 반환되도록 보장한다. 브라우저는 이를 최적화해도 괜찮다. 단, 주어진 백그라운드 페치에 대해 둘 이상의 인스턴스가 생성되었음을 알아낼 방법이 없어야 한다(예: 동등성 비교, expando 또는 약하게 연결된 데이터).

다음 BackgroundFetchRegistration 인스턴스 가져오기bgFetch(백그라운드 페치)에 대해 realm(Realm)에서 수행하려면 다음 단계를 실행한다:
  1. instancesMap을 다음 BackgroundFetchRegistration 인스턴스로 한다. 이는 유일한 BackgroundFetchManager 인스턴스가 이 realm 안에서 갖는 값이다.

  2. instancesMap[bgFetch]가 존재하면, instancesMap[bgFetch]를 반환한다.

  3. instance를 새 BackgroundFetchRegistration으로 한다. 이는 realm에 있으며, 그 백그라운드 페치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. recordsrecord 각각에 대해:

    1. responseDatarecord응답 데이터로 한다.

    2. recordObject를 새 BackgroundFetchRecord로 한다.

    3. recordObjectresponseReady새 프로미스로 설정한다.

    4. requestObject를 다음과 같이 설정된 새 Request 객체로 한다:

      요청

      record요청 사본. 해당 본문도 포함한다.

      헤더

      이 새 Headers 객체는 이 Request요청에 속한 헤더 리스트와 연결된다.

    5. recordObjectrequestrequestObject로 설정한다.

    6. transmittedBytes를 0으로 한다.

    7. stream새 읽기 가능 스트림으로 한다. 이 스트림에는 pull 동작이 있으며, 이 동작은 새 프로미스 promise를 반환하고 다음 단계를 병렬로 실행한다:

      1. 다음 길이, 즉 responseData바이트 길이가 transmittedBytes보다 커지거나 responseData결과가 빈 문자열이 아니게 될 때까지 기다린다.

      2. bytes를 null로 한다.

      3. 다음 길이, 즉 responseData바이트 길이가 transmittedBytes보다 크고 responseData노출될 수 있으면:

        1. bytes를 사용자 에이전트가 결정한 슬라이스로 설정한다. 이 슬라이스는 responseData바이트에서 추출하며 transmittedBytes 오프셋부터 시작한다.

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

        2. transmittedBytesbytes길이만큼 증가시킨다.

      4. 태스크를 큐에 넣는다. 대상은 stream관련 설정 객체담당 이벤트 루프이며, 네트워킹 태스크 소스를 사용해 다음 단계를 실행한다:

        1. bytes가 null이 아니면:

          1. array를 새 Uint8Array로 한다. 이 객체는 새 ArrayBuffer를 래핑하며, 이 버퍼는 bytes로 구성된다.

          2. 다음을 큐에 넣는다: arraystream에.

        2. responseData노출될 수 있고, responseData결과가 빈 문자열이 아니며 transmittedBytes길이, 즉 responseData바이트 길이이면 닫을 대상은 stream이다.

        3. 그렇지 않고 responseData결과"aborted"이면 오류를 발생시킬 대상은 stream이며 AbortError DOMException을 사용한다.

        4. 그렇지 않고 responseData노출될 수 없으면, 오류를 발생시킬 대상은 stream이며 TypeError를 사용한다.

        5. 이행할 대상은 promise이다.

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

      1. responseData응답이 not-null이 아니게 될 때까지 기다린다.

      2. responseData노출될 수 있으면:

        1. responseresponseData응답 사본으로 한다.

        2. 다음을 삭제한다: `Content-Range`를 response헤더 리스트에서.

        3. 다음을 삭제한다: `Content-Length`를 response헤더 리스트에서.

        4. body를 새 본문으로 한다. 이 본문의 스트림stream으로 설정한다.

        5. response본문body로 설정한다.

        6. 태스크를 큐에 넣는다. 대상은 recordObject관련 설정 객체담당 이벤트 루프이며 네트워킹 태스크 소스를 사용해 다음 단계를 실행한다:

          1. responseObject를 다음과 같이 설정된 새 Response 객체로 한다:

            응답

            response.

            헤더

            이 새 Headers 객체는 이 Response응답에 속한 헤더 리스트와 연결된다.

          2. 다음을 이행한다: recordObjectresponseReadyresponseObject로.

      3. 그렇지 않고 responseData결과"aborted"이면 다음을 거부한다: recordObjectresponseReadyAbortError DOMException으로.

      4. 그렇지 않으면 다음을 거부한다: recordObjectresponseReadyTypeError로.

    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비어 있다면, 다음으로 거부된 프로미스를 반환한다: TypeError.

  6. requestsrequest 각각에 대해:

    1. internalRequest를 다음 요청으로 한다. 이는 Request 생성자를 request로 호출한 결과의 요청이다. 이때 예외가 발생하면 다음으로 거부된 프로미스를 반환한다: 해당 예외.

    2. internalRequest모드가 "no-cors"이면, 다음으로 거부된 프로미스를 반환한다: TypeError.

    3. internalRequest클라이언트를 null로 설정한다.

    4. record를 새 백그라운드 페치 레코드로 한다.

    5. record요청internalRequest로 설정한다.

    6. recordrecords추가한다.

  7. promise새 프로미스로 한다.

  8. 다음 단계를 큐에 넣는다. 대상은 registration활성 백그라운드 페치 편집 큐이다:

    1. permission을 다음 권한 상태로 한다. PermissionDescriptorname"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. 중단된 경우이고 stream읽기 가능하면, 오류를 발생시킬 streamAbortError DOMException을 설정하고 이 단계를 중단한다.

        3. uploadTotalrequest본문총 바이트 수만큼 증가시킨다.

        4. requestBodiesRemaining을 1만큼 감소시킨다.

    9. 어느 시점에서든 할당량 제한을 초과하여 requests 저장에 실패하면, 거부할 대상은 promise이며 QuotaExceededError DOMException을 사용하고 이 단계를 중단한다.

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

    11. requestReadFailed가 true이면 다음을 거부한다: promise. TypeError를 사용하고 이 단계를 중단한다.

    12. bgFetch를 다음 항목을 갖는 새 백그라운드 페치로 한다:

      id

      id.

      레코드

      records.

      다운로드 총량

      optionsdownloadTotal 멤버.

      업로드 총량

      uploadTotal.

      아이콘

      optionsicons 멤버가 있으면 해당 멤버, 그렇지 않으면 빈 리스트.

      제목

      optionstitle 멤버가 있으면 해당 멤버, 그렇지 않으면 빈 문자열.

      서비스 워커 등록

      registration.

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

    14. bgfetch 태스크를 큐에 넣고 다음 단계를 실행한다:

      1. 이행할 대상은 promise이고, 그 값은 다음의 결과이다: bgFetch에 대한 BackgroundFetchRegistration 인스턴스를 가져오는 것. 이는 콘텍스트 객체관련 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.