1. 소개
서비스 워커는 자산을 페치하고 캐시할 수 있으며, 그 크기는
오리진
저장소에 의해서만 제한된다. 그러나 사용자가 사이트에서 벗어나거나 브라우저를 닫으면 서비스 워커가
종료될 가능성이 높다. 이런 일은
대기 중인 프로미스가 waitUntil()에
전달된 경우에도 발생할 수 있다. - 해당 프로미스가 몇 분 안에 이행되지 않으면 브라우저는 이를 서비스
워커의 악용으로 간주하고 프로세스를 종료할 수 있다.
이는 배터리 및 프라이버시 측면에서는 훌륭하지만, 팟캐스트 및 영화와 같은 대용량 자산의 다운로드 및 캐싱, 비디오 및 이미지 업로드는 어렵게 만듭니다.
이 사양은 다음을 목표로 합니다:
-
사용자가 모든 창 및 워커를 오리진으로 닫더라도 가져오기(요청 및 응답)가 계속되도록 허용합니다.
-
앱에서 정의한 대로 단일 작업이 여러 요청을 포함하도록 허용합니다.
-
브라우저/OS에서 작업 진행을 나타내는 UI를 표시하고, 사용자가 일시 중지/중단하도록 허용합니다.
-
브라우저/OS가 연결 상태 불량을 처리하여 다운로드를 일시 중지/재개하도록 허용합니다.
-
앱이 작업의 성공/실패에 대응하여 결과를 캐싱하는 등 반응할 수 있도록 허용합니다.
-
가져오는 동안 백그라운드로 가져온 리소스에 접근을 허용합니다.
2. 영역
모든 플랫폼 객체는 별도의 명시가 없는 한 컨텍스트 객체의 관련 영역에서 생성됩니다.
3. 인프라
사용자 에이전트가 리소스가 곧 사용 가능해질 것이라고 판단하는 경우 리소스는 일시적으로 사용 불가로 간주됩니다. 원인은 다음과 같습니다:
-
사용자 에이전트가 오프라인 상태입니다.
-
사용자 에이전트가 캡티브 포털 뒤에 있습니다.
백그라운드 가져오기 작업 소스는 작업 소스입니다.
3.1. 서비스 워커 등록 확장
서비스 워커 등록에는 추가적으로 다음이 포함됩니다:
-
활성 백그라운드 가져오기 (맵), 각 키는 DOMString이고, 각 항목은 백그라운드 가져오기입니다. 초기값은 빈 맵입니다.
3.2. 백그라운드 가져오기
백그라운드 가져오기는 다음으로 구성됩니다:
-
id (DOMString).
-
기록 (리스트 of 백그라운드 가져오기 기록).
-
제목 (DOMString).
-
총 다운로드 (숫자).
-
총 업로드 (숫자).
-
업로드됨 (숫자), 초기값은 0입니다.
-
결과 (
BackgroundFetchResult), 초기값은 빈 문자열입니다. -
실패 이유 (
BackgroundFetchFailureReason), 초기값은 빈 문자열입니다. -
기록 사용 가능 플래그, 초기값은 설정됨.
-
아이콘 (리스트 of
ImageResources). -
서비스 워커 등록 (서비스 워커 등록).
-
일시 정지 플래그, 초기값은 설정되지 않음.
-
모두 중단 플래그, 초기값은 설정되지 않음.
3.2.1. 디스플레이
-
bgFetch의 일시 중지 플래그가 설정되어 있지 않고 bgFetch의 결과가 빈 문자열이 아니면 UI는 대역폭이 사용 중임을 나타내야 한다.
-
UI는 중단하지 않고 닫을 수 없으며(예: 스와이프해 제거할 수 없음), 이 제한은 bgFetch의 결과가 빈 문자열이 아니게 될 때까지 적용된다.
-
UI는 bgFetch의 제목을 표시할 수 있다.
-
UI는 이미지 리소스(icon)를 표시용으로 bgFetch의 아이콘에서 선택할 수 있다. 이를 성공적으로 처리한 후 페치하며, 다음 속성을 갖는 새 요청을 사용한다:
-
UI는 bgFetch의 다운로드 총량, 업로드 총량, 저장된 본문 바이트 총량, 업로드된 양, 일시 중지 플래그 및 결과를 페치 진행 상황을 표시하는 데 사용할 수 있다.
-
UI는 사용자가 bgFetch를 중단할 방법을 제공해야 하며, 이 방법은 bgFetch의 모두 중단 플래그를 설정한다.
-
bgFetch의 요청이 포함된 레코드에서 모든 요청의 메서드가 `
GET`이면 UI는 bgFetch의 일시 중지 플래그를 전환할 방법을 제공할 수 있다.참고: 메서드가 `
GET`이 아니면 요청을 다시 실행할 때 원하지 않는 부작용이 발생할 수 있다. -
UI는 활성화될 수 있으며(예: 클릭), 이 경우 백그라운드 페치 클릭 이벤트를 발생시킬 대상은 bgFetch이다.
-
작업이 완료된 후에도 UI가 남아 있을 수 있으며, 이 경우에도 계속 활성화할 수 있다.
permission을 다음 권한
상태로 한다. PermissionDescriptor의
name은
"background-fetch"이고 environment를 사용한다. permission이
"prompt"이면 사용자 에이전트는 bgFetch의 일시 중지 플래그를
이 알고리즘을 시작할 때 설정할 수 있다. 사용자 에이전트는 사용자가
다음 중 하나를 선택하도록 허용하는 것이 좋다: 백그라운드 페치 수락(bgFetch의 일시 중지
플래그를 해제함) 또는 백그라운드 페치 거부(bgFetch의 모두 중단
플래그를 설정함). 사용자 에이전트는 항상 허용 및 항상 거부 옵션도 제공할 수 있으며, 이 옵션은
이 권한에 관한 사용자 의도에 관한 새 정보로
사용될 수 있다.
사용자 에이전트는 bgFetch의 일시 중지 플래그를 사용자가 종량제 연결을 이용 중이거나 백그라운드 페치가 백그라운드에서 시작된 경우 설정하는 것도 고려할 수 있다.
3.3. 백그라운드 가져오기 기록
백그라운드 가져오기 기록은 다음으로 구성됩니다:
-
요청 (요청).
-
응답 데이터 (백그라운드 가져오기 응답), 초기값은 새로운 백그라운드 가져오기 응답입니다.
3.4. 백그라운드 가져오기 응답
백그라운드 가져오기 응답은 다음으로 구성됩니다:
-
응답 (응답 또는 null), 초기값은 null입니다.
-
결과, (
BackgroundFetchFailureReason,"success", 또는"redundant"), 초기값은 빈 문자열입니다.
4. 알고리즘
4.1. 백그라운드 가져오기 수행
참고: 이것은 백그라운드 가져오기 작업의 '백그라운드' 부분을 관리하는 알고리즘입니다. 각 백그라운드 가져오기당 하나의 알고리즘 인스턴스만 실행됩니다.
-
swRegistration을 bgFetch의 서비스 워커 등록으로 설정합니다.
-
settledFetches를 0으로 설정합니다.
-
immediateFailure를 false로 설정합니다.
-
failureReason을 빈 문자열로 설정합니다.
-
settledFetches가 bgFetch의 기록의 크기와 같아지거나, immediateFailure가 true가 될 때까지 기다립니다.
-
만약 immediateFailure가 true라면, bgFetch의 모든 중단 플래그를 설정합니다.
참고: 기록 완료 알고리즘은 이 플래그를 수신하고 설정되면 가져오기를 종료합니다.
-
다음 단계를 큐에 추가하여 swRegistration의 활성 백그라운드 가져오기 편집 큐에 실행합니다:
-
activeBgFetches를 swRegistration의 활성 백그라운드 가져오기로 설정합니다.
-
id를 bgFetch의 id로 설정합니다.
-
만약 activeBgFetches가 백그라운드 가져오기 포함 bgFetch를 포함하고 있다면, activeBgFetches[id]를 제거합니다.
-
그렇지 않으면, failureReason을
"aborted"로 설정합니다.참고: 이것은
abort()가 성공적으로 호출되었지만 동시에 가져오기가 실패한 경우의 경쟁 조건을 처리합니다. 만약 우리가abort()에서 true를 반환했다면, 이는 관련 중단 이벤트를 실행하도록 보장합니다. -
만약 failureReason이 빈 문자열이 아니라면:
-
그렇지 않으면, bgFetch의 결과를
"success"로 설정합니다. -
백그라운드 가져오기 인스턴스 업데이트를 bgFetch에 대해 실행합니다.
-
eventName을 빈 문자열로 설정합니다.
-
eventConstructor를 null로 설정합니다.
-
만약 failureReason이
"aborted"라면:-
eventName을 "
backgroundfetchabort"로 설정합니다. -
eventConstructor를
BackgroundFetchEvent로 설정합니다.
-
-
그렇지 않고, failureReason이 빈 문자열이 아니라면:
-
eventName을 "
backgroundfetchfail"로 설정합니다. -
eventConstructor를
BackgroundFetchUpdateUIEvent로 설정합니다.
-
-
그 외의 경우:
-
eventName을 "
backgroundfetchsuccess"로 설정합니다. -
eventConstructor를
BackgroundFetchUpdateUIEvent로 설정합니다.
-
-
기능적 이벤트 실행을 eventName으로 실행하고, eventConstructor를 사용하여 swRegistration에서 다음 속성과 함께 실행합니다:
registration-
이벤트 객체의 관련 영역에서 bgFetch에 대한 BackgroundFetchRegistration 인스턴스 가져오기의 결과.
그런 다음 dispatchedEvent를 사용하여 다음 단계를 병렬로 실행합니다:
-
dispatchedEvent가 활성이 아닐 때까지 기다립니다.
-
bgFetch의 기록 사용 가능 플래그를 해제합니다.
-
백그라운드 가져오기 인스턴스 업데이트를 bgFetch에 대해 실행합니다.
-
4.2. 레코드 완료
참고: 이 알고리즘은 백그라운드 패치 레코드의 가져오기를 관리합니다. 이 알고리즘의 인스턴스는 백그라운드 패치 레코드마다 시작되며, 가져오기를 재시도하거나 부분 응답의 다음 부분을 가져오기 위해 재귀적으로 호출됩니다.
-
responseData를 record의 응답 데이터로 한다.
-
downloadTotal을 bgFetch의 다운로드 총량이 0이 아니면 해당 값으로, 그렇지 않으면 무한대로 한다.
-
bgFetch의 일시 중지 플래그가 해제될 때까지 기다린다.
-
request를 record의 요청 사본으로 한다.
참고: 이 시점에는 요청이 스트림으로 시작되었더라도 전체 요청이 저장소에 보관되어 있다.
-
request의 keepalive 플래그를 설정한다.
-
request의 서비스 워커 모드를 "
none"으로 설정한다. -
rangeStart가 0이 아니면 범위 헤더를 추가한다. 대상은 request이며 rangeStart를 사용한다.
참고: rangeStart가 0이면 일반 요청이 이루어진다. 범위 헤더가 있는 요청에는
Accept-Encoding: identity가 추가되므로 초기 요청에서 콘텐츠 인코딩을 사용할 수 있다. -
fetchAttemptComplete를 false로 한다.
-
lastTransmittedSize를 0으로 한다.
-
다음을 페치한다: request.
이 단계의 나머지는 현재 태스크를 큐에 넣는 fetch "콜백"을 사용한다. 여기서는 바람직하지도 가능하지도 않으므로 태스크가 큐에 들어가지 않는 것으로 간주하자. (이슈)
request에 대해 요청 본문 처리를 수행하려면 다음 단계를 실행한다:
-
bgFetch의 업로드된 양을 transmittedSize에서 lastTransmittedSize를 뺀 값만큼 증가시킨다.
-
lastTransmittedSize를 transmittedSize로 설정한다.
-
백그라운드 페치 인스턴스 업데이트를 bgFetch에 대해 수행한다.
response에 대해 응답 처리를 수행하려면 다음 단계를 실행한다:
-
response가 네트워크 오류이면:
-
리소스를 일시적으로 사용할 수 없고 request의 메서드가 `
GET`이면 리소스를 더 이상 일시적으로 사용할 수 없는 상태가 아닐 때까지 기다린 후 fetchAttemptComplete를 true로 설정하고 이 단계를 중단한다.참고: request의 메서드가 `
GET`이 아니면 요청을 다시 실행할 때 원하지 않는 부작용이 발생할 수 있다. 요청을 재개하는 표준 메서드를 사용할 수 있게 되면 여기에서 채택할 것이다. -
response가 중단된 네트워크 오류이면 responseData의 결과를
"aborted"로, 그렇지 않으면"fetch-error"로 설정한다. -
fetchAttemptComplete를 true로 설정하고 이 단계를 중단한다.
-
-
response의 상태가
206이면: -
그렇지 않으면:
-
responseData의 결과를
"redundant"로 설정한다. -
responseData를 새 백그라운드 페치 응답으로 설정한다.
-
record의 응답 데이터를 responseData로 설정한다.
참고: 레코드 객체 생성 알고리즘이 이전 백그라운드 페치 응답에 대한 참조를 유지할 수 있다.
-
백그라운드 페치 인스턴스 업데이트를 bgFetch에 대해 수행한다.
-
-
rangeStart가 0이거나 response의 상태가
206이 아니면 responseData의 응답을 response에서 본문을 제외한 사본으로 설정한다. -
하나 이상의 바이트가 stream에서 전송될 때마다 bytes를 전송된 바이트로 하고 다음 단계를 실행한다:
-
bgFetch의 저장된 본문 바이트 총량에 bytes의 크기를 더한 값이 downloadTotal보다 크면:
-
bytes를 responseData의 바이트에 추가한다.
-
이전 단계가 할당량 제한을 초과하여 실패하면 responseData의 결과를
"quota-exceeded"로, fetchAttemptComplete를 true로 설정하고 이 단계를 중단한다. -
백그라운드 페치 인스턴스 업데이트를 bgFetch에 대해 수행한다.
-
-
어느 시점에서든 stream의 바이트 전송이 정상적으로 완료되면:
-
response의 상태가
206이면:-
firstBytePos, lastBytePos 및 completeLength를 content-range 값 추출 결과로 한다. 추출 대상은 response이다.
-
completeLength가 null이 아니며 다음 길이, 즉 responseData의 바이트 길이와 같으면 responseData의 결과를
"success"로 설정한다.참고: 전체 리소스 또는 리소스의 나머지 부분을 요청하더라도 서버가 나머지 부분을 반환하지 않았을 수 있으며, 이 경우 추가 요청을 해야 한다.
-
-
그렇지 않고 response의 상태가 정상 상태가 아니면 responseData의 결과를
"bad-status"로 설정한다. -
그렇지 않으면 responseData의 결과를
"success"로 설정한다. -
fetchAttemptComplete를 true로 설정한다.
-
-
어느 시점에서든 stream에 오류가 발생하면:
-
리소스를 일시적으로 사용할 수 없고 request의 메서드가 `
GET`이면 리소스를 더 이상 일시적으로 사용할 수 없는 상태가 아닐 때까지 기다린 후 fetchAttemptComplete를 true로 설정한다. -
그렇지 않으면 responseData의 결과를
"fetch-error"로, fetchAttemptComplete를 true로 설정한다.
-
-
result를 빈 문자열로 한다.
-
다음 단계를 실행하되, 다음 조건이면 중단한다: bgFetch의 일시 중지 플래그 또는 모두 중단 플래그가 설정된 경우:
-
fetchAttemptComplete가 true가 될 때까지 기다린다.
-
result를 responseData의 결과로 설정한다.
-
-
result가 빈 문자열이면 레코드 완료를 bgFetch와 record에 대해 수행한다.
4.3. 백그라운드 패치 인스턴스 업데이트
-
downloaded를 bgFetch의 저장된 본문 바이트 총량으로 한다.
-
uploaded를 bgFetch의 업로드된 양으로 한다.
-
result를 bgFetch의 결과로 한다.
-
failureReason을 bgFetch의 실패 이유로 한다.
-
recordsAvailable을 bgFetch의 레코드 사용 가능 플래그가 설정되어 있으면 true로, 그렇지 않으면 false로 한다.
-
각 환경 설정 객체 env 중 그 출처가 bgFetch의 서비스 워커 등록의 범위 URL의 출처와 같은 것에 대해, bgfetch 태스크를 큐에 넣는다. 대상은 env의 담당 이벤트 루프이며 다음 단계를 실행한다:
-
bgFetchRegistration을
BackgroundFetchRegistration인스턴스로 한다. 이 인스턴스는 관련 Realm 안에 있고, 그 백그라운드 페치가 bgFetch와 같아야 한다. 존재하지 않으면 null로 한다.참고: 다음 BackgroundFetchRegistration 인스턴스 가져오기 알고리즘으로 인해 환경마다 최대 하나만 존재한다.
-
bgFetchRegistration이 null이면 이 단계를 중단한다.
-
recordsAvailable이 false이고 bgFetchRegistration의 레코드 사용 가능 플래그가 설정되어 있으면 bgFetchRegistration의 레코드 사용 가능 플래그를 해제한다.
-
bgFetchRegistration의 결과가 빈 문자열이 아니면 이 단계를 중단한다.
참고: 이는 백그라운드 페치의 결과가 확정된 후 진행 상황이 보고되는 것을 방지한다. 작업은 중단되었지만 일부 페치가 아직 종료되지 않은 경우 이런 일이 발생할 수 있다.
-
다음 조건이 모두 true인 경우:
-
bgFetchRegistration의 다운로드된 양이 downloaded와 같다.
-
bgFetchRegistration의 업로드된 양이 uploaded와 같다.
-
bgFetchRegistration의 결과가 result와 같다.
-
bgFetchRegistration의 실패 이유가 failureReason과 같다.
그러면 이 단계를 중단한다.
-
-
bgFetchRegistration의 다운로드된 양을 downloaded로 설정한다.
-
bgFetchRegistration의 업로드된 양을 uploaded로 설정한다.
-
bgFetchRegistration의 결과를 result로 설정한다.
-
bgFetchRegistration의 실패 이유를 failureReason으로 설정한다.
-
이벤트를 발생시킨다. 이름은 "
progress"이고 대상은 bgFetchRegistration이다.
-
4.4. 백그라운드 패치 클릭 이벤트 발생
backgroundfetchclick"라는 이름의 기능적 이벤트를 BackgroundFetchEvent를
사용하여 bgFetch의 서비스 워커 등록에서 다음 속성으로 발생시킵니다:
registration-
이벤트 객체의 관련 영역에서 bgFetch에 대해 BackgroundFetchRegistration 인스턴스를 가져오는 결과.
4.5. BackgroundFetchRegistration 인스턴스 가져오기
참고: 이 알고리즘은 동일한 BackgroundFetchRegistration
인스턴스가 주어진 백그라운드 페치에 대해
BackgroundFetchManager의
수명 내내 반환되도록 보장한다. 브라우저는 이를 최적화해도 괜찮다. 단, 주어진
백그라운드 페치에 대해 둘 이상의
인스턴스가 생성되었음을 알아낼 방법이
없어야 한다(예: 동등성 비교, expando 또는 약하게 연결된 데이터).
-
instancesMap을 다음 BackgroundFetchRegistration 인스턴스로 한다. 이는 유일한
BackgroundFetchManager인스턴스가 이 realm 안에서 갖는 값이다. -
instancesMap[bgFetch]가 존재하면, instancesMap[bgFetch]를 반환한다.
-
instance를 새
BackgroundFetchRegistration으로 한다. 이는 realm에 있으며, 그 백그라운드 페치를 bgFetch로 설정한다. -
instancesMap[bgFetch]을 instance로 설정한다.
-
instance를 반환한다.
4.6. 부분 응답 유효성 검사
참고: 이 알고리즘은 부분 응답이 요청된 내용과 합리적으로 일치하는지 확인하고, 선택적으로 이전 응답과 결합해야 하는지 확인합니다.
-
단언: partialResponse의 상태는
206입니다. -
responseFirstBytePos, responseLastBytePos, 그리고 responseCompleteLength를 partialResponse에서 콘텐츠 범위 값 추출의 결과로 설정합니다. 이 작업이 실패하면, 유효하지 않음을 반환합니다.
-
만약 responseFirstBytePos가 expectedRangeStart와 같지 않다면, 유효하지 않음을 반환합니다.
-
만약 previousResponse가 null이 아니라면, 다음을 실행합니다:
-
« `
ETag`, `Last-Modified` »의 각 headerName에 대해: -
만약 previousResponse의 상태가
206이라면:-
previousResponseFirstBytePos, previousResponseLastBytePos, 그리고 previousResponseCompleteLength를 previousResponse에서 콘텐츠 범위 값 추출의 결과로 설정합니다. 이 작업이 실패하면, 유효하지 않음을 반환합니다.
-
만약 previousResponseCompleteLength가 null이 아니고, responseCompleteLength가 previousResponseCompleteLength와 같지 않다면, 유효하지 않음을 반환합니다.
-
-
-
유효함을 반환합니다.
4.7. 콘텐츠 범위 값 추출
참고: 이 알고리즘은 `Content-Range`를 단일 바이트 콘텐츠 범위로 구문 분석하고
값을 추출합니다.
-
contentRangeValue를 response의 헤더 목록에서 헤더의 값으로 설정합니다. 이때 이름은 `
Content-Range`와 바이트 대소문자 무시 일치여야 합니다. -
만약 contentRangeValue를 단일 바이트 콘텐츠 범위로 구문 분석하는 데 실패하면, 실패를 반환합니다.
-
firstBytePos를 contentRangeValue에서 단일 바이트 콘텐츠 범위로 분석된 값 중
first-byte-pos에 해당하는 부분으로 설정하고, 정수로 구문 분석합니다. -
lastBytePos를 contentRangeValue에서 단일 바이트 콘텐츠 범위로 분석된 값 중
last-byte-pos에 해당하는 부분으로 설정하고, 정수로 구문 분석합니다. -
completeLength를 contentRangeValue에서 단일 바이트 콘텐츠 범위로 분석된 값 중
complete-length에 해당하는 부분으로 설정합니다. -
만약 completeLength가
"*"라면, completeLength를 null로 설정하고, 그렇지 않으면 completeLength를 정수로 구문 분석하여 설정합니다. -
firstBytePos, lastBytePos, 그리고 completeLength를 반환합니다.
정수로 구문 분석 infra/189.
4.8. 레코드 객체 생성
참고: 이 알고리즘은 백그라운드 패치 레코드를 위한 플랫폼 객체를 생성합니다. 또한 저장된 바이트로부터 응답의 스트리밍을 관리합니다. 이 시점에서 백그라운드 패치 작업이 여전히 진행 중일 수 있습니다.
모든 플랫폼 객체는 realm에서 생성되어야 한다.
-
recordObjects를 새 리스트로 한다.
-
records의 record 각각에 대해:
-
responseData를 record의 응답 데이터로 한다.
-
recordObject를 새
BackgroundFetchRecord로 한다. -
recordObject의
responseReady를 새 프로미스로 설정한다. -
requestObject를 다음과 같이 설정된 새
Request객체로 한다: -
recordObject의
request를 requestObject로 설정한다. -
transmittedBytes를 0으로 한다.
-
stream을 새 읽기 가능 스트림으로 한다. 이 스트림에는 pull 동작이 있으며, 이 동작은 새 프로미스 promise를 반환하고 다음 단계를 병렬로 실행한다:
-
다음 길이, 즉 responseData의 바이트 길이가 transmittedBytes보다 커지거나 responseData의 결과가 빈 문자열이 아니게 될 때까지 기다린다.
-
bytes를 null로 한다.
-
다음 길이, 즉 responseData의 바이트 길이가 transmittedBytes보다 크고 responseData가 노출될 수 있으면:
-
태스크를 큐에 넣는다. 대상은 stream의 관련 설정 객체의 담당 이벤트 루프이며, 네트워킹 태스크 소스를 사용해 다음 단계를 실행한다:
-
bytes가 null이 아니면:
-
array를 새
Uint8Array로 한다. 이 객체는 새ArrayBuffer를 래핑하며, 이 버퍼는 bytes로 구성된다. -
다음을 큐에 넣는다: array를 stream에.
-
-
responseData가 노출될 수 있고, responseData의 결과가 빈 문자열이 아니며 transmittedBytes가 길이, 즉 responseData의 바이트 길이이면 닫을 대상은 stream이다.
-
그렇지 않고 responseData의 결과가
"aborted"이면 오류를 발생시킬 대상은 stream이며AbortErrorDOMException을 사용한다. -
그렇지 않고 responseData가 노출될 수 없으면, 오류를 발생시킬 대상은 stream이며
TypeError를 사용한다. -
이행할 대상은 promise이다.
-
-
-
다음 단계를 병렬로 실행한다:
-
responseData의 응답이 not-null이 아니게 될 때까지 기다린다.
-
responseData가 노출될 수 있으면:
-
response을 responseData의 응답 사본으로 한다.
-
response의 본문을 body로 설정한다.
-
태스크를 큐에 넣는다. 대상은 recordObject의 관련 설정 객체의 담당 이벤트 루프이며 네트워킹 태스크 소스를 사용해 다음 단계를 실행한다:
-
-
그렇지 않고 responseData의 결과가
"aborted"이면 다음을 거부한다: recordObject의responseReady를AbortErrorDOMException으로. -
그렇지 않으면 다음을 거부한다: recordObject의
responseReady를TypeError로.
-
-
다음을 추가한다: recordObject를 recordObjects에.
-
-
recordObjects를 반환한다.
4.9. 백그라운드 패치 포함 여부
-
만약 map이 bgFetch를 포함 한다면, false를 반환합니다.
-
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에서 허용하는 것의 하위 집합입니다.
위 내용을 철도 다이어그램으로 표현한 예:
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 = 0; };downloadTotal
BackgroundFetchManager에는
다음이 포함됩니다:
-
BackgroundFetchRegistration 인스턴스 (맵), 키는 백그라운드 패치이고 값은
BackgroundFetchRegistration객체입니다. 초기에는 비어 있는 맵입니다. -
서비스 워커 등록 (서비스 워커 등록).
6.3.1. fetch()
fetch(id, requests, options)
메서드가 호출되면 다음 단계를 실행한다:
-
records를 새 리스트로 한다.
-
uploadTotal을 0으로 한다.
-
requests가
RequestInfo인 경우, requests를 « requests »로 설정한다. -
requests가 비어 있다면, 다음으로 거부된 프로미스를 반환한다:
TypeError. -
requests의 request 각각에 대해:
-
internalRequest를 다음 요청으로 한다. 이는
Request생성자를 request로 호출한 결과의 요청이다. 이때 예외가 발생하면 다음으로 거부된 프로미스를 반환한다: 해당 예외. -
internalRequest의 모드가 "
no-cors"이면, 다음으로 거부된 프로미스를 반환한다:TypeError. -
internalRequest의 클라이언트를 null로 설정한다.
-
record를 새 백그라운드 페치 레코드로 한다.
-
record의 요청을 internalRequest로 설정한다.
-
record를 records에 추가한다.
-
-
promise를 새 프로미스로 한다.
-
다음 단계를 큐에 넣는다. 대상은 registration의 활성 백그라운드 페치 편집 큐이다:
-
permission을 다음 권한 상태로 한다.
PermissionDescriptor의name은"background-fetch"이며, 콘텍스트 객체의 관련 설정 객체를 사용한다. -
permission이
"denied"이면 promise를NotAllowedErrorDOMException으로 거부하고 이 단계를 중단한다. -
bgFetchMap을 registration의 활성 백그라운드 페치로 한다.
-
registration의 활성 워커가 null이면 promise를
TypeError로 거부하고 이 단계를 중단한다. -
bgFetchMap[id]가 존재하면, 거부할 대상은 promise이며
TypeError를 사용하고 이 단계를 중단한다. -
requestBodiesRemaining을 requests의 크기로 한다.
-
requestReadFailed를 false로 한다.
-
requests의 request 각각에 대해:
-
다음 단계를 병렬로 실행한다:
-
다음 단계를 실행하되, 다음 조건일 때 중단한다: requestReadFailed가 true인 경우.
참고: 이는 프로미스를 이행하기 전에 요청 바이트의 사본을 확보하도록 보장한다.
-
중단된 경우이고 stream이 읽기 가능하면, 오류를 발생시킬 stream에
AbortErrorDOMException을 설정하고 이 단계를 중단한다. -
requestBodiesRemaining을 1만큼 감소시킨다.
-
-
어느 시점에서든 할당량 제한을 초과하여 requests 저장에 실패하면, 거부할 대상은 promise이며
QuotaExceededErrorDOMException을 사용하고 이 단계를 중단한다. -
requestBodiesRemaining이 0이 되거나 requestReadFailed가 true가 될 때까지 기다린다.
-
requestReadFailed가 true이면 다음을 거부한다: promise.
TypeError를 사용하고 이 단계를 중단한다. -
bgFetch를 다음 항목을 갖는 새 백그라운드 페치로 한다:
-
bgFetchMap[id]을 bgFetch로 설정한다.
-
bgfetch 태스크를 큐에 넣고 다음 단계를 실행한다:
-
이행할 대상은 promise이고, 그 값은 다음의 결과이다: bgFetch에 대한 BackgroundFetchRegistration 인스턴스를 가져오는 것. 이는 콘텍스트 객체의 관련 Realm에서 수행한다.
-
-
병렬로, 백그라운드 페치를 수행한다. 이때 bgFetch를 사용한다.
-
-
promise를 반환한다.
6.3.2.
get()
get(id)
메서드가 호출되면, 새로운 promise promise를 반환하고 다음 단계를 병렬로 실행합니다:
-
bgFetch를 registration의 활성 백그라운드 패치[id]로 설정합니다.
-
만약 bgFetch가 undefined라면, promise를 완료하고 undefined를 반환하며 이 단계를 중단합니다.
-
다음 단계를 대기열에 추가하여 bgFetch의 업데이트 처리 큐에서 실행합니다:
-
bgfetch 작업을 대기열에 추가하고 task로 설정하여 다음 단계를 실행합니다:
-
bgFetchRegistration을 BackgroundFetchRegistration 인스턴스를 가져오는 결과로 설정하며, bgFetch와 관련된 문맥 객체의 관련 Realm에서 가져옵니다.
-
promise를 완료하고 bgFetchRegistration을 반환합니다.
-
-
task가 완료될 때까지 대기합니다.
참고: 이는 새로운
BackgroundFetchRegistration인스턴스가progress이벤트를 놓치지 않도록 보장합니다.
-
6.3.3. getIds()
getIds()
메서드를 호출하면, 새로운 promise promise를 반환하고 다음 단계를 병렬로 실행합니다:
-
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" , // CORS, MIX, 잘못된 부분 응답, 또는 재시도할 수 없는 일반 네트워크 실패 등의 이유로 페치가 실패했습니다."bad-status" , // 작업 중 저장소 할당량이 초과되었습니다."fetch-error" , // 제공된 downloadTotal이 초과되었습니다."quota-exceeded" };"download-total-exceeded"
BackgroundFetchRegistration
인스턴스는 다음을 포함합니다:
-
백그라운드 패치 (백그라운드 패치).
-
다운로드됨 (숫자), 초기값은 백그라운드 패치의 저장된 본문 바이트 총합의 사본입니다.
-
결과 (
BackgroundFetchResult), 초기값은 백그라운드 패치의 결과의 사본입니다. -
실패 이유 (
BackgroundFetchFailureReason), 초기값은 백그라운드 패치의 실패 이유의 사본입니다. -
레코드 사용 가능 플래그, 백그라운드 패치의 레코드 사용 가능 플래그가 설정되어 있으면 초기값으로 설정되며, 그렇지 않으면 해제됩니다.
참고: 위 값들은 동기적으로 사용할 수 있도록 복사됩니다.
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를 반환하고 다음 단계를 병렬로 실행해야 합니다:
-
swRegistration을 bgFetch의 서비스 워커 등록으로 설정합니다.
-
다음 단계를 대기열에 추가하여 swRegistration의 활성 백그라운드 패치 편집 큐에서 실행합니다:
-
activeBgFetches를 swRegistration의 활성 백그라운드 패치로 설정합니다.
-
id를 bgFetch의 id로 설정합니다.
-
만약 activeBgFetches가 백그라운드 패치를 포함하지 않는다면 bgFetch, promise를 완료하고 false를 반환하며 이 단계를 중단합니다.
-
activeBgFetches[id]를 제거합니다.
-
promise를 완료하고 true를 반환합니다.
-
bgFetch의 모두 중단 플래그를 설정합니다.
-
6.4.3. match()
match(request, options)
메서드가 호출되면, 다음 단계를 실행해야 합니다:
-
promise를
matchAll()알고리즘을 호출하여 request와 options를 전달한 결과로 설정합니다. -
promise가 해결되었을 때 반응하여 promise의 결과를 반환합니다. 완료 핸들러가 호출되었을 때, matches를 인수로 받아 matches[0]을 반환합니다.
참고: 사용자 에이전트는 위 단계를 최적화하여 matchAll()을
호출하는 것보다 빠르게 실행하도록 권장됩니다.
6.4.4. matchAll()
matchAll(request, options)
메서드가 호출되면, 다음 단계를 실행해야 합니다:
-
만약 문맥 객체의 레코드 사용 가능 플래그가 해제되어 있다면, promise를 거부하고
InvalidStateErrorDOMException를 반환합니다. -
promise를 새로운 promise로 설정합니다.
-
다음 단계를 병렬로 실행합니다:
-
matchingRecords를 비어 있는 목록으로 설정합니다.
-
문맥 객체의 백그라운드 패치의 레코드 중 각 record에 대해:
-
만약 request가 캐시된 항목과 일치하고, request, record의 요청, record의 응답 데이터의 응답, 그리고 options가 true를 반환한다면, 목록에 추가하여 record를 matchingRecords에 넣습니다.
-
-
bgfetch 작업을 대기열에 추가하고, promise를 완료하여 레코드 객체 생성 결과를 matchingRecords에서 문맥 객체의 관련 Realm으로 반환합니다.
-
-
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
BackgroundFetchUpdateUIEvent
는 UI 업데이트 플래그를 포함하며, 초기값은
해제된 상태입니다.
6.7.1. updateUI()
updateUI(options)
메서드가 호출되면, 새로운
promise
promise를 반환하고 다음 단계를 병렬로 실행해야 합니다:
-
다음 중 하나라도 true라면:
-
문맥 객체의 UI 업데이트 플래그가 설정된 경우.
InvalidStateErrorDOMException를 던집니다. -
문맥 객체의 UI 업데이트 플래그를 설정합니다.
-
options가 null이면, 반환합니다.
-
options의
icons멤버가 존재하면, bgFetch의 icons를 options의icons로 설정합니다. -
options의
title멤버가 존재하면, bgFetch의 title를 options의title로 설정합니다. -
promise를 완료합니다.
7. 자동화
사용자 에이전트 자동화 및 애플리케이션 테스트 목적으로, 본 문서는 확장 명령을 [WebDriver] 명세에 대해 정의합니다.
7.1. 클릭
| 메서드 | URI 템플릿 |
|---|---|
| POST | /session/{session id}/backgroundfetch/{id}/click |
백그라운드 페치 클릭 확장 명령은 사용자가 표시를 활성화하는 것을 시뮬레이션하며, 이 표시는 백그라운드 페치에 대한 것이다. 원격 종단 단계는 다음과 같다:
-
만약 현재 최상위 브라우징 컨텍스트가 더 이상 열리지 않았다면, WebDriver 오류를 WebDriver 오류 코드 해당 창 없음과 함께 반환합니다.
-
pageURL을 현재 최상위 브라우징 컨텍스트의 활성 문서의 URL로 설정합니다.
-
swRegistration을 pageURL에 대한 일치하는 서비스 워커 등록으로 설정합니다.
-
만약 swRegistration이 null이라면, WebDriver 오류를 상태
400및 JSON 오류 코드 "invalid service worker state"와 함께 반환합니다. -
bgFetch를 백그라운드 패치와 id가 url 변수 id이고, 서비스 워커 등록이 swRegistration인 가장 최신의 것으로 설정하며, 존재하지 않을 경우 null로 설정합니다.
-
만약 bgFetch가 null이라면, WebDriver 오류를 상태
404및 JSON 오류 코드 "background fetch not found"와 함께 반환합니다. -
백그라운드 패치 클릭 이벤트를 발생시킵니다. bgFetch에 대해.
-
WebDriver 성공을 반환합니다.
8. 개인정보 및 대역폭 사용
패치는 크기가 클 수 있으며 완료하는 데 시간이 오래 걸릴 수 있습니다. 이 기간 동안 사용자는 하나 이상의 서버에서 데이터를 패치하게 됩니다. 작업 중 사용자의 IP 주소는 변할 수 있으며, 시간이 지남에 따라 사용자의 위치를 추적하는 데 사용될 수 있습니다.
이를 완화하기 위해 백그라운드 패치를 표시하는 단계는 다음을 요구합니다:
-
패치를 수행하는 사이트의 출처를 표시합니다.
-
백그라운드 패치가 활성 상태일 때 UI를 닫을 수 없습니다.
-
작업을 쉽게 중단할 수 있도록 합니다.
-
작업을 일시 중지 상태에서 시작할 수 있도록 하여 사용자 상호작용이 필요하게 만듭니다.
이 단계는 또한 사용자가 계량 연결을 사용하는 경우 사용자 에이전트가 백그라운드 패치를 일시 중지할 수 있도록 합니다.
모든 저장된 데이터는 특정 서비스 워커 등록과 연관되어 있습니다. 서비스 워커 등록을 삭제하면 관련된 모든 백그라운드 패치가 삭제됩니다.