From bb7b5359d23e3fdb312f228e52d6059a49bfb3bb Mon Sep 17 00:00:00 2001 From: Helen Masters Date: Wed, 13 Feb 2019 11:37:06 +0000 Subject: [PATCH] Docs: Add usage example to APIDoc and updated README (#51) --- README.md | 167 +++++++++++++----- Sources/KituraSession/CookieParameter.swift | 19 +- Sources/KituraSession/Session.swift | 23 ++- Sources/KituraSession/SessionCookie.swift | 10 +- Sources/KituraSession/TypeSafeSession.swift | 14 +- docs/Classes.html | 21 ++- docs/Classes/Session.html | 23 ++- docs/Classes/SessionState.html | 2 +- docs/Enums.html | 10 +- docs/Enums/CookieParameter.html | 20 ++- docs/Enums/StoreError.html | 2 +- docs/Extensions.html | 2 +- docs/Extensions/RouterRequest.html | 2 +- docs/Protocols.html | 6 +- docs/Protocols/Store.html | 2 +- docs/Protocols/TypeSafeSession.html | 16 +- docs/Structs.html | 6 +- docs/Structs/SessionCookie.html | 12 +- .../Contents/Resources/Documents/Classes.html | 21 ++- .../Resources/Documents/Classes/Session.html | 23 ++- .../Documents/Classes/SessionState.html | 2 +- .../Contents/Resources/Documents/Enums.html | 10 +- .../Documents/Enums/CookieParameter.html | 20 ++- .../Resources/Documents/Enums/StoreError.html | 2 +- .../Resources/Documents/Extensions.html | 2 +- .../Documents/Extensions/RouterRequest.html | 2 +- .../Resources/Documents/Protocols.html | 6 +- .../Resources/Documents/Protocols/Store.html | 2 +- .../Documents/Protocols/TypeSafeSession.html | 16 +- .../Contents/Resources/Documents/Structs.html | 6 +- .../Documents/Structs/SessionCookie.html | 12 +- .../Contents/Resources/Documents/index.html | 156 ++++++++++------ .../Contents/Resources/Documents/search.json | 2 +- docs/docsets/KituraSession.tgz | Bin 77500 -> 79700 bytes docs/index.html | 156 ++++++++++------ docs/search.json | 2 +- 36 files changed, 553 insertions(+), 244 deletions(-) diff --git a/README.md b/README.md index df87d4c..17638f2 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@

- - Docs + + APIDoc Build Status - Master @@ -21,43 +21,61 @@

# Kitura-Session -A pluggable framework for managing user sessions in a Swift server using Kitura - -## Summary -A pluggable framework for managing user sessions in a Swift server using Kitura - -## Table of Contents -* [Swift version](#swift-version) -* [API](#api) -* [Example](#example) -* [Plugins](#plugins) -* [License](#license) +A pluggable framework for managing user sessions in a Swift server using Kitura. ## Swift version The latest version of Kitura-Session requires **Swift 4.0** or later. You can download this version of the Swift binaries by following this [link](https://swift.org/download/). Compatibility with other Swift versions is not guaranteed. +## Usage + +#### Add dependencies + +Add the `Kitura-Session` package to the dependencies within your application’s `Package.swift` file. Substitute `"x.x.x"` with the latest `Kitura-Session` [release](https://github.com/IBM-Swift/Kitura-Session/releases). -## API -In order to use the Session middleware, an instance of `Session` has to be created: +```swift +.package(url: "https://github.com/IBM-Swift/Kitura-Session.git", from: "x.x.x") +``` + +Add `KituraSession` to your target's dependencies: + +```swift +.target(name: "example", dependencies: ["KituraSession"]), +``` + +#### Import package + +```swift +import KituraSession +``` + +## Raw routing Session + +#### Getting Started + +In order to use the Session middleware on a Raw route, an instance of `Session` has to be created: ```swift public init(secret: String, cookie: [CookieParameter]?=nil, store: Store?=nil) ``` **Where:** - - *secret* is a String to be used for session encoding. It should be a large unguessable string, say minimum 14 characters long. - - *cookie* is a list of options for session's cookies. The options are (specified in `CookieParameter` enumeration): `name` - cookie's name, defaults to "kitura-session-id", `path` - cookie's Path attribute defaults to "/", `secure` - cookie's Secure attribute, false by default, and `maxAge` - an NSTimeInterval with cookie's expiration time in seconds, defaults to -1.0, i.e., no expiration. - - *store* is an instance of a plugin for session backing store that implements `Store` protocol. If not set, `InMemoryStore` is used. + - *secret* is a String to be used for session encoding. It should be a large unguessable string, a minimum of 14 characters long. + - *cookie* is a list of options for session's cookies. The options are (as specified in the `CookieParameter` enumeration): + - `name` - cookie's name, defaults to "kitura-session-id". + - `path` - cookie's path attribute, this defines the path for which this cookie should be supplied. Defaults to "/" which means allow any path. + - `secure` - cookie's secure attribute, this indicates whwether the cookie should be provided only over secure (https) connections. Defaults to false. + - `maxAge` - cookie's maxAge attribute, that is, the maximum age (in seconds) from the time of issue that the cookie should be kept for. Defaults to -1.0, i.e. no expiration. + - *store* is an instance of a plugin for a session backing store that implements the `Store` protocol. If not set, `InMemoryStore` is used.
- The last two parameters are optional. + The *cookie* and *store* parameters are optional. -
- The *secret* parameter is used to secure the session ID and ensure that the session ID cannot be guessed. *Secret* is used to derive a pair of encryption and signature keys via PBKDF2 and a fixed IV to make the session ID cookie be authenticated encrypted. *Secret* isn't used directly to encrypt or compute the MAC of the cookie. + The *secret* parameter is used to secure the session ID and ensure that the session ID cannot be guessed. *Secret* is used to derive a pair of encryption and signature keys via PBKDF2 and a fixed IV to make the session ID cookie be authenticated and encrypted. *Secret* isn't used directly to encrypt or compute the MAC of the cookie. -## Example +#### Example -This is an example of `Session` middleware with [`KituraSessionRedis`](https://github.com/IBM-Swift/Kitura-Session-Redis) plugin: +In this example, an instance of `RedisStore` is created that will be used to persist session data (see [`KituraSessionRedis`](https://github.com/IBM-Swift/Kitura-Session-Redis) for more information). An instance of `Session` is then created, specifying *redisStore* as the session store. Finally, the *session* instance is registered as a middleware on the desired path. ```swift +import Kitura import KituraSession import KituraSessionRedis @@ -65,46 +83,99 @@ let redisStore = RedisStore(redisHost: host, redisPort: port) let session = Session(secret: "Some secret", store: redisStore) router.all(middleware: session) ``` -First an instance of `RedisStore` is created (see [`KituraSessionRedis`](https://github.com/IBM-Swift/Kitura-Session-Redis) for more information), then an instance of `Session` with the store as parameter is created, and finally it is connected to the desired path. -## Codable Session Example +#### Storing Any in a session -The example below defines a `User` struct and a `Router` with the sessions middleware. -The router has a POST route that decodes a `User` instance from the request body - and stores it in the request session using the user's id as the key. -The router has a GET route that reads a user id from the query parameters - and decodes the instance of `User` that is in the session for that id. +Within your Kitura routes, you can store `Any` type inside the `request.session` for a given key. This can then be retrieved as an `Any` and cast to the required type: + +```swift +router.post("/session") {request, response, next in + request.session?["key"] = "value" + next() +} +router.get("/session") {request, response, next in + let value = request.session?["key"] as? String + next() +} +``` + +This `Any` type must be JSON serializable, otherwise the session will fail when it attempts to save the session. + +#### Storing Codable in a Session + +Available from **Swift 4.1** or later + +Within your Kitura routes, you can also store `Codable` objects inside the `request.session` for a given key. This can then be retrieved as the declared type: ```swift public struct User: Codable { - let id: String - let name: String + let name: String } -let router = Router() -router.all(middleware: Session(secret: "secret")) router.post("/user") { request, response, next in - let user = try request.read(as: User.self) - request.session?[user.id] = user - response.status(.created) - response.send(user) - next() + let user = User(name: "Kitura") + request.session?["User"] = user + next() } router.get("/user") { request, response, next in - guard let userID = request.queryParameters["userid"] else { - return try response.status(.notFound).end() - } - guard let user: User = request.session?[userID] else { - return try response.status(.internalServerError).end() - } - response.status(.OK) - response.send(user) - next() + let user: User? = request.session?["Kitura"] + next() +} +``` + +## TypeSafeSession Example + +To use sessions on a Codable route, declare a type that conforms to the TypeSafeSession protocol: + +```swift +// Defines the session instance data +final class MySession: TypeSafeSession { + let sessionId: String // Requirement: every session must have an ID + var books: [Book] // User-defined type, where Book conforms to Codable + + init(sessionId: String) { // Requirement: must be able to create a new (empty) + self.sessionId = sessionId // session containing just an ID. Assign a default or + books = [] // empty value for any non-optional properties. + } +} + +// Defines the configuration of the user's type: how the cookie is constructed, and how the session is persisted. +extension MySession { + static let sessionCookie: SessionCookie = SessionCookie(name: "MySession", secret: "Top Secret") + static var store: Store? +} +``` + +The MySession type can then be included in the application's Codable route handlers. For example: + +```swift +struct Book: Codable { + let title: String + let author: String +} + +router.get("/cart") { (session: MySession, respondWith: ([Book]?, RequestError?) -> Void) in + respondWith(session.books, nil) } + +router.post("/cart") { (session: MySession, book: Book, respondWith: (Book?, RequestError) -> Void) in + var session = session // Required when mutating a Struct + session.books.append(book) + session.save() + respondWith(book, nil) +} + ``` ## Plugins * [Redis store](https://github.com/IBM-Swift/Kitura-Session-Redis) * [SQL store using Kuery](https://github.com/krzyzanowskim/Kitura-Session-Kuery) (community authored) +## API Documentation +For more information visit our [API reference](https://ibm-swift.github.io/Kitura-Session/index.html). + +## Community + +We love to talk server-side Swift, and Kitura. Join our [Slack](http://swift-at-ibm-slack.mybluemix.net/) to meet the team! + ## License This library is licensed under Apache 2.0. Full license text is available in [LICENSE](LICENSE.txt). diff --git a/Sources/KituraSession/CookieParameter.swift b/Sources/KituraSession/CookieParameter.swift index 62ae4e3..a8f7c12 100644 --- a/Sources/KituraSession/CookieParameter.swift +++ b/Sources/KituraSession/CookieParameter.swift @@ -18,18 +18,27 @@ import Foundation // MARK CookieParameter -/// The parameters for configurating the cookies used to send the session IDs to the clients. +/// The parameters for configuring the cookies used to send the session IDs to the clients. +/// +/// ### Usage Example: ### +/// ```swift +/// let session = Session(secret: "Something very secret", cookie: [.name("mySessionId")]) +/// router.all(middleware: session) +/// ``` +/// In the example, an instance of `Session` is created with a custom value for the `CookieParameter` name. public enum CookieParameter { - /// The cookie's name. + /// The cookie's name. Defaults to "kitura-session-id". case name(String) - /// The cookie's Path attribute. + /// The cookie's path attribute. This specifies the path for which the cookie is valid. The client should only provide this cookie for requests on this path. case path(String) - /// The cookie's Secure attribute. + /// The cookie's secure attribute, indicating whether the cookie should be provided only + /// over secure (https) connections. Defaults to false. case secure(Bool) - /// The cookie's Max-Age attribute. + /// The cookie's maxAge attribute, that is, the maximum age (in seconds) from the time of issue that + /// the cookie should be kept for. Defaults to -1.0, i.e. no expiration. case maxAge(TimeInterval) } diff --git a/Sources/KituraSession/Session.swift b/Sources/KituraSession/Session.swift index 1736ccb..33cda9b 100644 --- a/Sources/KituraSession/Session.swift +++ b/Sources/KituraSession/Session.swift @@ -22,6 +22,27 @@ import Foundation // MARK Session /// A pluggable middleware for managing user sessions. +/// +/// In order to use the Session middleware, an instance of `Session` has to be created. In the example +/// below an instance of `Session` is created, then it is connected to the desired path. Two route to are then registered that save and retrieve a `User` from the session. +/// +/// ### Usage Example: ### +/// ```swift +/// let session = Session(secret: "Something very secret") +/// router.all(middleware: session) +/// public struct User: Codable { +/// let name: String +/// } +/// router.post("/user") { request, response, next in +/// let user = User(name: "Kitura") +/// request.session?["User"] = user +/// next() +/// } +/// router.get("/user") { request, response, next in +/// let user: User? = request.session?["Kitura"] +/// next() +/// } +/// ``` public class Session: RouterMiddleware { /// Store for session state @@ -33,7 +54,7 @@ public class Session: RouterMiddleware { /// Initialize a new `Session` management middleware. /// /// - Parameter secret: The string used to encrypt the session ID cookie. - /// - Parameter cookie: An array of the cookie's paramaters and attributes. + /// - Parameter cookie: An array of the cookie's parameters and attributes. /// - Parameter store: The `Store` plugin to be used to store the session state. public init(secret: String, cookie: [CookieParameter]?=nil, store: Store?=nil) { if let store = store { diff --git a/Sources/KituraSession/SessionCookie.swift b/Sources/KituraSession/SessionCookie.swift index 21a0b13..f639cc6 100644 --- a/Sources/KituraSession/SessionCookie.swift +++ b/Sources/KituraSession/SessionCookie.swift @@ -42,8 +42,8 @@ internal struct CookieParameters { } /// Defines the properties of an HTTP Cookie which will be used for a `TypeSafeSession`. -/// It is valid for multiple `TypeSafeSession` types to use the same name (ie. same cookie), -/// provided that they also use the same secret. +/// It is valid for multiple `TypeSafeSession` types to use the same name (i.e. same cookie), +/// provided they also use the same secret. /// ### Usage Example: ### /// ```swift /// static let sessionCookie = SessionCookie(name: "kitura-session-id", secret: "xyz789", secure: false, maxAge: 300) @@ -72,9 +72,9 @@ public struct SessionCookie { /// ```swift /// static let sessionCookie = SessionCookie(name: "kitura-session-id", secret: "xyz789", secure: false, maxAge: 300) /// ``` - /// - Parameter name: The name of the cookie, for example, 'kitura-session-id' - /// - Parameter secret: The secret data used to encrypt and decrypt session cookies with this name - /// - Parameter secure: Whether the cookie should be provided only over secure (https) connections. Defaults to false + /// - Parameter name: The name of the cookie, for example, 'kitura-session-id'. + /// - Parameter secret: The secret data used to encrypt and decrypt session cookies with this name. + /// - Parameter secure: Whether the cookie should be provided only over secure (https) connections. Defaults to false. /// - Parameter path: The path for which this cookie should be supplied. Defaults to allow any path. /// - Parameter domain: The domain to which this cookie applies. Defaults to the subdomain of the server issuing the cookie. /// - Parameter maxAge: The maximum age (in seconds) from the time of issue that the cookie should be kept for. This is a request to the client and may not be honoured. diff --git a/Sources/KituraSession/TypeSafeSession.swift b/Sources/KituraSession/TypeSafeSession.swift index 2c6e777..1cc8fd5 100644 --- a/Sources/KituraSession/TypeSafeSession.swift +++ b/Sources/KituraSession/TypeSafeSession.swift @@ -23,7 +23,7 @@ import Foundation // MARK TypeSafeSession /** - A `TypeSafeMiddleware` for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static `Store`, which is keyed by a `sessionId`. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store. + A `TypeSafeMiddleware` for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static `Store`, which is keyed by a `sessionId`. The sessionId can be extracted from the session cookie to initialise an instance of the user's class with the session data. If no store is defined, the session will default to an in-memory store. ### Usage Example: ### In this example, a class conforming to the TypeSafeSession protocol is defined containing an optional "name" field. Then a route on "/session" is set up that stores a received name into the session. ```swift @@ -44,7 +44,7 @@ import Foundation respondWith(session.name, nil) } ``` - __Note__: When using multiple TypeSafeSession classes together, If the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets) + __Note__: When using multiple TypeSafeSession classes together, if the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets). */ public protocol TypeSafeSession: TypeSafeMiddleware, Codable { @@ -66,7 +66,7 @@ public protocol TypeSafeSession: TypeSafeMiddleware, Codable { /// Create a new instance (an empty session), where the only known value is the /// (newly created) session id. Non-optional fields must be given a default value. /// - /// Existing sessions are restored via the Codable API by decoding a retreived JSON + /// Existing sessions are restored via the Codable API by decoding a retrieved JSON /// representation. init(sessionId: String) @@ -105,7 +105,7 @@ public protocol TypeSafeSession: TypeSafeMiddleware, Codable { extension TypeSafeSession { - /// Static handle function that will try and create an instance if Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store. + /// Static handle function that will try and create an instance of Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store. /// /// - Parameter request: The `RouterRequest` object used to get information /// about the request. @@ -171,7 +171,7 @@ extension TypeSafeSession { } /** - Save the current session instance to the store + Save the current session instance to the store. ### Usage Example: ### ```swift router.post("/session") { (session: MySession, name: String, respondWith: (String?, RequestError?) -> Void) in @@ -203,7 +203,7 @@ extension TypeSafeSession { } /** - Destroy the session, removing it and all its associated data from the store + Destroy the session, removing it and all its associated data from the store. ### Usage Example: ### ```swift router.delete("/session") { (session: MySession, respondWith: (RequestError?) -> Void) in @@ -225,7 +225,7 @@ extension TypeSafeSession { } } - /// Touch the session, refreshing its expiry time in the store + /// Touch the session, refreshing its expiry time in the store. public func touch(callback: @escaping (Error?) -> Void = { _ in }) { guard let store = Self.store else { Log.error("Unexpectedly found a nil store") diff --git a/docs/Classes.html b/docs/Classes.html index 60b9fcf..4bca962 100644 --- a/docs/Classes.html +++ b/docs/Classes.html @@ -129,6 +129,25 @@

Classes

A pluggable middleware for managing user sessions.

+

In order to use the Session middleware, an instance of Session has to be created. In the example +below an instance of Session is created, then it is connected to the desired path. Two route to are then registered that save and retrieve a User from the session.

+

Usage Example:

+
let session = Session(secret: "Something very secret")
+router.all(middleware: session)
+public struct User: Codable {
+    let name: String
+}
+router.post("/user") { request, response, next in
+    let user = User(name: "Kitura")
+    request.session?["User"] = user
+    next()
+}
+router.get("/user") { request, response, next in
+    let user: User? = request.session?["Kitura"]
+    next()
+}
+
+
See more
@@ -182,7 +201,7 @@

Declaration

diff --git a/docs/Classes/Session.html b/docs/Classes/Session.html index 4192c2e..8e13435 100644 --- a/docs/Classes/Session.html +++ b/docs/Classes/Session.html @@ -114,6 +114,25 @@

Session

A pluggable middleware for managing user sessions.

+

In order to use the Session middleware, an instance of Session has to be created. In the example +below an instance of Session is created, then it is connected to the desired path. Two route to are then registered that save and retrieve a User from the session.

+

Usage Example:

+
let session = Session(secret: "Something very secret")
+router.all(middleware: session)
+public struct User: Codable {
+    let name: String
+}
+router.post("/user") { request, response, next in
+    let user = User(name: "Kitura")
+    request.session?["User"] = user
+    next()
+}
+router.get("/user") { request, response, next in
+    let user: User? = request.session?["Kitura"]
+    next()
+}
+
+ @@ -169,7 +188,7 @@

Parameters

-

An array of the cookie’s paramaters and attributes.

+

An array of the cookie’s parameters and attributes.

@@ -272,7 +291,7 @@

Parameters

diff --git a/docs/Classes/SessionState.html b/docs/Classes/SessionState.html index b1521b9..c377025 100644 --- a/docs/Classes/SessionState.html +++ b/docs/Classes/SessionState.html @@ -413,7 +413,7 @@

Declaration

diff --git a/docs/Enums.html b/docs/Enums.html index fee0e97..d6e604b 100644 --- a/docs/Enums.html +++ b/docs/Enums.html @@ -127,7 +127,13 @@

Enumerations

-

The parameters for configurating the cookies used to send the session IDs to the clients.

+

The parameters for configuring the cookies used to send the session IDs to the clients.

+

Usage Example:

+
let session = Session(secret: "Something very secret", cookie: [.name("mySessionId")])
+router.all(middleware: session)
+
+ +

In the example, an instance of Session is created with a custom value for the CookieParameter name.

See more
@@ -182,7 +188,7 @@

Declaration

diff --git a/docs/Enums/CookieParameter.html b/docs/Enums/CookieParameter.html index a03cf4c..b46cd7a 100644 --- a/docs/Enums/CookieParameter.html +++ b/docs/Enums/CookieParameter.html @@ -112,7 +112,13 @@

CookieParameter

-

The parameters for configurating the cookies used to send the session IDs to the clients.

+

The parameters for configuring the cookies used to send the session IDs to the clients.

+

Usage Example:

+
let session = Session(secret: "Something very secret", cookie: [.name("mySessionId")])
+router.all(middleware: session)
+
+ +

In the example, an instance of Session is created with a custom value for the CookieParameter name.

@@ -134,7 +140,7 @@

CookieParameter

-

The cookie’s name.

+

The cookie’s name. Defaults to kitura-session-id.

@@ -165,7 +171,7 @@

Declaration

-

The cookie’s Path attribute.

+

The cookie’s path attribute. This specifies the path for which the cookie is valid. The client should only provide this cookie for requests on this path.

@@ -196,7 +202,8 @@

Declaration

-

The cookie’s Secure attribute.

+

The cookie’s secure attribute, indicating whether the cookie should be provided only +over secure (https) connections. Defaults to false.

@@ -227,7 +234,8 @@

Declaration

-

The cookie’s Max-Age attribute.

+

The cookie’s maxAge attribute, that is, the maximum age (in seconds) from the time of issue that +the cookie should be kept for. Defaults to -1.0, i.e. no expiration.

@@ -249,7 +257,7 @@

Declaration

diff --git a/docs/Enums/StoreError.html b/docs/Enums/StoreError.html index fef4af0..b799e96 100644 --- a/docs/Enums/StoreError.html +++ b/docs/Enums/StoreError.html @@ -156,7 +156,7 @@

Declaration

diff --git a/docs/Extensions.html b/docs/Extensions.html index 77bbe0b..20d6151 100644 --- a/docs/Extensions.html +++ b/docs/Extensions.html @@ -151,7 +151,7 @@

Declaration

diff --git a/docs/Extensions/RouterRequest.html b/docs/Extensions/RouterRequest.html index 2089a00..18c244b 100644 --- a/docs/Extensions/RouterRequest.html +++ b/docs/Extensions/RouterRequest.html @@ -157,7 +157,7 @@

Declaration

diff --git a/docs/Protocols.html b/docs/Protocols.html index 9722477..9b10b41 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -159,7 +159,7 @@

Declaration

-

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store.

+

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the user’s class with the session data. If no store is defined, the session will default to an in-memory store.

Usage Example:

In this example, a class conforming to the TypeSafeSession protocol is defined containing an optional name field. Then a route on /session is set up that stores a received name into the session.

@@ -181,7 +181,7 @@

Usage Example:

} -

