Skip to content

LiveUI/S3

Repository files navigation

S3Kit (Swift/Vapor 4)

Lightweight S3 client and signer for Swift (works great with Vapor 4).

Requirements

  • Swift 5.9+
  • macOS 12+

What’s Included

  • Signing headers (AWS SigV2 + SigV4)
  • Bucket listing, creation, deletion, and region discovery
  • Object list, upload (file/string), get, head (info), copy, move, delete
  • Error parsing to a simple internal ErrorMessage model

SwiftPM

dependencies: [
    .package(url: "https://github.com/LiveUI/S3.git", from: "4.0.0")
],
targets: [
    .target(name: "App", dependencies: [
        .product(name: "Vapor", package: "vapor"),
        .product(name: "S3Kit", package: "S3")
    ])
]

Quick Start

import S3Kit

let config = S3Signer.Config(
    accessKey: "AKIA...",
    secretKey: "...",
    region: .euCentral1
)
let s3 = try S3(defaultBucket: "my-bucket", config: config)

// Upload string
_ = s3.put(string: "hello", destination: "hello.txt", on: req.eventLoop)

// Fetch file
_ = s3.get(file: "hello.txt", on: req.eventLoop)

// Delete
_ = s3.delete(file: "hello.txt", on: req.eventLoop)

To use a custom MinIO endpoint:

let config = S3Signer.Config(
    accessKey: "...",
    secretKey: "...",
    region: Region(name: .usEast1, hostName: "127.0.0.1:9000", useTLS: false)
)

Public Surface (selected)

  • S3Kit – Extensions

    • S3+ObjectInfo.swift
      • get(acl file:headers:on:)
      • get(fileInfo:headers:on:)
      • get(fileInfo:on:)
    • S3+Get.swift
      • url(fileInfo:)
      • get(file:headers:on:)
      • get(file:on:)
    • S3+Put.swift
      • put(file:headers:on:)
      • put(file:on:)
      • put(file url:destination:access:on:)
      • put(file path:destination:access:on:)
      • put(file url:destination:bucket:access:on:)
      • put(file path:destination:bucket:access:on:)
    • Region+Tools.swift
      • urlString(bucket:)
      • url(bucket:)
    • S3+Strings.swift
      • put(string:mime:destination:bucket:access:on:)
      • put(string:mime:destination:access:on:)
      • put(string:destination:access:on:)
      • put(string:mime:destination:on:)
      • put(string:destination:on:)
    • S3+Move.swift
      • move(file:to:headers:on:)
    • Error+S3.swift
      • s3Error(), s3ErrorMessage(), s3ErrorCode()
    • S3+Service.swift
      • buckets(on:)
    • S3+Delete.swift
      • delete(file:headers:on:), delete(file:on:)
    • S3+Bucket.swift
      • location(bucket:on:), delete(bucket:region:on:), create(bucket:region:on:)
    • S3+List.swift
      • list(bucket:region:headers:on:), list(bucket:region:on:)
    • S3+Copy.swift
      • copy(file:to:headers:on:)
  • S3Kit – Protocols

    • S3Client protocol and extension (same method set as above)
  • S3Kit – URL Builders

    • URLBuilder.swift, S3URLBuilder.swift
  • S3Kit – Models

    • Bucket.New, BucketsInfo, File.Upload/Location/Response/Info, Object, Owner

Notes on Errors

  • Custom external error frameworks were removed. Errors now use internal enums and simple ErrorMessage decoding for S3 responses. Helper methods on Error (s3Error*) are preserved for convenience.

Demo

A small Vapor 4 demo exists under Sources/S3DemoRun.

Run locally:

export S3_ACCESS_KEY=yourKey
export S3_SECRET=yourSecret
swift run S3DemoRun

Build & Test

swift build
swift test

License

See the LICENSE file for more info.

About

S3 Client written in Swift

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages