1. 소개
서비스 워커는 오리진 저장소에 의해 제한될 뿐, 자산의 가져오기 및 캐싱을 수행할 수 있습니다. 하지만 사용자가 사이트를
떠나거나 브라우저를 닫으면 서비스 워커가 종료될 가능성이
있습니다. 이는 waitUntil()
에
전달된 약속이 몇 분 안에 해결되지 않은 경우에도 발생할 수 있으며, 브라우저가 이를 서비스 워커의 남용으로 간주하고 프로세스를 종료할 수 있습니다.
이는 배터리 및 프라이버시 측면에서는 훌륭하지만, 팟캐스트 및 영화와 같은 대용량 자산의 다운로드 및 캐싱, 비디오 및 이미지 업로드는 어렵게 만듭니다.
이 사양은 다음을 목표로 합니다:
-
사용자가 모든 창 및 워커를 오리진으로 닫더라도 가져오기(요청 및 응답)가 계속되도록 허용합니다.
-
앱에서 정의한 대로 단일 작업이 여러 요청을 포함하도록 허용합니다.
-
브라우저/OS에서 작업 진행을 나타내는 UI를 표시하고, 사용자가 일시 중지/중단하도록 허용합니다.
-
브라우저/OS가 연결 상태 불량을 처리하여 다운로드를 일시 중지/재개하도록 허용합니다.
-
앱이 작업의 성공/실패에 대응하여 결과를 캐싱하는 등 반응할 수 있도록 허용합니다.
-
가져오는 동안 백그라운드로 가져온 리소스에 접근을 허용합니다.
2. 영역
모든 플랫폼 객체는 별도의 명시가 없는 한 컨텍스트 객체의 관련 영역에서 생성됩니다.
3. 인프라
사용자 에이전트가 리소스가 곧 사용 가능해질 것이라고 판단하는 경우 리소스는 일시적으로 사용 불가로 간주됩니다. 원인은 다음과 같습니다:
-
사용자 에이전트가 오프라인 상태입니다.
-
사용자 에이전트가 캡티브 포털 뒤에 있습니다.
백그라운드 가져오기 작업 소스는 작업 소스입니다.
3.1. 서비스 워커 등록 확장
서비스 워커 등록에는 추가적으로 다음이 포함됩니다:
-
활성 백그라운드 가져오기 (맵), 각 키는 DOMString이고, 각 항목은 백그라운드 가져오기입니다. 초기값은 빈 맵입니다.
3.2. 백그라운드 가져오기
백그라운드 가져오기는 다음으로 구성됩니다:
-
id (DOMString).
-
기록 (리스트 of 백그라운드 가져오기 기록).
-
제목 (DOMString).
-
총 다운로드 (숫자).
-
총 업로드 (숫자).
-
업로드됨 (숫자), 초기값은 0입니다.
-
결과 (
BackgroundFetchResult
), 초기값은 빈 문자열입니다. -
실패 이유 (
BackgroundFetchFailureReason
), 초기값은 빈 문자열입니다. -
기록 사용 가능 플래그, 초기값은 설정됨.
-
아이콘 (리스트 of
ImageResource
s). -
서비스 워커 등록 (서비스 워커 등록).
-
일시 정지 플래그, 초기값은 설정되지 않음.
-
모두 중단 플래그, 초기값은 설정되지 않음.
3.2.1. 디스플레이
-
만약 bgFetch의 일시 정지 플래그가 설정되지 않았고, bgFetch의 결과가 빈 문자열이 아니라면, UI는 대역폭이 사용 중임을 나타내야 합니다.
-
bgFetch의 결과가 빈 문자열이 될 때까지 UI를 중단할 수 없습니다 (예: 스와이프하여 닫기).
-
UI는 bgFetch의 제목을 표시할 수 있습니다.
-
UI는 bgFetch의 아이콘에서 이미지 리소스 (icon)를 선택하여 표시할 수 있으며, 성공적으로 처리하고 가져오기를 새로운 요청으로 다음 속성을 사용하여 실행할 수 있습니다:
-
UI는 bgFetch의 총 다운로드, 총 업로드, 저장된 본문 바이트 총합, 업로드됨, 일시 정지 플래그, 및 결과를 사용하여 가져오기 진행 상태를 표시할 수 있습니다.
-
UI는 bgFetch의 모든 중단 플래그를 설정하여 사용자가 bgFetch를 중단할 수 있는 방법을 제공해야 합니다.
-
만약 bgFetch의 모든 요청이 메서드`
GET
`를 가지는 경우, UI는 bgFetch의 일시 정지 플래그를 토글할 수 있는 방법을 제공할 수 있습니다.참고: 만약 메서드가 `
GET
`가 아닌 경우, 요청을 재발행하면 원하지 않는 부작용이 발생할 수 있습니다. -
UI는 활성화될 수 있습니다 (예: 클릭하여), 이 경우 백그라운드 가져오기 클릭 이벤트를 실행합니다.
-
작업이 완료된 후에도 UI는 유지될 수 있으며, 이 경우 여전히 활성화될 수 있습니다.
permission을 권한
상태로 설정합니다. PermissionDescriptor
와
이름
은
"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의 유지 플래그를 설정합니다.
-
request의 서비스 워커 모드를 "
none
"으로 설정합니다. -
rangeStart를 responseData의 길이로 설정합니다.
-
만약 rangeStart가 0이 아니라면, request에 대해 범위 헤더를 추가합니다.
참고: rangeStart가 0인 경우, 일반 요청이 이루어집니다. 이렇게 하면 범위 헤더가 있는 요청에
Accept-Encoding: identity
가 추가되므로 초기 요청이 콘텐츠 인코딩을 활용할 수 있습니다. -
fetchAttemptComplete를 false로 설정합니다.
-
lastTransmittedSize를 0으로 설정합니다.
-
Fetch request.
이 단계의 나머지는 fetch "콜백"을 사용하며, 현재는 작업을 대기열에 추가합니다. 이는 여기에서 바람직하지 않거나 가능하지 않으므로 작업이 대기열에 추가되지 않는다고 가정합니다. (issue)
request에 대한 요청 본문 처리를 실행하려면, 다음 단계를 실행합니다:
-
bgFetch의 업로드됨을 transmittedSize 빼기 lastTransmittedSize만큼 증가시킵니다.
-
lastTransmittedSize를 transmittedSize로 설정합니다.
-
백그라운드 패치 인스턴스 업데이트를 bgFetch에 대해 실행합니다.
response에 대한 응답 처리를 실행하려면, 다음 단계를 실행합니다:
-
만약 response가 네트워크 오류라면:
-
만약 리소스가 일시적으로 사용할 수 없음이고 request의 메서드가 `
GET
`이라면, 리소스가 일시적으로 사용할 수 없음이 아닐 때까지 기다린 다음, fetchAttemptComplete를 true로 설정하고 이 단계를 중단합니다.참고: 만약 request의 메서드가 `
GET
`이 아니라면, 요청을 다시 보내면 원치 않는 부작용이 발생할 수 있습니다. 요청을 재개하는 표준 메서드가 제공되면 여기에서 채택될 것입니다. -
만약 response가 중단된 네트워크 오류라면, responseData의 결과를
"aborted"
로 설정하고, 그렇지 않으면"fetch-error"
로 설정합니다. -
fetchAttemptComplete를 true로 설정하고 이 단계를 중단합니다.
-
-
만약 response의 상태가
206
이라면:-
만약 부분 응답 유효성 검사가 rangeStart, response, 그리고 responseData의 응답에 대해 유효하지 않음을 반환한다면:
-
responseData의 결과를
"fetch-error"
로 설정합니다. -
fetchAttemptComplete를 true로 설정합니다.
-
진행 중인 fetch 종료를 실행하고 이 단계를 중단합니다.
-
-
-
그렇지 않다면:
-
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를 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로 설정합니다.
-
bgFetch의 서비스 워커 등록의 범위 URL의 출처와 동일한 환경 설정 객체 env 각각에 대해 env의 책임 이벤트 루프에서 bgfetch 작업을 대기열에 추가하여 다음 단계를 실행합니다:
-
bgFetchRegistration를 BackgroundFetchRegistration의 관련 영역 내에서 백그라운드 패치가 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
의
수명 동안 동일하게 유지되도록 보장합니다. 브라우저는 더 이상 하나의 인스턴스가 생성되었음을 알 수 없는 경우(예: 동등성, 확장 또는 약하게 연결된 데이터 등)를 조건으로 최적화할 수
있습니다.
-
instancesMap를 이 realm 내의
BackgroundFetchManager
의 BackgroundFetchRegistration 인스턴스로 설정합니다. -
만약 instancesMap[bgFetch]가 존재한다면, instancesMap[bgFetch]를 반환합니다.
-
instance를 realm 내의 새로운
BackgroundFetchRegistration
로 설정하고, 백그라운드 패치를 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
를 새로운 promise로 설정합니다. -
requestObject를 다음으로 설정된 새로운
Request
객체로 설정합니다: -
recordObject의
request
를 requestObject로 설정합니다. -
transmittedBytes를 0으로 설정합니다.
-
stream을 새로운 읽기 가능한 스트림으로 설정하며, pull 작업을 실행하고 다음을 병렬로 실행하여 새로운 promise promise를 반환합니다:
-
responseData의 길이가 transmittedBytes보다 크거나, responseData의 결과가 빈 문자열이 아닌 경우를 대기합니다.
-
bytes를 null로 설정합니다.
-
만약 responseData의 길이가 transmittedBytes보다 크고 responseData가 공개될 수 있다면:
-
작업을 대기열에 추가하고 stream의 관련 설정 객체의 책임 이벤트 루프에서 실행합니다:
-
만약 bytes가 null이 아니라면:
-
array를 bytes의 새
Uint8Array
로 설정합니다. -
배열을 추가하여 stream에 대기열에 넣습니다.
-
-
만약 responseData가 공개될 수 있고, responseData의 결과가 빈 문자열이 아니며, transmittedBytes가 responseData의 바이트의 길이와 동일하다면, 스트림을 닫습니다.
-
그렇지 않고 responseData의 결과가
"aborted"
라면, 스트림을 오류로 설정하고AbortError
DOMException
를 발생시킵니다. -
그렇지 않고 responseData가 공개될 수 없다면, 스트림을 오류로 설정하고
TypeError
를 발생시킵니다. -
promise를 완료합니다.
-
-
-
다음 단계를 병렬로 실행합니다:
-
responseData의 응답이 null이 아닌 상태로 대기합니다.
-
만약 responseData가 공개될 수 있다면:
-
response를 responseData의 응답의 복사본으로 설정합니다.
-
response의 헤더 목록에서 `
Content-Range
`를 삭제합니다. -
response의 헤더 목록에서 `
Content-Length
`를 삭제합니다. -
response의 본문을 body로 설정합니다.
-
recordObject의 작업 대기열에서 실행합니다:
-
responseObject를 새로운
Response
객체로 설정: -
promise 완료를 실행하여 recordObject의
responseReady
를 responseObject로 설정합니다.
-
-
-
그렇지 않고 responseData의 결과가
"aborted"
라면, promise 거부를 실행하여 recordObject의responseReady
를 설정하고AbortError
를 발생시킵니다. -
그렇지 않으면, promise 거부를 실행하여 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가 비어있다면, promise를 거부하고
TypeError
를 반환합니다. -
각 requests의 request에 대해:
-
internalRequest를 request를 사용하여
Request
생성자를 호출한 결과의 request로 설정합니다. 예외가 발생하면 promise를 거부하고 예외를 반환합니다. -
만약 internalRequest의 mode가 "
no-cors
"라면, promise를 거부하고TypeError
를 반환합니다. -
internalRequest의 client를 null로 설정합니다.
-
record를 새로운 백그라운드 패치 레코드로 설정합니다.
-
record의 request를 internalRequest로 설정합니다.
-
레코드 추가를 실행하여 record를 records에 추가합니다.
-
-
promise를 새로운 promise로 설정합니다.
-
다음 단계를 대기열에 추가하여 registration의 활성 백그라운드 패치 편집 큐에서 실행합니다:
-
permission을
PermissionDescriptor
의name
"background-fetch"
, 그리고 문맥 객체의 관련 설정 객체에 대한 권한 상태로 설정합니다. -
만약 permission이
"denied"
라면, promise를NotAllowedError
DOMException
로 거부하고 이 단계를 중단합니다. -
bgFetchMap을 registration의 활성 백그라운드 패치로 설정합니다.
-
만약 registration의 활성 워커가 null이라면, promise를
TypeError
로 거부하고 이 단계를 중단합니다. -
만약 bgFetchMap[id] 존재한다면, promise를 거부하고
TypeError
를 반환합니다. -
requestBodiesRemaining을 requests의 크기로 설정합니다.
-
requestReadFailed를 false로 설정합니다.
-
각 requests의 request에 대해:
-
어느 시점에서든 requests 저장이 할당량 제한 초과로 실패하면, promise를 거부하고
QuotaExceededError
DOMException
를 반환합니다. -
requestBodiesRemaining이 0이 되거나 requestReadFailed가 true가 될 때까지 대기합니다.
-
만약 requestReadFailed가 true라면, promise를 거부하고
TypeError
를 반환합니다. -
bgFetch를 새로운 백그라운드 패치로 설정하며 다음을 포함합니다:
-
bgFetchMap[id]을 bgFetch로 설정합니다.
-
bgfetch 작업을 대기열에 추가하고 다음 단계를 실행합니다:
-
promise를 완료하고 BackgroundFetchRegistration 인스턴스를 가져옵니다 bgFetch와 관련된 문맥 객체의 관련 Realm에서.
-
-
병렬로 실행하고 bgFetch를 표시하며 문맥 객체의 관련 설정 객체를 사용합니다.
-
병렬로 실행하고 백그라운드 패치를 수행하며 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를 거부하고
InvalidStateError
DOMException
를 반환합니다. -
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 업데이트 플래그가 설정된 경우.
InvalidStateError
DOMException
를 던집니다. -
문맥 객체의 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를 닫을 수 없습니다.
-
작업을 쉽게 중단할 수 있도록 합니다.
-
작업을 일시 중지 상태에서 시작할 수 있도록 하여 사용자 상호작용이 필요하게 만듭니다.
이 단계는 또한 사용자가 계량 연결을 사용하는 경우 사용자 에이전트가 백그라운드 패치를 일시 중지할 수 있도록 합니다.
모든 저장된 데이터는 특정 서비스 워커 등록과 연관되어 있습니다. 서비스 워커 등록을 삭제하면 관련된 모든 백그라운드 패치가 삭제됩니다.