Note: When using multiple TypeSafeSession classes together, If the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets)

+

Note: When using multiple TypeSafeSession classes together, if the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets).

See more
@@ -204,7 +204,7 @@

Declaration

diff --git a/docs/Protocols/Store.html b/docs/Protocols/Store.html index c926eb9..a705c4b 100644 --- a/docs/Protocols/Store.html +++ b/docs/Protocols/Store.html @@ -373,7 +373,7 @@

Parameters

diff --git a/docs/Protocols/TypeSafeSession.html b/docs/Protocols/TypeSafeSession.html index dd4fdda..b1a3889 100644 --- a/docs/Protocols/TypeSafeSession.html +++ b/docs/Protocols/TypeSafeSession.html @@ -112,7 +112,7 @@

TypeSafeSession

-

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store.

+

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the user’s class with the session data. If no store is defined, the session will default to an in-memory store.

Usage Example:

In this example, a class conforming to the TypeSafeSession protocol is defined containing an optional name field. Then a route on /session is set up that stores a received name into the session.

@@ -134,7 +134,7 @@

Usage Example:

} -

Note: When using multiple TypeSafeSession classes together, If the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets)

+

Note: When using multiple TypeSafeSession classes together, if the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets).

@@ -260,7 +260,7 @@

Declaration

Create a new instance (an empty session), where the only known value is the (newly created) session id. Non-optional fields must be given a default value.

-

Existing sessions are restored via the Codable API by decoding a retreived JSON +

Existing sessions are restored via the Codable API by decoding a retrieved JSON representation.

@@ -307,7 +307,7 @@

Functions implemented in extension

Default Implementation

-

Save the current session instance to the store

+

Save the current session instance to the store.

Usage Example:

router.post("/session") { (session: MySession, name: String, respondWith: (String?, RequestError?) -> Void) in
     session.name = name
@@ -373,7 +373,7 @@ 

Parameters

Default Implementation

-

Destroy the session, removing it and all its associated data from the store

+

Destroy the session, removing it and all its associated data from the store.

Usage Example:

router.delete("/session") { (session: MySession, respondWith: (RequestError?) -> Void) in
     session.destroy()
@@ -441,7 +441,7 @@ 

Parameters

Default Implementation

-

Touch the session, refreshing its expiry time in the store

+

Touch the session, refreshing its expiry time in the store.

@@ -499,7 +499,7 @@

Parameters

-

Static handle function that will try and create an instance if Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

+

Static handle function that will try and create an instance of Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

@@ -569,7 +569,7 @@

Parameters

diff --git a/docs/Structs.html b/docs/Structs.html index 832fbb9..50d6cca 100644 --- a/docs/Structs.html +++ b/docs/Structs.html @@ -128,8 +128,8 @@

Structures

Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession. -It is valid for multiple TypeSafeSession types to use the same name (ie. same cookie), -provided that they also use the same secret.

+It is valid for multiple TypeSafeSession types to use the same name (i.e. same cookie), +provided they also use the same secret.

Usage Example:

static let sessionCookie = SessionCookie(name: "kitura-session-id", secret: "xyz789", secure: false, maxAge: 300)
 
@@ -155,7 +155,7 @@

Declaration

diff --git a/docs/Structs/SessionCookie.html b/docs/Structs/SessionCookie.html index 589bd1a..a89d28d 100644 --- a/docs/Structs/SessionCookie.html +++ b/docs/Structs/SessionCookie.html @@ -113,8 +113,8 @@

SessionCookie

Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession. -It is valid for multiple TypeSafeSession types to use the same name (ie. same cookie), -provided that they also use the same secret.

+It is valid for multiple TypeSafeSession types to use the same name (i.e. same cookie), +provided they also use the same secret.

Usage Example:

static let sessionCookie = SessionCookie(name: "kitura-session-id", secret: "xyz789", secure: false, maxAge: 300)
 
@@ -197,7 +197,7 @@

Parameters

-

The name of the cookie, for example, ‘kitura-session-id’

+

The name of the cookie, for example, ‘kitura-session-id’.

@@ -209,7 +209,7 @@

Parameters

-

The secret data used to encrypt and decrypt session cookies with this name

+

The secret data used to encrypt and decrypt session cookies with this name.

@@ -221,7 +221,7 @@

Parameters

-

Whether the cookie should be provided only over secure (https) connections. Defaults to false

+

Whether the cookie should be provided only over secure (https) connections. Defaults to false.

@@ -275,7 +275,7 @@

Parameters

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes.html index 60b9fcf..4bca962 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes.html @@ -129,6 +129,25 @@

Classes

A pluggable middleware for managing user sessions.

+

In order to use the Session middleware, an instance of Session has to be created. In the example +below an instance of Session is created, then it is connected to the desired path. Two route to are then registered that save and retrieve a User from the session.

+

Usage Example:

+
let session = Session(secret: "Something very secret")
+router.all(middleware: session)
+public struct User: Codable {
+    let name: String
+}
+router.post("/user") { request, response, next in
+    let user = User(name: "Kitura")
+    request.session?["User"] = user
+    next()
+}
+router.get("/user") { request, response, next in
+    let user: User? = request.session?["Kitura"]
+    next()
+}
+
+ See more
@@ -182,7 +201,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/Session.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/Session.html index 4192c2e..8e13435 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/Session.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/Session.html @@ -114,6 +114,25 @@

Session

A pluggable middleware for managing user sessions.

+

In order to use the Session middleware, an instance of Session has to be created. In the example +below an instance of Session is created, then it is connected to the desired path. Two route to are then registered that save and retrieve a User from the session.

+

Usage Example:

+
let session = Session(secret: "Something very secret")
+router.all(middleware: session)
+public struct User: Codable {
+    let name: String
+}
+router.post("/user") { request, response, next in
+    let user = User(name: "Kitura")
+    request.session?["User"] = user
+    next()
+}
+router.get("/user") { request, response, next in
+    let user: User? = request.session?["Kitura"]
+    next()
+}
+
+
@@ -169,7 +188,7 @@

Parameters

-

An array of the cookie’s paramaters and attributes.

+

An array of the cookie’s parameters and attributes.

@@ -272,7 +291,7 @@

Parameters

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/SessionState.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/SessionState.html index b1521b9..c377025 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/SessionState.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Classes/SessionState.html @@ -413,7 +413,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums.html index fee0e97..d6e604b 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums.html @@ -127,7 +127,13 @@

Enumerations

-

The parameters for configurating the cookies used to send the session IDs to the clients.

+

The parameters for configuring the cookies used to send the session IDs to the clients.

+

Usage Example:

+
let session = Session(secret: "Something very secret", cookie: [.name("mySessionId")])
+router.all(middleware: session)
+
+ +

In the example, an instance of Session is created with a custom value for the CookieParameter name.

See more
@@ -182,7 +188,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/CookieParameter.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/CookieParameter.html index a03cf4c..b46cd7a 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/CookieParameter.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/CookieParameter.html @@ -112,7 +112,13 @@

CookieParameter

-

The parameters for configurating the cookies used to send the session IDs to the clients.

+

The parameters for configuring the cookies used to send the session IDs to the clients.

+

Usage Example:

+
let session = Session(secret: "Something very secret", cookie: [.name("mySessionId")])
+router.all(middleware: session)
+
+ +

In the example, an instance of Session is created with a custom value for the CookieParameter name.

@@ -134,7 +140,7 @@

CookieParameter

-

The cookie’s name.

+

The cookie’s name. Defaults to kitura-session-id.

@@ -165,7 +171,7 @@

Declaration

-

The cookie’s Path attribute.

+

The cookie’s path attribute. This specifies the path for which the cookie is valid. The client should only provide this cookie for requests on this path.

@@ -196,7 +202,8 @@

Declaration

-

The cookie’s Secure attribute.

+

The cookie’s secure attribute, indicating whether the cookie should be provided only +over secure (https) connections. Defaults to false.

@@ -227,7 +234,8 @@

Declaration

-

The cookie’s Max-Age attribute.

+

The cookie’s maxAge attribute, that is, the maximum age (in seconds) from the time of issue that +the cookie should be kept for. Defaults to -1.0, i.e. no expiration.

@@ -249,7 +257,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/StoreError.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/StoreError.html index fef4af0..b799e96 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/StoreError.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Enums/StoreError.html @@ -156,7 +156,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions.html index 77bbe0b..20d6151 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions.html @@ -151,7 +151,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions/RouterRequest.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions/RouterRequest.html index 2089a00..18c244b 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions/RouterRequest.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Extensions/RouterRequest.html @@ -157,7 +157,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols.html index 9722477..9b10b41 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols.html @@ -159,7 +159,7 @@

Declaration

-

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store.

+

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the user’s class with the session data. If no store is defined, the session will default to an in-memory store.

Usage Example:

In this example, a class conforming to the TypeSafeSession protocol is defined containing an optional name field. Then a route on /session is set up that stores a received name into the session.

@@ -181,7 +181,7 @@

Usage Example:

}
-

Note: When using multiple TypeSafeSession classes together, If the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets)

+

Note: When using multiple TypeSafeSession classes together, if the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets).

See more
@@ -204,7 +204,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/Store.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/Store.html index c926eb9..a705c4b 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/Store.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/Store.html @@ -373,7 +373,7 @@

Parameters

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/TypeSafeSession.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/TypeSafeSession.html index dd4fdda..b1a3889 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/TypeSafeSession.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Protocols/TypeSafeSession.html @@ -112,7 +112,7 @@

TypeSafeSession

-

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store.

+

A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the user’s class with the session data. If no store is defined, the session will default to an in-memory store.

Usage Example:

In this example, a class conforming to the TypeSafeSession protocol is defined containing an optional name field. Then a route on /session is set up that stores a received name into the session.

@@ -134,7 +134,7 @@

Usage Example:

}
-

Note: When using multiple TypeSafeSession classes together, If the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets)

+

Note: When using multiple TypeSafeSession classes together, if the cookie names are the same, the cookie secret must also be the same. Otherwise the sessions will conflict and overwrite each others cookies. (Different cookie names can use different secrets).

@@ -260,7 +260,7 @@

Declaration

Create a new instance (an empty session), where the only known value is the (newly created) session id. Non-optional fields must be given a default value.

-

Existing sessions are restored via the Codable API by decoding a retreived JSON +

Existing sessions are restored via the Codable API by decoding a retrieved JSON representation.

@@ -307,7 +307,7 @@

Functions implemented in extension

Default Implementation

-

Save the current session instance to the store

+

Save the current session instance to the store.

Usage Example:

