- From: Domenic Denicola <notifications@github.com>
- Date: Tue, 09 Jun 2015 11:43:18 -0700
- To: slightlyoff/ServiceWorker <ServiceWorker@noreply.github.com>
- Message-ID: <slightlyoff/ServiceWorker/issues/707/110460810@github.com>
It does occur to me that restricting to same-origin cookies might prevent @cramforce's original use case :-/.
Also as @bsittler reminds us it sounds like the key is not id, but instead id + path + other stuff.
With that in mind I have two proposals. One is based on a simplified model: path is always "/", secure is always true, httponly is always false, and same-origin means no domain. So the keys can just be strings. The other is more full-featured, adding path and domain and dropping the same-origin restriction (but keeping secure-only).
## Simplified
```
[Exposed=(Window,Worker)]
interface CookieJar {
Promise<Cookie> get(DOMString id);
Promise<boolean> has(DOMString id);
Promise<void> set(DOMString id, Cookie cookie);
Promise<void> delete(DOMString id);
// These are annoying because maybe they should be async iterators instead...
Promise<sequence<DOMString>> keys();
Promise<sequence<Cookie>> values();
Promise<sequence<sequence<DOMString or Cookie>>> entries(); // haha WebIDL
};
dictionary CookieOptions {
DOMTimeStamp expires; // incoming Dates will be auto-converted
}
[Constructor(DOMString value, optional CookieOptions options),
Exposed=(Window,Worker)]
interface Cookie {
readonly attribute DOMString value;
readonly attribute DOMTimeStamp expires;
// Immutable for simplicity.
}
// usage:
const original = window.cookies.get("key");
const updated = new Cookie(
original.value + "\nanother week",
{ expires: original.expires + 7 * 24 * 60 * 60 * 1000 }
);
window.cookies.set("key", updated);
```
This looks kind of like async local storage with expiration built-in, heh.
## Full-Featured
This version could potentially be the same just with domain and path:
```js
partial dictionary CookieOptions {
USVString domain; // defaults to location.origin (*not* host)
USVString path = "/";
}
partial interface Cookie {
readonly attribute USVString domain;
readonly attribute USVString path;
}
```
However I am unsure how well the string-keyed get/set/has/delete can work given that the key is actually something like `{ id, domain, path }`.
- Maybe we add a extra optional `{ domain, path }` parameter to get/has/delete?
- If that's present do we do exact matching, or some kind of what-you're-allowed-to-access matching?
- E.g., does passing `{ path: "/" }` match cookies set with `path: "/a/b/c"` when used inside /index.js?
- Do we need a getAll so that given an ID you can get the various domain/path-varying cookies that match it?
- Does the keys/values/entries thing work well here or fall down flat? (Probably the latter.)
---
Alternately we can just say that cookies are stupid and putting lipstick on that pig is not a good idea.
---
Reply to this email directly or view it on GitHub:
https://github.com/slightlyoff/ServiceWorker/issues/707#issuecomment-110460810
Received on Tuesday, 9 June 2015 18:43:50 UTC