router.post("/session") { (session: MySession, name: String, respondWith: (String?, RequestError?) -> Void) in
     session.name = name
@@ -373,7 +373,7 @@ 

Parameters

Default Implementation

-

Destroy the session, removing it and all its associated data from the store

+

Destroy the session, removing it and all its associated data from the store.

Usage Example:

router.delete("/session") { (session: MySession, respondWith: (RequestError?) -> Void) in
     session.destroy()
@@ -441,7 +441,7 @@ 

Parameters

Default Implementation

-

Touch the session, refreshing its expiry time in the store

+

Touch the session, refreshing its expiry time in the store.

@@ -499,7 +499,7 @@

Parameters

-

Static handle function that will try and create an instance if Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

+

Static handle function that will try and create an instance of Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

@@ -569,7 +569,7 @@

Parameters

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs.html index 832fbb9..50d6cca 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs.html @@ -128,8 +128,8 @@

Structures

Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession. -It is valid for multiple TypeSafeSession types to use the same name (ie. same cookie), -provided that they also use the same secret.

+It is valid for multiple TypeSafeSession types to use the same name (i.e. same cookie), +provided they also use the same secret.

Usage Example:

static let sessionCookie = SessionCookie(name: "kitura-session-id", secret: "xyz789", secure: false, maxAge: 300)
 
@@ -155,7 +155,7 @@

Declaration

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs/SessionCookie.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs/SessionCookie.html index 589bd1a..a89d28d 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs/SessionCookie.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/Structs/SessionCookie.html @@ -113,8 +113,8 @@

SessionCookie

Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession. -It is valid for multiple TypeSafeSession types to use the same name (ie. same cookie), -provided that they also use the same secret.

+It is valid for multiple TypeSafeSession types to use the same name (i.e. same cookie), +provided they also use the same secret.

Usage Example:

static let sessionCookie = SessionCookie(name: "kitura-session-id", secret: "xyz789", secure: false, maxAge: 300)
 
@@ -197,7 +197,7 @@

Parameters

-

The name of the cookie, for example, ‘kitura-session-id’

+

The name of the cookie, for example, ‘kitura-session-id’.

@@ -209,7 +209,7 @@

Parameters

-

The secret data used to encrypt and decrypt session cookies with this name

+

The secret data used to encrypt and decrypt session cookies with this name.

@@ -221,7 +221,7 @@

Parameters

-

Whether the cookie should be provided only over secure (https) connections. Defaults to false

+

Whether the cookie should be provided only over secure (https) connections. Defaults to false.

@@ -275,7 +275,7 @@

Parameters

diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/index.html b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/index.html index 00f4793..8e7387e 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/index.html @@ -112,8 +112,8 @@

- - Docs + + APIDoc Build Status - Master @@ -127,84 +127,130 @@

Kitura-Session

-

A pluggable framework for managing user sessions in a Swift server using Kitura

-

Summary

- -

A pluggable framework for managing user sessions in a Swift server using Kitura

-

Table of Contents

- -
+

A pluggable framework for managing user sessions in a Swift server using Kitura.

Swift version

The latest version of Kitura-Session requires Swift 4.0 or later. You can download this version of the Swift binaries by following this link. Compatibility with other Swift versions is not guaranteed.

-

API

+

Usage

+

Add dependencies

-

In order to use the Session middleware, an instance of Session has to be created:

+

Add the Kitura-Session package to the dependencies within your application’s Package.swift file. Substitute "x.x.x" with the latest Kitura-Session release.

+
.package(url: "https://github.com/IBM-Swift/Kitura-Session.git", from: "x.x.x")
+
+ +

Add KituraSession to your target’s dependencies:

+
.target(name: "example", dependencies: ["KituraSession"]),
+
+

Import package

+
import KituraSession
+
+

Raw routing Session

+

Getting Started

+ +

In order to use the Session middleware on a Raw route, an instance of Session has to be created:

public init(secret: String, cookie: [CookieParameter]?=nil, store: Store?=nil)
 

Where:

    -
  • secret is a String to be used for session encoding. It should be a large unguessable string, say minimum 14 characters long.
  • -
  • cookie is a list of options for session’s cookies. The options are (specified in CookieParameter enumeration): name - cookie’s name, defaults to kitura-session-id, path - cookie’s Path attribute defaults to /, secure - cookie’s Secure attribute, false by default, and maxAge - an NSTimeInterval with cookie’s expiration time in seconds, defaults to -1.0, i.e., no expiration.
  • -
  • store is an instance of a plugin for session backing store that implements Store protocol. If not set, InMemoryStore is used. +
  • secret is a String to be used for session encoding. It should be a large unguessable string, a minimum of 14 characters long.
  • +
  • cookie is a list of options for session’s cookies. The options are (as specified in the CookieParameter enumeration): + +
      +
    • name - cookie’s name, defaults to kitura-session-id.
    • +
    • path - cookie’s path attribute, this defines the path for which this cookie should be supplied. Defaults to / which means allow any path.
    • +
    • secure - cookie’s secure attribute, this indicates whwether the cookie should be provided only over secure (https) connections. Defaults to false.
    • +
    • maxAge - cookie’s maxAge attribute, that is, the maximum age (in seconds) from the time of issue that the cookie should be kept for. Defaults to -1.0, i.e. no expiration.
    • +
  • +
  • store is an instance of a plugin for a session backing store that implements the Store protocol. If not set, InMemoryStore is used.
-

The last two parameters are optional.

+

The cookie and store parameters are optional.

-


- The secret parameter is used to secure the session ID and ensure that the session ID cannot be guessed. Secret is used to derive a pair of encryption and signature keys via PBKDF2 and a fixed IV to make the session ID cookie be authenticated encrypted. Secret isn’t used directly to encrypt or compute the MAC of the cookie.

-

Example

+

The secret parameter is used to secure the session ID and ensure that the session ID cannot be guessed. Secret is used to derive a pair of encryption and signature keys via PBKDF2 and a fixed IV to make the session ID cookie be authenticated and encrypted. Secret isn’t used directly to encrypt or compute the MAC of the cookie.

+

Example

-

This is an example of Session middleware with KituraSessionRedis plugin:

-
import KituraSession
+

In this example, an instance of RedisStore is created that will be used to persist session data (see KituraSessionRedis for more information). An instance of Session is then created, specifying redisStore as the session store. Finally, the session instance is registered as a middleware on the desired path.

+
import Kitura
+import KituraSession
 import KituraSessionRedis
 
 let redisStore = RedisStore(redisHost: host, redisPort: port)
 let session = Session(secret: "Some secret", store: redisStore)
 router.all(middleware: session)
 
+

Storing Any in a session

+ +

Within your Kitura routes, you can store Any type inside the request.session for a given key. This can then be retrieved as an Any and cast to the required type:

+
router.post("/session") {request, response, next in
+    request.session?["key"] = "value"
+    next()
+}
+router.get("/session") {request, response, next in
+    let value = request.session?["key"] as? String
+    next()
+}
+
-

First an instance of RedisStore is created (see KituraSessionRedis for more information), then an instance of Session with the store as parameter is created, and finally it is connected to the desired path.

-

Codable Session Example

+

This Any type must be JSON serializable, otherwise the session will fail when it attempts to save the session.

+

Storing Codable in a Session

-

The example below defines a User struct and a Router with the sessions middleware.
-The router has a POST route that decodes a User instance from the request body - and stores it in the request session using the user’s id as the key.
-The router has a GET route that reads a user id from the query parameters - and decodes the instance of User that is in the session for that id.

+

Available from Swift 4.1 or later

+ +

Within your Kitura routes, you can also store Codable objects inside the request.session for a given key. This can then be retrieved as the declared type:

public struct User: Codable {
-        let id: String
-        let name: String
+    let name: String
 }
-let router = Router()
-router.all(middleware: Session(secret: "secret"))
 router.post("/user") { request, response, next in
-         let user = try request.read(as: User.self)
-         request.session?[user.id] = user
-         response.status(.created)
-         response.send(user)
-         next()
+    let user = User(name: "Kitura")
+    request.session?["User"] = user
+    next()
 }
 router.get("/user") { request, response, next in
-         guard let userID = request.queryParameters["userid"] else {
-            return try response.status(.notFound).end()
-         }
-         guard let user: User = request.session?[userID] else {
-            return try response.status(.internalServerError).end()
-         }
-         response.status(.OK)
-         response.send(user)
-         next()
+    let user: User? = request.session?["Kitura"]
+    next()
 }
+
+

TypeSafeSession Example

+ +

To use sessions on a Codable route, declare a type that conforms to the TypeSafeSession protocol:

+
// Defines the session instance data
+final class MySession: TypeSafeSession {
+    let sessionId: String                       // Requirement: every session must have an ID
+    var books: [Book]                           // User-defined type, where Book conforms to Codable
+
+    init(sessionId: String) {                   // Requirement: must be able to create a new (empty)
+        self.sessionId = sessionId              // session containing just an ID. Assign a default or
+        books = []                              // empty value for any non-optional properties.
+    }
+}
+
+// Defines the configuration of the user's type: how the cookie is constructed, and how the session is persisted.
+extension MySession {
+    static let sessionCookie: SessionCookie = SessionCookie(name: "MySession", secret: "Top Secret")
+    static var store: Store?
+}
+
+ +

The MySession type can then be included in the application’s Codable route handlers. For example:

+
struct Book: Codable {
+    let title: String
+    let author: String
+}
+
+router.get("/cart") { (session: MySession, respondWith: ([Book]?, RequestError?) -> Void) in
+    respondWith(session.books, nil)
+}
+
+router.post("/cart") { (session: MySession, book: Book, respondWith: (Book?, RequestError) -> Void) in
+    var session = session       // Required when mutating a Struct
+    session.books.append(book)
+    session.save()
+    respondWith(book, nil)
+}
+
 

Plugins

@@ -212,6 +258,12 @@

Plugins

  • Redis store
  • SQL store using Kuery (community authored)
  • +

    API Documentation

    + +

    For more information visit our API reference.

    +

    Community

    + +

    We love to talk server-side Swift, and Kitura. Join our Slack to meet the team!

    License

    This library is licensed under Apache 2.0. Full license text is available in LICENSE.

    @@ -223,7 +275,7 @@

    License

    diff --git a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/search.json b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/search.json index 70b5c33..78f3a6e 100644 --- a/docs/docsets/KituraSession.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/KituraSession.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Structs/SessionCookie.html#/s:13KituraSession0B6CookieV4nameSSvp":{"name":"name","abstract":"

    The name of the cookie - for example, kitura-session-id

    ","parent_name":"SessionCookie"},"Structs/SessionCookie.html#/s:13KituraSession0B6CookieVACSS4name_SS6secretSb6secureSSSg4pathAG6domainSdSg6maxAgetcfc":{"name":"init(name:secret:secure:path:domain:maxAge:)","abstract":"

    Create a new CookieSetup instance which controls how session cookies are created.","parent_name":"SessionCookie"},"Structs/SessionCookie.html":{"name":"SessionCookie","abstract":"

    Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession."},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5storeAA5Store_pSgvpZ":{"name":"store","abstract":"

    Specifies the Store for session state, or leave nil to use a simple in-memory store.","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P13sessionCookieAA0bF0VvpZ":{"name":"sessionCookie","abstract":"

    A SessionCookie that defines the session cookie’s name and attributes.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P9sessionIdSSvp":{"name":"sessionId","abstract":"

    The unique id for this session.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PxSS9sessionId_tcfc":{"name":"init(sessionId:)","abstract":"

    Create a new instance (an empty session), where the only known value is the","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P4saveyys5Error_pSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the current session instance to the store. This also refreshes the expiry.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P7destroyyys5Error_pSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Destroy the session, removing it and all its associated data from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5touchyys5Error_pSgc8callback_tF":{"name":"touch(callback:)","abstract":"

    Refreshes the expiry of a session in the store. Note that this is done automatically","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PAAE6handley0A013RouterRequestC7request_AE0F8ResponseC8responseyxSg_0A9Contracts0G5ErrorVSgtc10completiontFZ":{"name":"handle(request:response:completion:)","abstract":"

    Static handle function that will try and create an instance if Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/Store.html#/s:13KituraSession5StoreP4loadySS9sessionId_y10Foundation4DataVSg_So7NSErrorCSgtc8callbacktF":{"name":"load(sessionId:callback:)","abstract":"

    Load the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP4saveySS9sessionId_10Foundation4DataV4dataySo7NSErrorCSgc8callbacktF":{"name":"save(sessionId:data:callback:)","abstract":"

    Save the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP5touchySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"touch(sessionId:callback:)","abstract":"

    Touch the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP6deleteySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"delete(sessionId:callback:)","abstract":"

    Delete the session data.

    ","parent_name":"Store"},"Protocols/Store.html":{"name":"Store","abstract":"

    The protocol that defines the API for plugins that store Session data.

    "},"Protocols/TypeSafeSession.html":{"name":"TypeSafeSession","abstract":"

    A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store.

    "},"Extensions/RouterRequest.html#/s:6Kitura13RouterRequestC0A7SessionE7sessionAD0D5StateCSgvp":{"name":"session","abstract":"

    The session’s state that is stored in a SessionState object.

    ","parent_name":"RouterRequest"},"Extensions/RouterRequest.html":{"name":"RouterRequest","abstract":"

    Extension of the RouterRequest class that provides access to the session’s state"},"Enums/StoreError.html#/s:13KituraSession10StoreErrorO03nilC0ACSS7message_tcACmF":{"name":"nilStore","abstract":"

    Indicates that the Store could not be accessed, as its value was nil.

    ","parent_name":"StoreError"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4nameACSScACmF":{"name":"name","abstract":"

    The cookie’s name.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4pathACSScACmF":{"name":"path","abstract":"

    The cookie’s Path attribute.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6secureACSbcACmF":{"name":"secure","abstract":"

    The cookie’s Secure attribute.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6maxAgeACSdcACmF":{"name":"maxAge","abstract":"

    The cookie’s Max-Age attribute.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html":{"name":"CookieParameter","abstract":"

    The parameters for configurating the cookies used to send the session IDs to the clients.

    "},"Enums/StoreError.html":{"name":"StoreError","abstract":"

    An error indicating the failure of an operation involving the use of a session Store.

    "},"Classes/SessionState.html#/s:13KituraSession0B5StateC2idSSvp":{"name":"id","abstract":"

    The session ID.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6reloadyySo7NSErrorCSgc8callback_tF":{"name":"reload(callback:)","abstract":"

    Reload the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC4saveyySo7NSErrorCSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the session data to the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC7destroyyySo7NSErrorCSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Delete the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6removeySS3key_tF":{"name":"remove(key:)","abstract":"

    Remove an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCypSgSScip":{"name":"subscript(_:)","abstract":"

    Retrieve or store an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCxSgSScs9DecodableRzs9EncodableRzluip":{"name":"subscript(_:)","abstract":"

    Undocumented

    ","parent_name":"SessionState"},"Classes/Session.html#/s:13KituraSession0B0CACSS6secret_SayAA15CookieParameterOGSg6cookieAA5Store_pSg5storetcfc":{"name":"init(secret:cookie:store:)","abstract":"

    Initialize a new Session management middleware.

    ","parent_name":"Session"},"Classes/Session.html#/s:13KituraSession0B0C6handley0A013RouterRequestC7request_AE0D8ResponseC8responseyyc4nexttF":{"name":"handle(request:response:next:)","abstract":"

    Handle an incoming request.

    ","parent_name":"Session"},"Classes/Session.html":{"name":"Session","abstract":"

    A pluggable middleware for managing user sessions.

    "},"Classes/SessionState.html":{"name":"SessionState","abstract":"

    A set of helper functions to manipulate session data.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "}} \ No newline at end of file +{"Structs/SessionCookie.html#/s:13KituraSession0B6CookieV4nameSSvp":{"name":"name","abstract":"

    The name of the cookie - for example, kitura-session-id

    ","parent_name":"SessionCookie"},"Structs/SessionCookie.html#/s:13KituraSession0B6CookieVACSS4name_SS6secretSb6secureSSSg4pathAG6domainSdSg6maxAgetcfc":{"name":"init(name:secret:secure:path:domain:maxAge:)","abstract":"

    Create a new CookieSetup instance which controls how session cookies are created.","parent_name":"SessionCookie"},"Structs/SessionCookie.html":{"name":"SessionCookie","abstract":"

    Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession."},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5storeAA5Store_pSgvpZ":{"name":"store","abstract":"

    Specifies the Store for session state, or leave nil to use a simple in-memory store.","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P13sessionCookieAA0bF0VvpZ":{"name":"sessionCookie","abstract":"

    A SessionCookie that defines the session cookie’s name and attributes.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P9sessionIdSSvp":{"name":"sessionId","abstract":"

    The unique id for this session.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PxSS9sessionId_tcfc":{"name":"init(sessionId:)","abstract":"

    Create a new instance (an empty session), where the only known value is the","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P4saveyys5Error_pSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the current session instance to the store. This also refreshes the expiry.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P7destroyyys5Error_pSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Destroy the session, removing it and all its associated data from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5touchyys5Error_pSgc8callback_tF":{"name":"touch(callback:)","abstract":"

    Refreshes the expiry of a session in the store. Note that this is done automatically","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PAAE6handley0A013RouterRequestC7request_AE0F8ResponseC8responseyxSg_0A9Contracts0G5ErrorVSgtc10completiontFZ":{"name":"handle(request:response:completion:)","abstract":"

    Static handle function that will try and create an instance of Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/Store.html#/s:13KituraSession5StoreP4loadySS9sessionId_y10Foundation4DataVSg_So7NSErrorCSgtc8callbacktF":{"name":"load(sessionId:callback:)","abstract":"

    Load the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP4saveySS9sessionId_10Foundation4DataV4dataySo7NSErrorCSgc8callbacktF":{"name":"save(sessionId:data:callback:)","abstract":"

    Save the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP5touchySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"touch(sessionId:callback:)","abstract":"

    Touch the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP6deleteySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"delete(sessionId:callback:)","abstract":"

    Delete the session data.

    ","parent_name":"Store"},"Protocols/Store.html":{"name":"Store","abstract":"

    The protocol that defines the API for plugins that store Session data.

    "},"Protocols/TypeSafeSession.html":{"name":"TypeSafeSession","abstract":"

    A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the user’s class with the session data. If no store is defined, the session will default to an in-memory store.

    "},"Extensions/RouterRequest.html#/s:6Kitura13RouterRequestC0A7SessionE7sessionAD0D5StateCSgvp":{"name":"session","abstract":"

    The session’s state that is stored in a SessionState object.

    ","parent_name":"RouterRequest"},"Extensions/RouterRequest.html":{"name":"RouterRequest","abstract":"

    Extension of the RouterRequest class that provides access to the session’s state"},"Enums/StoreError.html#/s:13KituraSession10StoreErrorO03nilC0ACSS7message_tcACmF":{"name":"nilStore","abstract":"

    Indicates that the Store could not be accessed, as its value was nil.

    ","parent_name":"StoreError"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4nameACSScACmF":{"name":"name","abstract":"

    The cookie’s name. Defaults to kitura-session-id.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4pathACSScACmF":{"name":"path","abstract":"

    The cookie’s path attribute. This specifies the path for which the cookie is valid. The client should only provide this cookie for requests on this path.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6secureACSbcACmF":{"name":"secure","abstract":"

    The cookie’s secure attribute, indicating whether the cookie should be provided only","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6maxAgeACSdcACmF":{"name":"maxAge","abstract":"

    The cookie’s maxAge attribute, that is, the maximum age (in seconds) from the time of issue that","parent_name":"CookieParameter"},"Enums/CookieParameter.html":{"name":"CookieParameter","abstract":"

    The parameters for configuring the cookies used to send the session IDs to the clients.

    "},"Enums/StoreError.html":{"name":"StoreError","abstract":"

    An error indicating the failure of an operation involving the use of a session Store.

    "},"Classes/SessionState.html#/s:13KituraSession0B5StateC2idSSvp":{"name":"id","abstract":"

    The session ID.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6reloadyySo7NSErrorCSgc8callback_tF":{"name":"reload(callback:)","abstract":"

    Reload the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC4saveyySo7NSErrorCSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the session data to the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC7destroyyySo7NSErrorCSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Delete the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6removeySS3key_tF":{"name":"remove(key:)","abstract":"

    Remove an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCypSgSScip":{"name":"subscript(_:)","abstract":"

    Retrieve or store an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCxSgSScs9DecodableRzs9EncodableRzluip":{"name":"subscript(_:)","abstract":"

    Undocumented

    ","parent_name":"SessionState"},"Classes/Session.html#/s:13KituraSession0B0CACSS6secret_SayAA15CookieParameterOGSg6cookieAA5Store_pSg5storetcfc":{"name":"init(secret:cookie:store:)","abstract":"

    Initialize a new Session management middleware.

    ","parent_name":"Session"},"Classes/Session.html#/s:13KituraSession0B0C6handley0A013RouterRequestC7request_AE0D8ResponseC8responseyyc4nexttF":{"name":"handle(request:response:next:)","abstract":"

    Handle an incoming request.

    ","parent_name":"Session"},"Classes/Session.html":{"name":"Session","abstract":"

    A pluggable middleware for managing user sessions.

    "},"Classes/SessionState.html":{"name":"SessionState","abstract":"

    A set of helper functions to manipulate session data.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "}} \ No newline at end of file diff --git a/docs/docsets/KituraSession.tgz b/docs/docsets/KituraSession.tgz index a788b27da0b76a9e763fa2928ef0586f7bcfb781..e8b11938d04c00fca41f615ae1aeec4cb62800dd 100644 GIT binary patch delta 79246 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�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 z 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 NcQe4 zUUQh%)pDsZM)cix+Q^t*S-+)6E2OWN`s!|5eVyIX1%rovBEIv=_|AW(NpVy1G;>!} zP=RiTb!UIvlUhk>dy!tSs?CTl)?6*2Tz5o?Ca-p{Hm_E%X49qukXrB@%k-EQ(2K9( zgFj!jz3y--Ys?`%h2SGV&X`kL*JrBH^HqV`)5($%qb9qGbj%N@g9rSB!ctrjQn*5;RA?4w_PiJCLFai4~_ z#9WD(%x4hCOBL654k@AA)UCo!G0`%fXzhRS5yp_xiwpx>Ip6Pr-ZsgPuL(QnSubg9 zdxs-qw#`v+`t9ZHbdO5jE|}-HH>7WnEmKl=)IF zZq~FVmL%KB)!nW9Vo2o*&H(y~%H<0PEjo?HlQI^IY&EA3N#Nq`U4B#VPOhtaE|-6P zZ($*c3o5?aY}T}xu;ISj5fQwLJoCgZlq{x>Y_xY@>3 z?rwGDE&I-8$2K(fJ|8{d_`oKCibj9r-zSl%8JLNAQy4=H^%e)2;|ukUetRn3_g+o* z5A<``Pvd>WakZmYufXn1_pe?}aD9=_R+}Ae?vb#ja zM}82Ch&ef(ou5{UsZu<)dqJdM2C@WOqVO{6MPIJokhoBupytU5bW%_Za1%%b3tF$+ z!f|SH$8lKuz})l$8q4uvvcZ3+-+uia%G!*nzVHmS2@F#wa3P!Z%?mCIx&o}~i+48& z!HZVmosX#sZ>pcPRc7>cP4sBHp6vz@62JW#nuS5OyEUJLxtla$`rPq^o^rR}pZT7xUzZU9an%e(k@Z^8J3-t*m`DA=H zjekiee?OZ(xlqqpvoLrvj+4pBtKAfEjXc|*#IH8v_b%o)>Qke9$cc{bv)fzzf4<$V zH`%<}5Bld!khbu@n9+W_Cz82;TbI<7IH8YzreFWlXD|0(eD?9D@YektX|FC`U0kR? z@#D#>w^Y!ypI}+w0k40&R~O^|F@5qsX|2e0Lbaj?Nsrb`yr=&z)E5PO8NcMef2MJG zauFGqN`(97+3;(TF4qN{EwiYq$K@|XQ-19*d&y{Ae=RsCw1JdG-yQCY^iSG*jFJLz zN*E67Kl4@L$*`fJQG5DY^H#30aT4W&i|`{2_O`)e7qQ_#%_)CI)E8S93o?ntP+DY3 zj)<nLN_G&rOh1NZ{#pz(~)c?;h`>g%Fu%*-e%U}C;3Tz|}Q?uzHNr9QxpVxvyx z2{MM3ngm(`{mNCk&_>Y541}-t``Lb9O|GWn+4!_qr&mVdmmqKk@larAwzg?kv6|x# z+;(DB+hc1#GaP@jfEmfo2xn(=o=&da-!vV=aQJqWy?asZc2u|RV7AP5+DQlCw!SZ- zv*w_VrNQr2^h>l<;)pyD`9!bh97o&{4Buf0{DB{m{M&A?UjQ13eqhVkZMJcmGo~hK z_}RD~NY{8Lf|Ujbys2+=*g3ZO_`cfSQlqLbs;nf|BGP|Rbk1K&D0Z>@mv zvPYaQ5t^YA(h_@imS&)5DgvM|1mQHwV%xpnH7B_j$cm=>wcoXRbxEk` z$>r2_gSMwN5iv=x&7hdjr!g}E8$AM_*VVGzN^s9&(veP+DCXeECHMwZ z@pJZOV8y1N04~Wkfx`*Ul=pd#Xv}kEhJmrciYX19Yp0dYZ6z{lW1 zQ;e5f6fDGR**Y)Yoxgqi_8f+d=kz(&3s&U_BGd*5RzJM_{QTb|B{6ORUHK$R{!CRu z3|L{Vh{LQ`k;Fih6kJB?9qxlK-7M9K<;Q>2)s~T*y$ndvIj*udnGRQWFm!bQ8eVo@Tjr7)H!+){L} z+@cf+_?F$*>1c1_*kIa9-8LelY)0rEP(}}S9^4%{|H;R+Q}JdM?oZILB;Np1#7}>P z$qSeGopq5TPUZ`2Hk9~sldY)Pn;jCr)QOGHww>UF*!Ye+Fvr%wE}q7bAu6ujHhOof z-DMGVSvPsVzg8=EOGPiesHn@q)$6-za}U_AC5svehOE|sr?R@G+vnMG3CK-2bghc& z70Ur7Hz0rUTm0D(Pj;6^MMkf{rcS*{AE4d8f5FRns9L*Y z2Nn|1o~O{Y$X0e0KVS>7nyTl8iGEHyMBa{#NnF9x=^-c5mo=UoJQ)bbt!#OiA5f={ zm&>qPT~Ro=QsbFEVBVr7)S25|t0Df;a!>_}t_7>P6e^=sqH<;ms5aP(L|cCey~U<3 ztFJX<(P^T^#*T*dNHg=U8=UUGWsm%)&vvl|6v*P&(8NseSK%a0xQdfE#)mbVywPJm zZA7^xiD%P!fVAJ=nVi`D2AmQ0i||%A?L449YwHsJCU(w^w@@`I`mAgK=^OF8eIpVb z-NMNh``Big_MqG5%l-b>0+@f6PWSdPTMXIT&kMz5z8_s&uo*WW;pBsxYPVRI;NRq& z=h~)77RqV)7o#e0Nh~JB$0d;{nraI$T9_mtZ$Dk%5TR$O#)wN?|Axe*g6t_QUJ?3= z`2cPP3CT3uHL;6tVkIlxU?z?hFoEO^SSx=an{724o}PZDH+;zo=MC=sAQvw#-7NjQ zpZ4Bb@5FI*MqM?I;=X@wr9Q`(J03X_+QdVYdj=Er6Zg8)Cw)RQ^u5bp(y0Fin&zbH zcYY?aIoO+FW;h;>-|MqL>{0n<(4CjRNMLcXDe2)wdl z5xLw{tDc)Lt{-vd@k{J0iDl-c#ob>Dq$U-V605EkK4!iu@|S-qi!av$&2de_C)4rK zCwZ=zW+~<5?dVQ22?@6vn(^A|8ryYwmWWCEAAIix>ry)$Ec9O8d-{7%ZA4aXl4vvWmP>C+*# z|NY_c8SPQ;4?lovo~=Xg(r_6Bz1RVDw6cxrFYCQ zRKy$J34MRu(gjaG>Xy?jG-uoNox;w2`VI$%RE8E8sjJwVdWb#9Fdo!v=8|p2a76PC zTRrvGIzTd6stHXK^=29;Yah#Gi7EO{ZKtkKFiAZ?H<{rKCim4?rneSB6TbUQ>WJA+ zU*04r?v|0!ypK>C0#Y~D$#cEr>{>ZLH=7%)s=I%-wl%w!SWIDNR{1>OsFCU1n2f53 zMW~qHdBO7EF_#K?NB2SQf?Ed$J21jhh^W?KhS)sF3tX%lDp=l70ek`1cU4%SN5q;Q zi*T99>A5oGH>pGeP$)yn%7$yWV+EA!JJslTe+YxYRgRLi&9IsWm0gE(x-urXc319> z28w?o!Zy-$yiqk=T4e;$F|CP#OdB^~I^J%wTLi-PKl;zwm*}!W+Y)0;qFofN5nb;{ z^!6B$;)k&dlRYxoLVGbk+_x=UHQb$uIS} zp%`Ttqv-kuhmN!(Ry#gzWb^1B9yO=FuI}g6D!!;4cl5WWLcfKTuPJYU5`cr;{r-Dn z6dR9eh9YnRO6y0Hi1_NJ_NyA_V4{Ef(KJ$(m^j2%eNKg$7fv|{1igcAmrR-)XfkT`_YKb)M(9zH?1PH9gqsHRN<8j_I?zlNDk7#R}7+2M4DyrTezW)+i4NaRB z8sCpdV(WO4$E^3Tr%1WBqW0B{kadH@GGB!D02ATpmT9G)#=iOvI%ErzWQKn!^Q~TG z5wbgma(>aa<2~?3>d`_mNFxT<;b>j0>s60rQ>R(^D={4XsJSx{d9T^#xr1UDHGzP; zn~c&ftfMgL7|H3}Dzt;3keW)H3pl$DSQ0v?T5Y9AR7N9Nb?!Vo_W}~SV#BsmL&558 zFG`#@@!8oAdKm;>?1+s0(yo6GYbdAvLHDOWnny85`}Er8W83&1`yqCGA!B0WBvo$K)VUg1o3Ri?1;Xg5rv@x^MOf6)}lKrvy+-w2Xpw{Vw2jF-E0upj*MHw zd&)hd4{6TMhyI$> z`-v?gelD8F(o{?8)JFAaJ;Fo`);eNq7y0YS*b-(~G(Q#bPsJpg>IKfBI#?gH-fYv; z)1MJ@@hxq0&o>oO`yEa3Eu0&EE>M?it_x>VKNp4ySoyWr;P6f}UqJ|ECB6~{6?lN; z?8S8Pj%aBRxV3;j@Be>Tu;1rkeTzLvw4NF3#WIoUaYt*CCjcA-w%fPsO$l#IDnyQm z+zDoo2(i*jpxcoX$XT}+~%&b4}_D$l`1L>yV`ueLc zcDq~sKqDtsa(?c7Ragf$Yb$POmqI*I*on-0Z@!k5d#Uo!!P=o90Ol zz^BGZ2C)Dnp!jR}5QefTv^$p<#U>ks6U%qzvM;{Z`Ql@CbYHxD`CSzIg#{;o_BdID zM}2PW4t>>0a4vi#y((@x)8C!DC&BTt{u<2CQ05-lVo86zXdL(QxveguOQ^chD*w;0 zp8=ff;5H9?%-XZUaUkdzCMpwsJG)(r=Kb`tK_>W_xa_dlo$1e}V&v2$wVmH%>k_X_ zhw69F%3KIE5iS_UX}`a3+Aww#WmcDTKw%k042i^IMaco%CH1*j6|h&9u`p;nV-&3o zjv+zDb6S4`*t*iZYcYg&*xuTVgJ~Y*0pP`Y>eYC1!MuL`b95|UyXa?^lblLyni)* zHNF@Hiw>%_+axOVDY+Ou+?qr4c5J6#3IUd5MIV1dk+1vFFLI#cGnF_6#u#@l0DOb( zB5tDqnyne7G9Pdzi%VIWk)l};k0biafl))kpX^FR(q#2NY!Xp-V3JrqJY)E3^Ltp>|2|XxBf)uqF=dh&2AIq?2B@W$Sah)`J zD{p@s^_gBX=Wsf^2zOXuo=KWsuVTA0P1_R7+}R|Dcc%UaRd%4v%L^Rczk_oqyJwvyN__ z&RlpIOQ-y>glwV1@O({OH8ZXqR_a+`rQUz(f~C!XLEG6#=3b0}akhX%bdK5w*yxFk zWLAzRd4sGX>~}m(I4nVaN3`PeO*ZEzwES4m71UIb?!o$3#_z6&mfcjFdDWW$rO(q+ zX{}9OGV~~0xsU8sS08kt_~xYrjVimrM@OFhs>G^+5v%7;=a$*Cl$|1ty+Wo9FBgBx z0E06cp-CQcaN4HYLwC4V(kFQbh_{58jlTQ##Y;?K>#}2{mq6n^^R(S!+omo1;zmFW z+H5N~wW(O-?v-QOUq34AH_sxg!}X>bS(DUn^{(0zmX6%7kqNae3vLrP3|<>RLcx3FAQ7LrLIL!P`!20eE6kmm#}}VX5fXc zQrd^|?Rt5)WBu$kpiAp_L_l%F0L}&sOyDilWTxtA{OtS^N2?`$&eVfNU)rr8Jf%?Q z&319pn}@NH5i=tQms}&MwNzM(mz!7w1+ONJt~X%#Wt<1DZ{_ZMfxrE^%Ytun9$e^q z%7q{7GZB0M=ZrE)TOQw-PpyCAWXWB$66g?5{kCq7X#5zsq+_PpTdXVYC!dE&sRKJ> z4BT{X5YPk`@Bx^mLxmP3!-E63)FI!(6C>6=I5@^xbN(aVE^#Hqa&KABJnk9&F@(cU z5Eq=fSt*f0}y|kP=fI}I3q5A z?sx`p(`4G1H-BoriD-k~tGLCxhd3z@%FM%tBX4lb#;dT|nWaSw)eawa0my18{gpWY zKS030&IO^Ys~3`9me~=pdI-500!EF8kbnHc$f4y~Hu^sTmBtZlw5TRumm+j$irh{fBhRt=`)2 zi_)A+vJT$Id6I5oqd7wmJ7^~#RQhFFO*INXgrMSfTEWcT&bUa~nJVde4!5E{iwgPT zXCuGGqZSUhb3bhdQZ9`WYnJj(G-?u$YCIdWS?O#Hp!j5VbWcNkDtJzRG1u6m>~^vB z3fkvqvA2Y1rdFyLSBaPY5)xI+MIcNQ1F$z~8`IY&h&&7fcr$rCay`fLzNLk={7#RQ z3Z-NVRYi;7&$%G|eUV#)HdYzCt%i#1BWz{jz?NcfT;*6YF;Gv67eS&CpxV&w@{*19 z&0yG3KQkJd1o6?6XnnVT<7DrB78iNQOMl4Sur|98T({@pZ`oB2xlyqH5PU{RL>IRc z6B#nmE820S&Dj*3FSa=voVp#KJdqGoYTT6Bp4_oLEJQXp5F0HkAK>trg*BQ)cwbe) zoyi~z(qstl+{a@xn(Xf@iyIA_!@gePvSifr@upN^biU3 z2A{3U7u9kmq6W=@PawNR=1nh@O-0-=?Y8ne$Zkq=-HYVZ5P?8c`;#|%E3d$mUi}q0 z)eP6~xq(`(pRZRl5*~JG7oR(L55$hSzxUEvDe*{jS@wy(t?2R1K^ci6mEGGuMhQ2_ z5s&`m|N8&`{U7*$?=Lk?n(Rfjg<}}jF0Hi-eWbFz_`VVl%I$^W7q=Hz+l%GhYBRX0 zSA(nV@A<}XIQ+K{KRn^zKg#d$=?C&V9KQd@rAziGesD5;`p4mi zAO2q_!~g2WfNOLILZ1zYw(wGzb`~Q)De-}@l{L9Ic6O8D|`3d_a zT=4i_ag;Sm`}icUcPGpGx;lBWUT)M$4$P9fVsWy)f&PqmvsKCJv}}8lZ?K8dTf@P> z4W6Rp=j+>hN$fq3Po54h|9JB4vIYRkH%O&TG+S24_&=cyS#7J6ufKdr_ZR;?>IX3yh^b-1mTOm>M=V$;r>n`)zW95LfZ+8f2SloKjE(t0PB>sAQc zxjKw?1MMxDM%LeZjAVcRd8KF%j=| z;n`OF^twJ^cfOsRce0BVF&@;~wFZueQO(a_-1^ynO}*Rsky+vg5i#))?P=!pqMlP1 zepOR9t-|+ZJXqNGGP6QUi^o=R1_4x*@Cfn@dDHEemZzz-DLKXyti)%69|4nU3ra(i zj_&g6B(wcXEY4~$TW>xKgyo%X-y+)z{`ZEGOeg|r^kg?pT_7%#WK^&RCH9HOyG68; z?Vj0xft}NmWcYnEV;f&I3dBlGHN7V~0?$fawyJ4xHarYV_w=#RtZwREFr6N$YW2H@ z7tw(lwd))YtyI+3{bkaE0_qM+USx>^wzw+V;@YrI>)a2gccMMgGo zH3D5B&2~XHjCQ07Y^&R9lkL`<{l1Z$ak7P@@RqbF zl$#!J;;g=kgMM)3Bj#G?7l4nYX;@LWKW+ zVP&UQ#|O^Ne7fI@zNH=F?WV>ac2d2g+_Szb95a5_<`JLXkT7>!+ zVm^v%B3OQ|?k?!e@n6>1BO@9%`_URtbjC&(@JGL#nQY&zci-E0JJ5HG#PSm-FR9Fblbh`Rq{!}wQz3$tla#wXdAq1qC)#du%d=ns zvnC?#gIB9a@s8r!7A~*`FJp4K<=>*G`i(mMt*(`YS^u*Ov%>BQ9;)WZ=|LL;4xz~z z{JyOt9(A|v_sxQy!7G%-(Xn-R)pZu|LA(ln=jT>J!!`7%{;0QmQ%|2?rs?s2&c^YW zT{)kFb*cO5WzYt_<=1McR>ztku8IF`+VGE7Ul^xj+e@QLv@@Jvp5oM^<1>gJdh8>2 zAy;nfL@St?U>CNbj{I_U;wBxAR?ler?f2cA>vT8SOx2d2)z64F_SXKZlkK#(RwPh( zklSkwlfRBfTPkVPegJC4vvzHNJz=V&y|%4(zjIq~Z|&A0Twkcy(yczq)BN5=s7daD z2jg#50mhi!k$W zlh$gT*4$1zrPd?nbgPfn{x>$dGde%8Zhl~suBqTPzjOF!O6cr!*Rkz`Hm}=*ZgI)B z)jNHN$z4VZcsQy?@lGPTsZ~GSJwc92dZoLpl-1DN*Biqqx9VE1cSneZ|LL7v)TqPR z*=iJ5=<|l&zrmc}nc4^LHOL<+{<1$gF3&LUM`vzlBuT9gaAEKfg_8E0JbvAjZ#O zBo-?OsUyEX!Z*#SKzHSLYi59skzV(GL1a5t4AJI>YN4|fkno*mGP{b=OxEuy%J5^4 z6{oxN$YL3)RcBYxl3AU@FTLvXQk*T<^iF;8G*;{I1=?t7lf4w8w)SyKHly9MHTyAd z=&fgLw}H!lq-aBb+_>QJ2C*WJw9}gq|MhMCUvHRMaP&Ggi^>~s`j<9f&at6{WmQ## zs#ViKBa+xRLH58OnXl{CZf$5pm4($(z|u1}BN@^9+4}r)zu!FDo?pg{e>ch|HIVWa z)QT~#KjN#p-%oJ&40mT|#E&ICkw=h9ozw3tFliQF>R2m(*&Dhoqcj@VMX=bNX{}x3 z9QCSN1Adf@-K_$-+mK1@@ji8VW+@^LQTeo%rdEuYb~`=EFdKARda=h4U^G^)mZJ@^ z0h%JBcWUmjHFaUQy>yeU#~4QY3A`>LCtG~pj2(@@X3ISz)z+nknm2-UL)2Az?~)Uy z7dyx|dT?-mt@PKgtCj!krA^Sd_3I6B)110(O&qYFaTh=DEwW2dPCt)ntw>$9(tSm>Qzsb z@0qv;c}Rlktjuio*yiDXBvg#seMCxZDLyK5$O71Z7jxazJQ>u=n|jOGUdc&uw}G(^ zbcg1pesogbz<&hVm#A+GHk#KaTe7lqmG(!zP%D|PkhW%O<%Yi3RF3v4mjGkK#?;l* z)?^JH#-?DC)y?9dXq!2h)lK$`a{JGb-!8F+zKOD$M_QHB9Axf=#xM(^6tuxrDz2zI zm9N)-TkyF2yWd|PLY`Z?Q$*X9vE^-l4}E=%kL7{b9euT1+5dl|EnhZzlk5*=XJ6c1d!a?TJ)nrW!3vW%^xJ|$HgM-%Q zb!-qEv}~<5ZYP9pX8X~`d~EBhZ?bgbSf%Zhg9zPG{=1KY&d{&knR+f$|MBE*s*1Fp zETx@lmKu-{F`~6!L+qDZDt-3sc63W+6_ZNlSZq&D?C@0fK%z~{pz5GF-a_|!FGL9^^R>oUMFFH!tcxk zWKH1K9T#_4AAq;t8l&aQ3qw_&bWoZnYbAOGB1X;6inpS8K!wd(5!HJT^12AArcrck z(82}g7%uP9OSNoCJJgWPDUQCiVX`&Td|w$FdTz!U*oK!Ec0LsGVg2m<67aI3R3$>3 zJ=s3FbHsR-F8s!TCTtJ~T+i!&>k7VdKs+{BF6s>t%-d&gMsJ8FCgtSK6uyHq z2eu&sRc}cH(r6Lo5uW4D4wfPPk4_9H1os$<#hOtDnsGZnm@x0umO8#lYELN_E)$ui zFs3k@7)>}INW!lJtqv4-zLVcWC&dU$J|eImp~n@kA9unLETuIcYOI5Q?b+>?>!}gy z8{@f+X{`@-Gd+cQwn6+bbE3Veo9Rh(JbSXRa{H#6#p@PDA2eT|Sk7O`l1lvbrFf9c z=BC`4e3P^YkEntkOFBAHs?&>=>x87)DK?Ma=%n2ZHlHDSNk{_C^X?sN+jV&Mdo6V; z8-GCaRlcvI*7)s$<3+uHD{nc~2)+J6jgwuD9cc$rm(`#cHvwI=PZ%mm>!N(MT{Ejm zJ?#>R_*K>qk(Bdb&aI`E{%*8uZ~@#fq4iozY)&?m>j9XJRbA!HtKCsy#=P0}9)0j} z3nzZL>&=dXRIdqe!Sam5Ocng$J3o)R%00U9wr^qy1AYf0yN z(q>7Q^f!VV-UA$e_$$g+a82G+h^8qZT~bUT#T2+i&)|x_jBN7Z2vT@7`FmE?>$@ps zqZ_`yryHW`ee>*o`Xs_RVP8MT?KX}6-i!L1eiVGsCvsLDMF)`;A7|Npf2CU9~b)xo&#V|92j#ux|qTI01nE6vQ#?7btc zq`hRxmMmE-TgH;S>YeG?ZEI$F)ZL@ql~>sEfe&mjH|FC^2(e8dh8RdVjBU(k2;p!- z2qfem;{b7g5)#Zu@(bio@K>*n?&|KUo|)B3mYr_>G}~Rrt5>gHy?Ryk>Q#SR3LN$I zx5ZU^cDy*NABW&6zQ9^uv6JPQnrut8slX=gFN&LU2o#audnOZjt_{Tk*h=Ehmdh_jRhXDRc| zVz!&b95+jNZ5Fr;YC7T|gBfiW^VlqAuvyGov%ppWaTY+~+s<74i-4{Mh@&49C7lI_ zYO~-%5yjZESRI(fKk(nE&H|cH4nRie0m@KYfIH^4>a30MG0G5n+-XGgvAe&mSVVvK z)Itvz|$}AgNHg!1O4Dc-npy^k~E!&Kz!ICyM6T_w#@p8Z6 zbymN@NtkH`{kZ}cgCs0+s;u0K_i>pU3k$qhw6w=svnq?nAl(!yO97xJ5U7$1iqv3V zzeSuUpvkh;Uu4nyz)1oEX7$e`d_{uu73QITQS}2;9bkGtz(7Uj6Eu}hu+vf4DC*Z! zs23kesBXq{m2x@j5b?=ubNs-8jTy z71;pRIJD@IQ-h?rkhUTEjMV|n>d*PXG|(^`Fe++)&fhu|i{o`-p!S36y(bZOPyt7O z0}jM>lkD9APy2<{zZ(~Cxvj}_vAFI19fz|&_I8}Ivl_hb1nA3hYt*=-D}XyR`~u6O zNS7*u;j%XBIjtcw84I7-!BT{lu(1}%a1!ZSms|p>5$r&0vDtprm0~`EU z;}JiGucCy%*jW|4fXN~JEf(=_2^@KU!;59WpA!Bt$`kOnjDPa@cLsh<3=)HZOye5< z!K=*pO@kccxWIA9ki#Hy*jNudC@zizlK4E-T~$R{x1NpQr7el7fqcfBUbk4b)UgkHkG_}!QyzqAA${ukhXr;LBV zTSN?})NT9&uQyaNsfwCP|KeZ$h(`Yu0mqVxe<7?y4)De(iAyAV3F6C6P0I%UA+Hc` z6z~uEwJ}8v@`K^ylm^XgRPpZ=#3N21ftHHtYGFjsFQ9H=a#)kJ0W5OuM+~<)EIh@) zuQ+Zj^vA}3NSLOZrDN@ALBn#EydXX4DR*(N0wI74#eQ`_|i_it$P+&0vPLRxT8s5v}$HY`S8aIx;5Twor5Y#Iid$iOkl z?2RV`vti$MUS0N47^aQ?$PA=7u##ONY8pwW-E;n;+g1NY~4*vNsEUz+ipLLmy zJ{vq-A29zbZ({V>ScX-9D}4UsfK$(M>me70*6)p>!{9o9dwC}FKD$#dV)V|`Q$h^E zkRYbWTYMt0YQe8FP_%IbZYS8bmBPYn|6*wTS`34X6F7d8WI%(-2? zjn3%dSaPGxe1dXoaC-oC(ii{-6Yw%VbxQ7pCVNR_(cj)s25LK-UeZcQ7i)mLS(nhl zr5Z0O>T+VRh59hiTC+ii^3z~`VQncH`Dzi<8$SDyf|x}uTrHdMdcx<4!sXx-D6Vzm zi+vpWf7~;t^Z(F);wpGsr5^BW_yI_#)7_n&lJozWo{sj;wD0_XPghSmI{$wrp0@St z;P5@yqLz|QWiqJ@1cN^SE8EsKft0-}xZEtY*;9C@o96+`d(OW-o#{xTpDtw|Nt;l1 zlyfQUCIBnaa1}Aqx6r)BFs+TsPIB%)?;QMZa-}7fUP?iKg^jA2R^`Sf1wDE}iF-tp zg7g%{6=2FGmng2xV!7a9E?9WvV+rMe!kn@whZ61_QBCuC;bF5#f)6Cv=)|9(?`|pdDzFYkE3>l-nsQj{Tc{&1$P!wXX64j>iiTG>v47~gi$k&Ql;*&}BwR&v zui9ODJ^g zy1)fZzT;L1_^}j6Xh@0r8xfswauCUdSPb=WOWA;4LW>3iYiLrWEl>OS0(`h}_01VY zxR(hSL&=ScaBHDHYq^9btYlf*fH`6L2n>&ZQ(-Py9NRx66msd0pcIY@x$!tomLTS$ zf)Y-I)xD%vpz7$4H=N#_j-tR_u8%0k0$czW*;}>s{%d@9V>TQv;tU*fpw2lW8;_25XO7XoyHs6V+LnPgFXi4~> zPu)V9Aryzcm{4v!LC6(MA9ckz@mEQPjd^^xViKCQ+^7DO_+&nucu` z#r;4o@;F=*{=SejUV^RIM4V0u3hg3^XoQEYl9U4u$Ay** zcl&v@BDZ=J=M$_G;@d6v?{92D4WAVw9_xmRs%3%idf)SfHQ zf5HkS!;sES;#Xhvq?0`08v=<5lUd*=e^)gv!z9t?OGrjRNFZL9et5Di4FJ(j|gia6-(0d7EQypKr{$N-CAfR>dd zs0>*a60gAoq{J+H38sKM6DW-BaOn?CD1b#8%`jP!qwL$s$x*9nbc%0Xe0n+ZJnRnGmvl-A-`nzA&7({A}-xz zRn#(}M1Sm3WrISluSb#S{nFUxO>K~1^QD5?VgYa|-0|ei4-qUgTmW@xqm>CVhoGl8 z?EuW})XQMllpHS_xg)V4+X?y*9s_D3;9T=0MgXpcQDSLH zEWQv%9!)N%7&3}PK;wHq@!c!Z^wXo0D%_i;#L7llhLcfIb9n6~mZ^&pe{`@s)wX~u z2*Ip=01Y2_Jc3J3#Pv{fM1I^l&>_l*Vm47K)xPCh^&|&F3P0S7tf86 zj^nd&1VqiAf;p$2x)p6{53PZZN%aYQ_gOtfnRc;8QREu6(9)E&pscXb7v=$=BE!CI zT)4o>#xo?yQkdrw5-eSof8J42CqSXAn#DN2SWt(6Hl%2897oz>cV}X6x_H^{;o{`L zRRe(7RW_#D*zzF`_NkRt)@b`|vy#oV1t%B&dUN67m{xJO&Zo__}M ztgAtl9lSrFZky9UUqh2O;w5aCT5*#(NnrGG)b%U}$eS}TULcu}f5$pMdC~l;K2d7P z-M%Ol|LIRkMl_U&yaeKb$JlL+l;zlGUZ@T`qaY(;P%|R?46t>#&PZv($yy7&k2U5r z1e#ddIzFyM{4T>JR4WEHvprwfqOC z6#=#o9&R5&ybSxOAge!F8xv81R_eeZ@rmTX-n2tGa(0_mEgmE2#3=b{*A0ocVKSB4 zV`BdtTHe20=3gBYw!5sxtoLep*k+eBj)OkIIfMv;sz49&f0lx%;uRVP0PZ2#q{NGY z7gVFjoRIWDUJz5-vo0oBAK`tiH7<4WB?lyD+d*qXTS5Vssr&TY5flQ(yYwp_#K}t_ zqdYoO&SmLe-=ac!z@m}(#TQ#BWZ_4`IrJq|WTNVpG$h*c3CzhB7#t+nf~IIPVF&mN z%T}?O0%r{#lXc_|5!^UR$JSf7V4I2|@)h?Wo<)zAZpPih z=0zd}(M@>wPi5BBLEds;7AV?cH7o}a=64kVn86K%?2+eLqgky3EKj2RLThuqIMN6T64-9*bRk`+l4ZAQH+#6`WEMuz0kVC&A8rvAeGc< zzqo%2Y$teT5Y9FoKYhp>x%y@hbaO4ZI1lF1S-eT_)c`9h3_fL1l&wy{{#+It!{gKY zUbUHR;ED218D`$vT`tbhg9^T^s-=x;WmrT#rqL9lDTUAW0@KFE#1U^rn%acsvp6)w zyN`lRN3x!S?aJw*4yBEJzz^eFCp$)f-L!wl0o}qSL8>?R<!mAi*W z#`e8o&j@Osj#@g^MyxGq#gqfZ)vABsB)3d=VyO`fPiCY)iK&fE4Ouep*%mL>VFNE# z=mdS$0SrPXgM^L1N)HoWrbMvEX#$R@HKm9Hy#`wZ43FU9^*$o}D5rtm?Uj74+!Krp z~$Kn;AlU=-I6bLdO>G9sRy$C@fwgw~#qW5z>i%@W?syo$C**r8v?a+RKsL@9XxM%H?K zw%6m~$hxsTaRLV`9{GRazB1LG;KOZsdM>^3Z-5%*!D5v^vPlAjGd=1fALjE=#x-za zQ8d3Lo|2u-ydqrRlCN<}dCVY8>A{3Cr34ijJLB+LXcb7F+Grs;3DU=d7!8B1T8XZ8 zM4O?CazNZ3Xwg#G@fJuV^nQfI2-G3cO-gDR^$)tUN%uM96h43K!%DUj83ss+Cvb>+ zvVD{QJb=(mMcbPJhDB5tuqzOk9eUyk(Q^l}#Nwz)M7Mm$2QeJ(RgQNep8aI}7wpqg zR;^PI`Kuyo7p`74n@z$w6;BSq^6r!lQ$q$y+;*U$;IT9-jl@H$C|dEMfOvQv7-;M= z@_Io>oFHs=c*uYCZcTzXy4Fxx!Te#(jk9kYyufpp4i7oDE9Mxq#QD&H-1E##90k-7vSf1sKVTS^-qHUtl z)Z@lfEHueo00`hmC=}OK~0q$E=H-SmaUQUTxV9Hr?jD}b*tL7k9!CAG(0tx#*C%#q5inT4XW+o z2Gu4Sw`5_kkriWsiG|Poi*G_z2%k>T#-XV~A&-0KjN_p*MhcfC3I&T)`<-Oe%X*eO zX<&btvoSUx*MjdK4Ovi4*kq6ZWg-?@#wm=rZ0UlV-ULsrItj;wU_)_3!^l9tzOt-ZII_(@+44CKpT!Nw967ia{r2Pc1FB;kuSA@!}y zaMcN{+0@5;QY|6aXykwr-&_zdlTvvZP`AVQ6wc5skFKU{A3m)1){CtFkh0+Ws zh}Bq13bwzf9F938suk|-P%rE}X@|AP)C&6a?!tB)q+8cO?jU2qp?G&WG<*SXGPrgs zN){-d=+L<9V-TRZLIbdy;PCl;ymBj0RS4o7h#2BcqFaC6#kn<;`zo<)Q{|e9mOZ8CZ7`xsD(y1G)4P11 z!Zt#6F0Oeh>x08e-rUb&7g~MY8p3Cp2JDf#<`uXb?Jd6`WSfXCg3_{p zV8lwqmxCIO?1cm}6E>VX1s>orj`0{cYFBf3Ur$ML*vj&gntGZCRg-`PmXx+k$Rd<~ z%_`s>3kVDx96zJ1mtjA<`n0O0n++GDP&`98e)Q*cvHvvQjj8qU!{Vs)) z)B%9schL9^ft1uQyIU8xG!GJZVbAM2lb6*Fy=lc8H9#>^%*&*OZ7SWb@WhB4&}_U~ z&UDO(rBcG>R|; z{Xo4~R2a{S2+BV88Rs}D;VV!Chwur;n!KjQ#%y~auU6nd?-pTj9FxEB7+YCsM?j%f za4G@RF}yMYOIxFk12bVexIPCkXTx<@*lQQP_MEsXN>LuG5e*g;Nqo4SF@;c+Q;7ne zenG2-PyXBr7aR||Tp)f52+o>+2@!e}xDo(-U{~5o$&)hiG7M9uZu2W>PFNhThb5D6 z@iKp54@nxYXIC?{Og4ViQ|Og6ZLLznAmMRQH2DfnF}=I0uA>&W8+!2z?tPTryW{~9!Xdi6B2|^g$d6*+pi0$?P+JqQ)euERwbOT0yOgM2Gl`6neUr| zsZPLBQLti8lyj&W=@48g+h}xsttDz97|oL*@)Iw(leHBr#BeWj(A=)6h$JG+TIty# zH|;jVuqA2h>FeS)sjC;&YLkTGBiQL~q?BNM{b9fhcc%+%rSnOygo~ENc z-XxHkTR1EiTyY6$BmmFQT^7Im||HvJu3i?5x2E>;O=o8%uHbWeQfc zg9>Sdt&0WLv_jyq?IOV~Bvfw?sN8a3B!SSziAltMjZ^{7tFdg<%%Py0;-z~}I;b5$pc`mg2=FY=&qTA>XT+0i_85Qa ztZWS-P3MTmJ%uk$at_fu*jwH_#9KxjEbPD;O4;70nrHy1wLEN;_fieZgAfa(Hx1+& zg*;22QU%-P+>~uhOaO)fOBJj_B-jpbu}B+%X(Bas9g5OkcP}#x$y!7hBASzj1~e>0 zT{$B)9I8vH8$*m(Q761B3r?844#9uBJ`(N~r?qw)eRbkD8w1r1TZqw)Ij&bY$z)Lo z7(m!;+nX|;my0E?RGKQ~=)Se~(M5Y2P8YO%dl_y-ZKc{3jr6b=y)RC_79L!W0|Wmd zdPSv!h$mcn-lfGYhC7fokORkaZaqZw;d6pt6!()JIS_OTa<5RWJ*%=+HMM_hz!;yu zU0Lyj!=k^ePFisvnvtPDgNAJzr34->Msuc7BoXkrT?^V!!h`d|h>IpW?9@OUJbMV{ z#H;}9c@na1z}bu{8UhIXxWJME9uGp!aSO}}77G^9+{N6RX_Ax%E(I&9X=yvk^tcs? z#s=sWH4o}Df*fm2D4BFUiAjI`X!;;JpcavuZ<611EUcTC02>JX!fk4}x^Hqwe@cbM zod!&Dl&#~!n)&cp;T!Y?8jwFp&;^7qK@DdRm>S?2AqR-D;zTf6aH#oP!80d)>Fld2^U%y8#%xL7v4Wg4;)xuV2I%C(Ei6%9-CET0)xh!R5z zla4up@|>)`F)|b@i@1r9IhGPd$0ZJ)cp8N|ZVI5lI^-wG(@?iO9rw*g-mPq_{nPPi8|G)p8m?r$&i39*t^eb5@7I%)kabQ@j@gffQ+0T+(K3gJO$LNoO;OGVDGQr`ch00 ztXIkjQe*koNfM@wX|jN# zlyYiVlUD9hba49<)}l$E_pCJW!`k>p3ij`hvUu0H1sgvtTnT|j!kPJn#rke-3a+$s zh42gR{%>#T^-fpT$rflmZmosxf0!c`Jj0knO>u2cY34IFspo}CwSyW4Fh7&J`XGPj zjeL!6GrW|EN9#2|v^zahZ&>KW9+trs7&vfd7P=@Rg}#-n`)S%DH;GP#MHtKz+dxzD zj=ONnhF46~`U0=yygx9~$hGMea~xnOvGJmjJJOh$jw{Ip!xh}Zq=H?>9C!Vl{2^Qa z26Gb0{NS48bp&pU!M6^;*FJUJc^`kVa?bnJ73X!>m?}FTJ2mXMgnaCUMP%oTcXJ8f z`~A+6z2rOfi)5JJ3!JhpR~m>Dt95~dgmppG=%wv-LB)xcae*T{&sS|@305lh3!!=L zjrXK0>1D@R8|OaFa3jctfo{62fANNhO6n_%wu-1EqInS#i!d(3Y)@>VixVKIcm^)M zu)xKEzg~xlZJZPD{R(mszw#Ua-UY58{n#Xv`1>7f0Z)W5n`bY8%f-SaWpO(Ko}x&& zKU2{3fMpx@#z-;_ahnC6eB7QvfWZy!3YwgAgnb&D(##qj%X7YR3c5EK)ybpc|D1sGAuECVyZC`)hzhsWzLlQ1O>1D|#w%S|m*H*g2h z7IqtQXg1M}4s~2$fbUw#k&|ToAOVw;h5auAeh-tj{a6n3V0{~cl9Ptbko=y3Vv`*H zBqB2}NRk6wbHtHNLqwD$G4n)746Jb^siGCURx`BAICJY=lVbiQ0S=Rh{xyHgh6t|l zYY0LY>$$e+5k*ddgu8fOG|PU+n(bb{-w zBHoxeJFCc#6rM`*5pk{7i0pqI3~Aae!2yxRWVsmO!SNuXfho8L+d%9*sk+|jyO+;B zQ9vTecHL>YG8L0fx@p)jA8>0}K8phuEGHSi`dF_gk9CSFQj zC6d=W1aY^+Aq;Se0~w(Uy4n^Olce#S z#FN^{*4)?h8~y2)4>%2}2fAQaG(enyVCF<_IB8VD(x?wS+dO~c&%Qbvuc5O|2ZYraB7mOz>n3@=>tlxeDn9 zBrcb{w)Vs?p71J;bQMwDjNFbw$o;`=!chl@!E@@o;oJwzIK({-#hO*jQQWn^5~kuQ zbgHb?7*okgKC_G?bV$N2kcJ*artH#^Q_Fchk5A?k)~Tp7MMKRq7r46&k>NsvY~+^W zVWyggsONvikWOKO{IqtAAGbJdCp--Zk4pyUC}JJ^YO?t^=SdWU3>mvIA)L)Eig+Dk zId^P0j1mkRAV9e1Qoh%4<9Us)6RJD=0N1H1IJxRj;lvJmWy*$_)@Qam&*5Yqp+jH{r=bM~~z_`jstlSUrw!=-=6G5i}hj6}7ZyC4uDaOKAhDN3BV z4GF0+DMS@KKoTCJ$4pQNcHJesn95IC_tWQhQEZ(gKO|@rku)YZtJ0dd@hA@a6E2if zcCfXCH?B@iO_6(4(TnebKk$=bkx2aNi*`yNNt{pN{i`k?c#C(P9C|#i7mT_!V4AAqr_5@lk{&0>*3X%k#In;Ol$a=b|Ni}PBjsFSAz}~Dav(4z zA~5no`2aTD-@+9f#%JgFy*}3BiOyL68hio06lS zLq-{~WHslx$CrO-4->g13L8}N_1?J39+`jronsr?B090+q@v`(>EMhD+#QsnfwDaG z%JvqmxZAuEsRnUCQh1dWPEJit`Q-S_k2pEkF!<~WE)0}nJWgP>03#5Zdl!H5#h+Vj zOY1KiOgULi@m28!$RKmEEb{{~; zN6Qez$Tdhr=*xvJ71CMft#RyZ?)WI6=pF}^BS#5B`lU1#;GR{&YrvQy>keOXcx;lE zw!_*e(hjis#k$drTlav=yz!K~oyqM4HdM>g zu!G!i`^XLg*Fe2CTg_o>wQ=UsP8a%(Y&GJUE{dEt&H`YRuS8oyHR={bWv;F|8*L8R z2Ii?WL<25w8bw#SXL2g|%C>*AEG9gH>{lvo?wZ1 z1HxJHqK2f>-aR+Mz~k%?rPy|NV+%XHxvPMdp@un)i7=ccMJ)g*P3M1vYf!4;OyT2u zLu>xxin;TP7OCeNg61*JWD6v<=69h^^BR)u&KI|Q>RqtrT@i^_=7DSJf-+l@4>6zc zrL50KR3>1?A>%P`DJggDy1pAeYSSZCHqf-cfY7x0n?c>s0CxoFX%u}^EMfa_7&xU+ zCPQKzm@IIA8HAHH-0tN((!h*cj1#nLkJR!gKF-`gbBB|joLHd)Rxu+*6oZ6 z92HjcM!5)nz_8&91v`Mfnd^B4?iW@nMKz~QqW0EI?nW%)@;raoE?&(dW)ups;1Y^e z(Tc^~qy{%A#qgLZNMx(y*z-3y`)-8t;+0xIm-!h0Z%6svOu&=ZO}5s?xp@~{6X&hD zCx^$JLv+I&M-NX%H$s>V8r7cz!eXsbf^n4>vKL{Hd23zVxS`0{XcP|?v@S?-ykhSU z1^-D1r-0KjC5L~_{o`QGbVA{hgfK zk|e2}O&jXN9lE{i!d<+}M7LkX;*!_ZvGpX161&CLt*enJFX&}0Pi$bfFr>H<2j}*R zGZci6f`yE|xUM{`VZopthyr>A0-?xO&lMy=$>=Q@AL?d%cJiqXBcDe0+Yu-WF~C3p zTA@Y0z2|>GCMboN)&zNs+a?ZPOUpTt$CGzor5uw=Xt>LX(H(|@FVxj7>NzMLv`8ci z0Sv$vxbYIDVN*M77$MXeJ+~nM5Wle;wQy+#8lcu+5Iv{$xk5+HqK;~o1uk&&Mh?wh z+lJtFSv22h+pAed)y!#D+c0%0Wwq(0iME_-sz`s#lqc#cBb`q7bag5CZ#VgyZto<2 z;puE|S27))?VTO%J(*0Wl5X#XU1d7eK%sX>FoafG&JNM3=bMJ?9pYt3jxA1bujrUmY^IgAHfuRH7P!2Ht8Ob=s|8 zG}SyL+U5A|pmu7i;I}U>&u+pqVFps*yS3Ff(XosIdKHRkICG}Zfq zMYDjU*L{DJs&&BvsS1^UVX1$-ypdN3<|Lo1m6Q`_CrvgOWT86lb9?qaEx&F?ILLUJZJ_(Al8g+4(26hIb*MXFfMlp(lB*<}bh90Thx5iW&B#Q>8ZY;hRDBG zS{qRW69o7q!bSo%I?YU(|z&zfMQtw0ynN?+d+4z7fR zMEj!Rv>D+yc2|&{0SIZ~YG;7seK4wI2SU2}7lJM90be&aYYR8gzKav~f@-~Shc`7R zJI8oqnREhErsI6bR|*O4zjBoOge#Q`@(G`FoSQjn@b-bZ8j0lf1bgsl-pq2O{W3E9 z@-A;Ok=JYI_D6O$#JIkpqJ^pK+S_rsaaPBkVXn~&Z17s)a#uc#W?oowc`9Llv=J=( z)W4&-2vD5vgB;VDVI9jZ-F|Y$%M)f8s%7l|c6M+kbL-~+U0-2kQ0~F%4wTag?g{xy zP3Hq#_C7P|uJ@i|aW!sz(-pY8VF#K=&Z~=HIAQmf@)PEzftr3UQ#qFu*5Vnlt4Gr3 z_hR56m!6Vw%*mm_>gBGC@%0fo?_Tt3>)IX)I80f+KRejrhOTs-OPD~LKcf2dG~@Os zR?_KBJKnA2-}~(4Z-Y!lt6x;>nRi+COj%#1@gcrhFG=T=BF z@JhwEC5<3VGC1dw2-)Soep58pwcGqpbEMbs}$@y1;~Vfu{(kl2yqobR-cV*>dc=I?DpSKbRT1qc@SdUO5f4S$}t$I0yq7 z-K<~M9GKme(9nzdT!tuS3_;sZMrzP7I#*)^QMAh)a#kLiwr~XkFqA}1r)IZDb;G;7 zfji|no+q9ADWE}(Zg)$8jvW93+*C|pMurh!GzhV>yWA`q;BiZy3)$?&J#BYgy@Y!1 zl7sh8(IadWLF-${%+x=T8zYWHXZsLDwP;Fh!H#=UAkHI0DNLGX7=~46W`CF z4ZMjxn}DJT>&h%Vb=0~(TWUcKEQD4aJXv4w8MSD4HE~5w;!$^t`TGqXd>!1~9W2!Qv&)qc_Et1W8SF!JbzLM8-iPCo z0sfeQOu{`0;05jg5U*kFo|*Mp(3aGy^u?cwjNFXd<>9WxCEzl2zhq+d>eoel;3w2H zuEc2;`s$eoaMHdD+$Ipw18bp}+Zn7~LUiCm2SYoP4}6;vx{DZsq7yn?O*~+JnnBkS z;|~u|(fh7kndYs~)ox7YS5UJIAb^3nqWv_NCNPLW0BAcZX8_&*mZ5c7^c%?};x%$c zA5G(GG=n-ikIxSQWL^qU4XVq|m@OQNjvTrRIt5`+Wks`sTx=~5Ft%>EP0&we)G!Eg zjAa1q;3B(DXRs*m_jgYuE_7i}WuSkkAs3oFezpTxu7;?Vi5SzMnReg}!_Dzm3<}i2 z00i9SFo0zcpm;F)U?M0pcC~%S3PA5=YaTbkFLVvgf0d-tFW(K;bR*Z}T(g(`j|abM zJ{;+pNMEnSL(Xo8;QmglngW`dS)#k=G*C}CX8%M2(?EpYL!;?TDA8`G^|BK{_b%xO znyGF}1a`WJ9Q+DgwUaY+pUIxy_5iq_o+tG|Rdv1n^#gKxyN5CF@VXErYNGA_wB6#;wmX~Ky^~0Z0oLx5=i=a> zF!%4|#R4yW$4$6&SZ&>}F0X*c!d>V(x1T|gW3#RgGg3p(a9tpXu6Q$DqsxKn1&JKL zu>e5mHoSvvwZjc#6;6-7>@LX74t&r7&TfVaTmvwgL1Gf^4+Rs_<;#*CmNrY@wq@?O z!}TE#(Pk4(pxQIpNJ=zt&~^Lo5^e>|7 zbibgz>I#Mm>0H$95a2e`NA$3Bvd{tYJl2FG+j;+KjpRN6ZtJT+H)`FL_U3Q}`UU{* zyC)v3QGKMiGT?Jytg;)ax{8KrJ`4dhUFao|xYfq1kf*0&_iLmg_eb6}SalB<+FtpJ zH>2v922TIB%JedPDK(Z)MAPBz5)#|DAUn;$5{!2X*jw&)HQkqIsjjL;)7gBo^O1u; zZ|7OBEI=fAb_l}U)fm`m5dg1p|@hwBfLCr*AgDlKf}2pn(fxS^6Oj~>I?lQ~t2FZAsvU-b;) zj%etp=LM&8RCvuJLSBBS`EFY4rJ_Z_ZQOPOuo1nXrZ+wR`wPObieBu8af6_EWth2>jq3xg_=fL#Z$5x${ogjm<;k5hb67PMX`v0xs7JebLKfKoMr${ zXF7S;*YP9#zvNfT5nVRE76Ws*8K?*aHTO1|leN}y#;c6xdnL1XTdt-DVcQ68gmonjQ=Ih)whV`CPhM&); zi&b=n)~fC_c^u5^55{F1BvPxy=7EQ68oPLC4H8QV*Pn_r+E=&uaWX@tLg|}V=KL>B z&Sy1OAxl;9O_`DL(Az#mq@*95F51Q14gOR_@}hrzHy|^W8p7$y8p>=OZ^vO@U&c_jT zMwJyec;#Y{Ycx>`t2lIYhIR-Vb)ixq?wQR?kYk1xyBYJ<8bJNjbuzXuU1g!P$*0|io z)_V+;BO+N^n*K3)RwsP`cKu~Yz*6Qc5v|{n`e|#x4Ebs2?ujgx>(L3?O+?lPKVF4I zWa{a=)cL5ApmYDQKXlLrM?@;US*<9l3x0LYvJ1Z`%e<>uzDbx_MKu^4bvSR?tvaBm zQMrLLP&$a-<<|+w6-cHC;)aj`Ih#&NH)Gl{cVMKc=NwZy4ZwQMJJq~6b8K(x<~wo> zCWre@EuH#ZM(Jlcu`B(Mv z-KS@YNkcrHS6pp(n+#IGxdiWOJEExub5X&78ExA&n@{mG1uZWG?vjQ>y~fyhI-Q0$ zdh8gwY=^}Fr*bxz=i1XZMx88axOBatU-cUXb1Ayc`>z}WZgVv< z7y=uFvkcVtkS#@sH~Y5l&^UQ#iF07!ytoDKe$fHs`i?}AD`E=T(aF2Kpl;-k<@%lE z5h7lhlBT!a{-}-ZS#_(_)t0UCF)Q3T9;nx`O;HXxvQc#Y4Uw09%ve4mQiSWAZBB+7 zGiEUt>?uh3=DzXbZVqzG3ocDOOfkF832)qg76;tgrIwuj?OuMECpD=_@4DSoO})>* zyaaOTcp$ge(I&G&mjFg}J7h+ki--s0zYsD2<1(lgtFt)##?qjwUt{hyet~|jJ|cLk zR86bZK|yXpXR43Q4!cD&$ei`4;=+M}P*+TW9eM}ee;RZRo#XKvGGoHs957kMtg+B^ zBn9L;oQQ*Os@XuEp0{mt822IW1BPNCakm?#hlH@A7MnDoCrt5XXX7lcs6SQ7$Jx7Y zdAn?FE(e^h21Y1zJvDT;f5GRE{>UTW7}s4pQ@&k++HZ@ks3H!FJ#-FV33Cn1GgtfW z-hzPZVR_de#)mw;gF9g~A`^Of)+=(ALo2h4(%g>k4w@k)B8=m0wYh%=s{tTh4jVf0 z0Fu1M@5-40{a0ihxXP@#KZl(s@A6<4Q|W`U>#b*^Y$!#X%{v3fqKYc?MVe|r_4irw zU|wUNxPR0AX)aQ282iVYHR`-c3sonLSD)!A_Fc);x0N>pAhg3qsijJI9nIahpYNBwZD|rWb4>ouQ#PZ> z0Qt$`zL2k%+u7+C{0dVrXC4GPJs<}YN?|q;HLZ7XBG09Nv|@nXmSyxrs%dT6{&gZ! z@}i|i41A$efrRoe+z+(S1&P;rAm~of@$u&0Zx(h2qBByRKO4h3kbl%8^`c!};YkZ% zjmtcn=nQzK$wf2Lw0&nUA*HzL%h<>`eV+S+t2On&dq*;7UFWevk^VKT+g^cQ1XRrc z_x5ZLpi8%Z08R;|GH0Kk(k~*vNih)!t?m@7pD6}&!EddM#hTlcwSy9qHPs$rS4SrN?KVDiJz>4+faAjFM&`M{xt|vKQc{XD+LV>M)txI5BC#~6 z^f7hplql}OJ1b{rw~y~>WOZE|imyVBqi}1yA~@#Tt7UMCv9Pw63oQpfzAt}9?5PG+ zvby@!KL$K9hAk3#7gN}qH)0=M8Vo?xS-FbMwZ~quVGZ_WK5dQLn0)p&TwJTc8mu++^vUCHOk@9zLMP?)lOLZpgQW9M{8_9*6gG4sQPj~>3cvPn~%VfQB%ybsgwRQP{<*A20zfsNzUUvYhT z)2N~akepG=Z@j&6bW##SVPfD_^Xa==ly#wPhCK?HQsc?a&|u!HO6y>)Bd<{pb^?&zBG!C9GyBQk!DG$T`IN=d(-=bu*D1-~S?u{lu7RoZ;4bx+N)! z7j(b`O+rC;gXy}GGsvs2}DQ`&DPGcw#>&~<;`8|Lyi(sJOB zNZ8E})R7bH<@_gf;XwD86KKvF)#N2Ngo zw!9^Z)u64IB#(Bx3I0mfT4FAEoGwhD+a2=X<58v0v{Qf7M$Nn&5w(SVgxpQ)3M!Ut zR%06)gL#LTxfrQou1w@GbFfD-OE7Mo zKfv`$`lYBCtAq$q2glUe^s67O@b$i;d|8iY!wbyjDsnU7L0gprzw3pipXilu%1g1) zhkO*WO{_PL>GM9?(5)LA($%5TlO99}2>72*l@i$&S*>QZeJ~tPxmC~%|DH!kI?b|j zUVIYx;drUU6<=VEcAxld#I?M^=*m@4j~2j3xYRJ+iTaVHmA-(dKM2V>+twRR`&6-m z{aGv~wl6l9zdkchozy4N8P4DOY>}ymkSsb1KgOQJE%&RR+DJ)~=(3aMso|KN`}<)p z)`bL@ZA04E9_jkuo3@2!{mC8eHQ*ITr=CtzAg(v)|wwlHKk4qhChJz|0Gq$ zoIR{wSF0H;wqP<(_6{Pifr);>k_QlIlWX~dV$rcD4elJNMeLTCfdz_NP8yHMZCCwfVQe2cI|)Bi$c+7A|Y4>e~dcF zO|4#=%ZC2&s+0UU;s@va=A2Cs>cU~~Qpos&@+y*ZvRpD4{Kbe9^siu{MAcWRKkmh=}B)*P^HtKgOF?_L)6UP2;#x{JasfSJhwf7A2m zVbo%sGnMB}jIhJ5Ut)@vzFjHekMr-PlnQp2t6w1r~S^$BXp zTaJ*0W9#m$uWs^9Y`e;MSfzsOVUV;wJLWLW8e(`s2n{|B0_`sJIIh1=0JD)+>&_e} zD+v8O;4bpte;EZ#b;8m_z?1Yx5}yBwMM&XC^k3|gj})Z+NwB!K$p-a|8n*FIN!n8l zDDgoFu|1Wu>C+xfrR3uFsC~(P-$VN=2U{)#bw#jacHs3gLF~t9cjYBl`YT=$)^y}P zi!&}?FFyi^3yb?)&y;zz=Xajdwg}v*Nqrb8-N#h)ono3w1W8cC6`SD+ zRmf6IG2(i%j8GBGn%UP ziL-s;KiGG0n?sj~3pnQ>YC2kzXDx~fyos$#_y6&V6wyOkaTrD8T0ze24V{Uk*$!6hw! zp%6mzKKmM{z_hzun~GP?qKY)*Q=5{prx+ZcS;rJDD~!m>3~UpMX^?2g?2k%1A11%n z895ZD74()5u_+O4<16})T2EpL=6t+A4!?%e+dxco{?Hw{$gL1Rdc|Tv64AeEEgK9m z%NtYs$9)7)@K`%8(4EfUn8}qlln)br1@=ABL z`;4`)rr7b>Pz3%w-z^Gt(+P3>9fv=(I62bqfY4`jHq3wIzc%3c?RQiNAHh+f32_GH z*r8LkE_iG11t7gtxN489d4R`a4@yHOF168oh_-PIGSM^~q_KocP%82BD7zA>2~FpX^& zXbBUm+9(rv0oUi=4aqwT6)Mdls(_Re-8t#%7z~NA+O9A)<(>-NP2Qv}%0&KNdwNi0 z;AjF&eRMY3@^Ln%c)Al#`otf$x6;P=ahj~`eZPp3llXtp3>msMV`@hk2xBe5E&3VUEl1kKtxm+APA=KVtUw>--t_TPUNJ+>O-!%$u9OtdX?2h2vp?b zfk#RD6?INC9KRYkafsDKIanR}^5BLu7k)nzi8Tszwe@}`K1zbBUTr9TpZs@U-jFa` zztP8)(bUCaP7x|LvooPRk1ogQxJlqssAhxas>SXg1VFq zJW=&{r1!;>Fn*WQy}d7*RPX8mmEsP8l@w(Jd)=||d7AB^m|mN9g=1aV1~zljV*vFqe-X_`MEZ-Uh4-nt$zUxUQI-c%NtEd<&m$YjE9)x8pMEEmJ z74I$R2n`j94b5ur-NZxP7HQY4EIsjiJaBHTsY&$B^t_(^HZ{*ip9J(u zj?v(6Abo=@HO7hU=ZzX|^`<-%c*}mKw&{^QRE}?eC_rJMJEv|3|y$;2y)UBVcLP$$S_L&~#Ov@{zpYDrM;s zP1Lh6T4XQR{}6fncPJe)$5Zf`F|tjSi!v5lMdz)zJ^UrX;9)P7=X@RbZcg%1CA$UZ z4@E3_t&*B2K5hp)KZ=3uMp}aWg)EXG{9jl^xbw>E-&(D7+}>h-%2@|o?PDtt-jA#K%(CYbLLdqP(_hI z*}?3OlsP>X^XZYwXGkxkezA$e^DvgR$P}Vd2esD`R2=>%>Jia^PMLY{G_74;ci;RB zOgB3_yE81GlY?iCx&TG*FCv<_9R}yZkxeIG~~>hDZNjR=06?NSHdpy%~~&2 z;>e^OzK;0Rs@@TN1lpD8#(x`$tr-i3oGitgHKT-6?^3XX%y^@T% zsB~G$cFE#eU_}I)b4g5Uxu+#tF7vB8Cde!O4llsNcfi7B|NZ+z{I~Tea_{KsG9 zHUm^vqF|zWzQ!Ek<8|A?O4FWw@r8)WiQnyo6+fpB80@;WEjUY~Og}!E0AgrO(4qPP z<6D}x+<0j{NDNH%C(#Q7Z>vvi?_kn*(TWh|1QxhtFv3aCPQv3!W zSW-v1W4+WBqAZ3Y_#|ZQrmM*^&~~jZ^Inn5qC6X#*WjiwDzOd*)KMC5Pnu zhhz>IdEa!|K|VRj^^j1vvVa$L-*?7Obh0iJ#E)880)BVI@6ewei1yYv2K;Kd`}?@& z3*$Dn6Gboj$Nq~Gdp9&4nULrW_36k8R}CNV<^4qX)~2`R0epHA zjzJ^wiS-TO3yvDAHqV7uZA@Pqdgt^)-Wp=XCS0k(&S4wRofg{^AkP=5^L|JKl#1&Y z1!a0?7Z}z%FfG$xnK=|pMC4N=tq~BVEaDzE z^JR;M^b_AJf53BAF~B;=$9j!BY5Sab_B>1apR|2A!_BFW5GJW4Y`&uur7EChxe(%# zpCUp4_@))eTTv7l)s-J}H7V-9I5_ROz5F9p1uiLgWN4VjG0x1LRID_RV+Ws6oO9Fe z_knX^-EbJr%Oz`%OXPVDY7i`}rgW)+Jri$Qsupy~2!HFi8LH$ZPKWhAb-z^6Y;`5r zNxsIb#C4oMTRV8qsPn>tm$$!QokH%n_NplI96{PJfz?;8Zm!sG(n=$z+GVJK|w zOWgjol+M_p9@ogM*?V8A{u7}}efYN_omWMU6q|p+k$O`j5$0w1U6bWoLX|QWIfI9# zHcSqVs<9gT7Jm$u$ke9ShG1aHn>Kwg$fS3bf1jHmt@0rBnp9gsXF zh|%1Ch2*JQF_25j=uVRY_)Yw;`xLWA0YuD zyVTk`1N%@x9sC#J%}SE2$Y<`q2O=b35DpsrLx;@EL!Z)FRcstT(~lHe3BydeF(&svRr1 zf1(`o$8n`sj@QVcIcW|jIr?&Uih7w)fiAt226gZ^Zt z!ic=!vx96GDk4%wfUX)!qfw8SgzJMhVbln3?k^ z1rPp_(_JkO4lo9%Fr=jnnSAB9mrn1r?uD~gjlTVs6K|Vrm+iCf6`2|xw0~G37b-Nk z&V!=}&YJwpJlG>j7(Mll?5i#f^gkbBG7|oX z4^&|>!vFru{3d_?%%wz@`voO1O*i%XB{>C>kpyq)orR0`2wiZM7OxvthXor!lmkbt z=YdOM{%4(Uesby4$I93mE#oRU{`jLN1*(bc|4kJs^Ikh7?TNuAIC3!_RbfRoVY!%t zBbU=_6mYE60=CJ&1letfC0~MC_X}h#re5>?vr*dE9Bfh#T`$@<;=l_EI$Vjdp`I|Q zn&C1Uzv%I>VUn2fu$g{7aZ-wG{C`;9uGjouj@k8U{L3-B-Vly)xS*xiUXT$3VS#rR zvd=8VHuUjMp+5HR!&84$&C{iqEKQXL^`wbqbb7Dr(>cyv78DF| zdN!EKZcsF3Nx_PNUCmrb27?yga)jFO!Edcxjs@xX>;P-&;!$W;tTT`JP-e(CEp6FC ze@*FZbBUtVb_ZT^hLvKRaUDBbh1eV}#dB*Xd$0fIGIgTm&zQt~qGmg=1G9o9vT-_M z|FVD4XO`I2@;Mp!i%5G2P01%yE7-!%KC}!~qU9=)KYrc>?65$JwVcdn2Q)%sD~|R! zjuG{tDG3g53L$N2gYEYSk48tqKVq>NtuKjo?alW{%G!&zVqQ}F7s%>aqQ*arRlv04 z9ZJ+spRCzwAC?ygODFvo>qP&yT1#%}XSe)O9+Pu)!CzH{r4abP4z~%_GqhBtH`+bq4o^n{c3k6afbYFjvvJUE+Q&#*`JC9#QDWDV7vAO!`H**n_K^i`$vTAq_pEX zAxzw#%$x9p!t9me`P2>oA#HYZ!c^po@Z7hKvY{i4ST?WdP5zS#D~h}#PTBj5AWl@N zRw7NnZ-O>mGbHGwGA()ckBz&G_*l@?I!`XFr;7068FRVu6qYHH?_?Jrk8>|k_= zr>Fki+)a5(>)8|Ip6+kniLa+Ut!>mJM*KPKl?05lUO%vV=uowB#4M93XkN+v|Hkxx T2aV2MVje{pN7+AG!+G>SD4v1v diff --git a/docs/index.html b/docs/index.html index 00f4793..8e7387e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -112,8 +112,8 @@

    - - Docs + + APIDoc Build Status - Master @@ -127,84 +127,130 @@

    Kitura-Session

    -

    A pluggable framework for managing user sessions in a Swift server using Kitura

    -

    Summary

    - -

    A pluggable framework for managing user sessions in a Swift server using Kitura

    -

    Table of Contents

    - -
    +

    A pluggable framework for managing user sessions in a Swift server using Kitura.

    Swift version

    The latest version of Kitura-Session requires Swift 4.0 or later. You can download this version of the Swift binaries by following this link. Compatibility with other Swift versions is not guaranteed.

    -

    API

    +

    Usage

    +

    Add dependencies

    -

    In order to use the Session middleware, an instance of Session has to be created:

    +

    Add the Kitura-Session package to the dependencies within your application’s Package.swift file. Substitute "x.x.x" with the latest Kitura-Session release.

    +
    .package(url: "https://github.com/IBM-Swift/Kitura-Session.git", from: "x.x.x")
    +
    + +

    Add KituraSession to your target’s dependencies:

    +
    .target(name: "example", dependencies: ["KituraSession"]),
    +
    +

    Import package

    +
    import KituraSession
    +
    +

    Raw routing Session

    +

    Getting Started

    + +

    In order to use the Session middleware on a Raw route, an instance of Session has to be created:

    public init(secret: String, cookie: [CookieParameter]?=nil, store: Store?=nil)
     

    Where:

      -
    • secret is a String to be used for session encoding. It should be a large unguessable string, say minimum 14 characters long.
    • -
    • cookie is a list of options for session’s cookies. The options are (specified in CookieParameter enumeration): name - cookie’s name, defaults to kitura-session-id, path - cookie’s Path attribute defaults to /, secure - cookie’s Secure attribute, false by default, and maxAge - an NSTimeInterval with cookie’s expiration time in seconds, defaults to -1.0, i.e., no expiration.
    • -
    • store is an instance of a plugin for session backing store that implements Store protocol. If not set, InMemoryStore is used. +
    • secret is a String to be used for session encoding. It should be a large unguessable string, a minimum of 14 characters long.
    • +
    • cookie is a list of options for session’s cookies. The options are (as specified in the CookieParameter enumeration): + +
        +
      • name - cookie’s name, defaults to kitura-session-id.
      • +
      • path - cookie’s path attribute, this defines the path for which this cookie should be supplied. Defaults to / which means allow any path.
      • +
      • secure - cookie’s secure attribute, this indicates whwether the cookie should be provided only over secure (https) connections. Defaults to false.
      • +
      • maxAge - cookie’s maxAge attribute, that is, the maximum age (in seconds) from the time of issue that the cookie should be kept for. Defaults to -1.0, i.e. no expiration.
      • +
    • +
    • store is an instance of a plugin for a session backing store that implements the Store protocol. If not set, InMemoryStore is used.
    -

    The last two parameters are optional.

    +

    The cookie and store parameters are optional.

    -


    - The secret parameter is used to secure the session ID and ensure that the session ID cannot be guessed. Secret is used to derive a pair of encryption and signature keys via PBKDF2 and a fixed IV to make the session ID cookie be authenticated encrypted. Secret isn’t used directly to encrypt or compute the MAC of the cookie.

    -

    Example

    +

    The secret parameter is used to secure the session ID and ensure that the session ID cannot be guessed. Secret is used to derive a pair of encryption and signature keys via PBKDF2 and a fixed IV to make the session ID cookie be authenticated and encrypted. Secret isn’t used directly to encrypt or compute the MAC of the cookie.

    +

    Example

    -

    This is an example of Session middleware with KituraSessionRedis plugin:

    -
    import KituraSession
    +

    In this example, an instance of RedisStore is created that will be used to persist session data (see KituraSessionRedis for more information). An instance of Session is then created, specifying redisStore as the session store. Finally, the session instance is registered as a middleware on the desired path.

    +
    import Kitura
    +import KituraSession
     import KituraSessionRedis
     
     let redisStore = RedisStore(redisHost: host, redisPort: port)
     let session = Session(secret: "Some secret", store: redisStore)
     router.all(middleware: session)
     
    +

    Storing Any in a session

    + +

    Within your Kitura routes, you can store Any type inside the request.session for a given key. This can then be retrieved as an Any and cast to the required type:

    +
    router.post("/session") {request, response, next in
    +    request.session?["key"] = "value"
    +    next()
    +}
    +router.get("/session") {request, response, next in
    +    let value = request.session?["key"] as? String
    +    next()
    +}
    +
    -

    First an instance of RedisStore is created (see KituraSessionRedis for more information), then an instance of Session with the store as parameter is created, and finally it is connected to the desired path.

    -

    Codable Session Example

    +

    This Any type must be JSON serializable, otherwise the session will fail when it attempts to save the session.

    +

    Storing Codable in a Session

    -

    The example below defines a User struct and a Router with the sessions middleware.
    -The router has a POST route that decodes a User instance from the request body - and stores it in the request session using the user’s id as the key.
    -The router has a GET route that reads a user id from the query parameters - and decodes the instance of User that is in the session for that id.

    +

    Available from Swift 4.1 or later

    + +

    Within your Kitura routes, you can also store Codable objects inside the request.session for a given key. This can then be retrieved as the declared type:

    public struct User: Codable {
    -        let id: String
    -        let name: String
    +    let name: String
     }
    -let router = Router()
    -router.all(middleware: Session(secret: "secret"))
     router.post("/user") { request, response, next in
    -         let user = try request.read(as: User.self)
    -         request.session?[user.id] = user
    -         response.status(.created)
    -         response.send(user)
    -         next()
    +    let user = User(name: "Kitura")
    +    request.session?["User"] = user
    +    next()
     }
     router.get("/user") { request, response, next in
    -         guard let userID = request.queryParameters["userid"] else {
    -            return try response.status(.notFound).end()
    -         }
    -         guard let user: User = request.session?[userID] else {
    -            return try response.status(.internalServerError).end()
    -         }
    -         response.status(.OK)
    -         response.send(user)
    -         next()
    +    let user: User? = request.session?["Kitura"]
    +    next()
     }
    +
    +

    TypeSafeSession Example

    + +

    To use sessions on a Codable route, declare a type that conforms to the TypeSafeSession protocol:

    +
    // Defines the session instance data
    +final class MySession: TypeSafeSession {
    +    let sessionId: String                       // Requirement: every session must have an ID
    +    var books: [Book]                           // User-defined type, where Book conforms to Codable
    +
    +    init(sessionId: String) {                   // Requirement: must be able to create a new (empty)
    +        self.sessionId = sessionId              // session containing just an ID. Assign a default or
    +        books = []                              // empty value for any non-optional properties.
    +    }
    +}
    +
    +// Defines the configuration of the user's type: how the cookie is constructed, and how the session is persisted.
    +extension MySession {
    +    static let sessionCookie: SessionCookie = SessionCookie(name: "MySession", secret: "Top Secret")
    +    static var store: Store?
    +}
    +
    + +

    The MySession type can then be included in the application’s Codable route handlers. For example:

    +
    struct Book: Codable {
    +    let title: String
    +    let author: String
    +}
    +
    +router.get("/cart") { (session: MySession, respondWith: ([Book]?, RequestError?) -> Void) in
    +    respondWith(session.books, nil)
    +}
    +
    +router.post("/cart") { (session: MySession, book: Book, respondWith: (Book?, RequestError) -> Void) in
    +    var session = session       // Required when mutating a Struct
    +    session.books.append(book)
    +    session.save()
    +    respondWith(book, nil)
    +}
    +
     

    Plugins

    @@ -212,6 +258,12 @@

    Plugins

  • Redis store
  • SQL store using Kuery (community authored)
  • +

    API Documentation

    + +

    For more information visit our API reference.

    +

    Community

    + +

    We love to talk server-side Swift, and Kitura. Join our Slack to meet the team!

    License

    This library is licensed under Apache 2.0. Full license text is available in LICENSE.

    @@ -223,7 +275,7 @@

    License

    diff --git a/docs/search.json b/docs/search.json index 70b5c33..78f3a6e 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Structs/SessionCookie.html#/s:13KituraSession0B6CookieV4nameSSvp":{"name":"name","abstract":"

    The name of the cookie - for example, kitura-session-id

    ","parent_name":"SessionCookie"},"Structs/SessionCookie.html#/s:13KituraSession0B6CookieVACSS4name_SS6secretSb6secureSSSg4pathAG6domainSdSg6maxAgetcfc":{"name":"init(name:secret:secure:path:domain:maxAge:)","abstract":"

    Create a new CookieSetup instance which controls how session cookies are created.","parent_name":"SessionCookie"},"Structs/SessionCookie.html":{"name":"SessionCookie","abstract":"

    Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession."},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5storeAA5Store_pSgvpZ":{"name":"store","abstract":"

    Specifies the Store for session state, or leave nil to use a simple in-memory store.","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P13sessionCookieAA0bF0VvpZ":{"name":"sessionCookie","abstract":"

    A SessionCookie that defines the session cookie’s name and attributes.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P9sessionIdSSvp":{"name":"sessionId","abstract":"

    The unique id for this session.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PxSS9sessionId_tcfc":{"name":"init(sessionId:)","abstract":"

    Create a new instance (an empty session), where the only known value is the","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P4saveyys5Error_pSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the current session instance to the store. This also refreshes the expiry.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P7destroyyys5Error_pSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Destroy the session, removing it and all its associated data from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5touchyys5Error_pSgc8callback_tF":{"name":"touch(callback:)","abstract":"

    Refreshes the expiry of a session in the store. Note that this is done automatically","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PAAE6handley0A013RouterRequestC7request_AE0F8ResponseC8responseyxSg_0A9Contracts0G5ErrorVSgtc10completiontFZ":{"name":"handle(request:response:completion:)","abstract":"

    Static handle function that will try and create an instance if Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/Store.html#/s:13KituraSession5StoreP4loadySS9sessionId_y10Foundation4DataVSg_So7NSErrorCSgtc8callbacktF":{"name":"load(sessionId:callback:)","abstract":"

    Load the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP4saveySS9sessionId_10Foundation4DataV4dataySo7NSErrorCSgc8callbacktF":{"name":"save(sessionId:data:callback:)","abstract":"

    Save the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP5touchySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"touch(sessionId:callback:)","abstract":"

    Touch the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP6deleteySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"delete(sessionId:callback:)","abstract":"

    Delete the session data.

    ","parent_name":"Store"},"Protocols/Store.html":{"name":"Store","abstract":"

    The protocol that defines the API for plugins that store Session data.

    "},"Protocols/TypeSafeSession.html":{"name":"TypeSafeSession","abstract":"

    A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the users class with the session data. If no store is defined, the session will default to an in-memory store.

    "},"Extensions/RouterRequest.html#/s:6Kitura13RouterRequestC0A7SessionE7sessionAD0D5StateCSgvp":{"name":"session","abstract":"

    The session’s state that is stored in a SessionState object.

    ","parent_name":"RouterRequest"},"Extensions/RouterRequest.html":{"name":"RouterRequest","abstract":"

    Extension of the RouterRequest class that provides access to the session’s state"},"Enums/StoreError.html#/s:13KituraSession10StoreErrorO03nilC0ACSS7message_tcACmF":{"name":"nilStore","abstract":"

    Indicates that the Store could not be accessed, as its value was nil.

    ","parent_name":"StoreError"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4nameACSScACmF":{"name":"name","abstract":"

    The cookie’s name.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4pathACSScACmF":{"name":"path","abstract":"

    The cookie’s Path attribute.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6secureACSbcACmF":{"name":"secure","abstract":"

    The cookie’s Secure attribute.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6maxAgeACSdcACmF":{"name":"maxAge","abstract":"

    The cookie’s Max-Age attribute.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html":{"name":"CookieParameter","abstract":"

    The parameters for configurating the cookies used to send the session IDs to the clients.

    "},"Enums/StoreError.html":{"name":"StoreError","abstract":"

    An error indicating the failure of an operation involving the use of a session Store.

    "},"Classes/SessionState.html#/s:13KituraSession0B5StateC2idSSvp":{"name":"id","abstract":"

    The session ID.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6reloadyySo7NSErrorCSgc8callback_tF":{"name":"reload(callback:)","abstract":"

    Reload the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC4saveyySo7NSErrorCSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the session data to the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC7destroyyySo7NSErrorCSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Delete the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6removeySS3key_tF":{"name":"remove(key:)","abstract":"

    Remove an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCypSgSScip":{"name":"subscript(_:)","abstract":"

    Retrieve or store an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCxSgSScs9DecodableRzs9EncodableRzluip":{"name":"subscript(_:)","abstract":"

    Undocumented

    ","parent_name":"SessionState"},"Classes/Session.html#/s:13KituraSession0B0CACSS6secret_SayAA15CookieParameterOGSg6cookieAA5Store_pSg5storetcfc":{"name":"init(secret:cookie:store:)","abstract":"

    Initialize a new Session management middleware.

    ","parent_name":"Session"},"Classes/Session.html#/s:13KituraSession0B0C6handley0A013RouterRequestC7request_AE0D8ResponseC8responseyyc4nexttF":{"name":"handle(request:response:next:)","abstract":"

    Handle an incoming request.

    ","parent_name":"Session"},"Classes/Session.html":{"name":"Session","abstract":"

    A pluggable middleware for managing user sessions.

    "},"Classes/SessionState.html":{"name":"SessionState","abstract":"

    A set of helper functions to manipulate session data.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "}} \ No newline at end of file +{"Structs/SessionCookie.html#/s:13KituraSession0B6CookieV4nameSSvp":{"name":"name","abstract":"

    The name of the cookie - for example, kitura-session-id

    ","parent_name":"SessionCookie"},"Structs/SessionCookie.html#/s:13KituraSession0B6CookieVACSS4name_SS6secretSb6secureSSSg4pathAG6domainSdSg6maxAgetcfc":{"name":"init(name:secret:secure:path:domain:maxAge:)","abstract":"

    Create a new CookieSetup instance which controls how session cookies are created.","parent_name":"SessionCookie"},"Structs/SessionCookie.html":{"name":"SessionCookie","abstract":"

    Defines the properties of an HTTP Cookie which will be used for a TypeSafeSession."},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5storeAA5Store_pSgvpZ":{"name":"store","abstract":"

    Specifies the Store for session state, or leave nil to use a simple in-memory store.","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P13sessionCookieAA0bF0VvpZ":{"name":"sessionCookie","abstract":"

    A SessionCookie that defines the session cookie’s name and attributes.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P9sessionIdSSvp":{"name":"sessionId","abstract":"

    The unique id for this session.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PxSS9sessionId_tcfc":{"name":"init(sessionId:)","abstract":"

    Create a new instance (an empty session), where the only known value is the","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P4saveyys5Error_pSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the current session instance to the store. This also refreshes the expiry.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P7destroyyys5Error_pSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Destroy the session, removing it and all its associated data from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0P5touchyys5Error_pSgc8callback_tF":{"name":"touch(callback:)","abstract":"

    Refreshes the expiry of a session in the store. Note that this is done automatically","parent_name":"TypeSafeSession"},"Protocols/TypeSafeSession.html#/s:13KituraSession08TypeSafeB0PAAE6handley0A013RouterRequestC7request_AE0F8ResponseC8responseyxSg_0A9Contracts0G5ErrorVSgtc10completiontFZ":{"name":"handle(request:response:completion:)","abstract":"

    Static handle function that will try and create an instance of Self. It will check the request for the session cookie. If the cookie is not present it will create a cookie and initialize a new session for the user. If a session cookie is found, this function will decode and return an instance of itself from the store.

    ","parent_name":"TypeSafeSession"},"Protocols/Store.html#/s:13KituraSession5StoreP4loadySS9sessionId_y10Foundation4DataVSg_So7NSErrorCSgtc8callbacktF":{"name":"load(sessionId:callback:)","abstract":"

    Load the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP4saveySS9sessionId_10Foundation4DataV4dataySo7NSErrorCSgc8callbacktF":{"name":"save(sessionId:data:callback:)","abstract":"

    Save the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP5touchySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"touch(sessionId:callback:)","abstract":"

    Touch the session data.

    ","parent_name":"Store"},"Protocols/Store.html#/s:13KituraSession5StoreP6deleteySS9sessionId_ySo7NSErrorCSgc8callbacktF":{"name":"delete(sessionId:callback:)","abstract":"

    Delete the session data.

    ","parent_name":"Store"},"Protocols/Store.html":{"name":"Store","abstract":"

    The protocol that defines the API for plugins that store Session data.

    "},"Protocols/TypeSafeSession.html":{"name":"TypeSafeSession","abstract":"

    A TypeSafeMiddleware for managing user sessions. The user defines a final class with the fields they wish to use within the session. This class can then save or destroy itself from a static Store, which is keyed by a sessionId. The sessionId can be extracted from the session cookie to initialise an instance of the user’s class with the session data. If no store is defined, the session will default to an in-memory store.

    "},"Extensions/RouterRequest.html#/s:6Kitura13RouterRequestC0A7SessionE7sessionAD0D5StateCSgvp":{"name":"session","abstract":"

    The session’s state that is stored in a SessionState object.

    ","parent_name":"RouterRequest"},"Extensions/RouterRequest.html":{"name":"RouterRequest","abstract":"

    Extension of the RouterRequest class that provides access to the session’s state"},"Enums/StoreError.html#/s:13KituraSession10StoreErrorO03nilC0ACSS7message_tcACmF":{"name":"nilStore","abstract":"

    Indicates that the Store could not be accessed, as its value was nil.

    ","parent_name":"StoreError"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4nameACSScACmF":{"name":"name","abstract":"

    The cookie’s name. Defaults to kitura-session-id.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO4pathACSScACmF":{"name":"path","abstract":"

    The cookie’s path attribute. This specifies the path for which the cookie is valid. The client should only provide this cookie for requests on this path.

    ","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6secureACSbcACmF":{"name":"secure","abstract":"

    The cookie’s secure attribute, indicating whether the cookie should be provided only","parent_name":"CookieParameter"},"Enums/CookieParameter.html#/s:13KituraSession15CookieParameterO6maxAgeACSdcACmF":{"name":"maxAge","abstract":"

    The cookie’s maxAge attribute, that is, the maximum age (in seconds) from the time of issue that","parent_name":"CookieParameter"},"Enums/CookieParameter.html":{"name":"CookieParameter","abstract":"

    The parameters for configuring the cookies used to send the session IDs to the clients.

    "},"Enums/StoreError.html":{"name":"StoreError","abstract":"

    An error indicating the failure of an operation involving the use of a session Store.

    "},"Classes/SessionState.html#/s:13KituraSession0B5StateC2idSSvp":{"name":"id","abstract":"

    The session ID.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6reloadyySo7NSErrorCSgc8callback_tF":{"name":"reload(callback:)","abstract":"

    Reload the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC4saveyySo7NSErrorCSgc8callback_tF":{"name":"save(callback:)","abstract":"

    Save the session data to the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC7destroyyySo7NSErrorCSgc8callback_tF":{"name":"destroy(callback:)","abstract":"

    Delete the session data from the session Store.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateC6removeySS3key_tF":{"name":"remove(key:)","abstract":"

    Remove an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCypSgSScip":{"name":"subscript(_:)","abstract":"

    Retrieve or store an entry from the session data.

    ","parent_name":"SessionState"},"Classes/SessionState.html#/s:13KituraSession0B5StateCxSgSScs9DecodableRzs9EncodableRzluip":{"name":"subscript(_:)","abstract":"

    Undocumented

    ","parent_name":"SessionState"},"Classes/Session.html#/s:13KituraSession0B0CACSS6secret_SayAA15CookieParameterOGSg6cookieAA5Store_pSg5storetcfc":{"name":"init(secret:cookie:store:)","abstract":"

    Initialize a new Session management middleware.

    ","parent_name":"Session"},"Classes/Session.html#/s:13KituraSession0B0C6handley0A013RouterRequestC7request_AE0D8ResponseC8responseyyc4nexttF":{"name":"handle(request:response:next:)","abstract":"

    Handle an incoming request.

    ","parent_name":"Session"},"Classes/Session.html":{"name":"Session","abstract":"

    A pluggable middleware for managing user sessions.

    "},"Classes/SessionState.html":{"name":"SessionState","abstract":"

    A set of helper functions to manipulate session data.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Extensions.html":{"name":"Extensions","abstract":"

    The following extensions are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "}} \ No newline at end of file