2024-10-12 10:35:14 +00:00
# Protevus Static Files Handler
2021-07-04 03:22:19 +00:00
2024-10-13 01:45:27 +00:00
[![version ](https://img.shields.io/badge/pub-v4.1.0-brightgreen )](https://pub.dev/packages/protevus_static)
2021-05-15 13:28:26 +00:00
[![Null Safety ](https://img.shields.io/badge/null-safety-brightgreen )](https://dart.dev/null-safety)
2024-07-07 15:02:49 +00:00
[![Discord ](https://img.shields.io/discord/1060322353214660698 )](https://discord.gg/3X6bxTUdCM)
2024-10-12 10:41:18 +00:00
[![License ](https://img.shields.io/github/license/dart-backend/belatuk-common-utilities )](https://github.com/dart-backend/protevus/tree/protevus/packages/static/LICENSE)
2021-05-15 13:28:26 +00:00
2024-10-12 10:41:18 +00:00
This library provides a virtual directory to serve static files such as html, css and js for [Protevus framework ](https://pub.dev/packages/protevus ). It can also handle `Range` requests, making it suitable for media streaming, i.e. music, video, etc.*
2016-04-21 21:27:22 +00:00
2021-07-04 03:22:19 +00:00
## Installation
2016-04-21 21:27:22 +00:00
In `pubspec.yaml` :
2016-07-01 20:33:42 +00:00
```yaml
dependencies:
2024-10-13 01:45:27 +00:00
protevus_static: ^8.0.0
2016-07-01 20:33:42 +00:00
```
2016-04-21 21:27:22 +00:00
2021-07-04 03:22:19 +00:00
## Usage
2024-10-13 01:45:27 +00:00
To serve files from a directory, you need to create a `VirtualDirectory` . Keep in mind that `protevus_static` uses `package:file` instead of `dart:io` .
2016-04-21 21:27:22 +00:00
```dart
2024-10-13 01:45:27 +00:00
import 'package:protevus_framework/protevus_framework.dart';
import 'package:protevus_framework/http.dart';
import 'package:protevus_static/protevus_static.dart';
2017-09-24 05:02:10 +00:00
import 'package:file/local.dart';
2016-04-21 21:27:22 +00:00
2021-05-15 13:28:26 +00:00
void main() async {
2024-10-12 10:39:20 +00:00
var app = Protevus();
2017-09-24 05:02:10 +00:00
var fs = const LocalFileSystem();
2017-02-27 00:19:34 +00:00
// Normal static server
2019-05-02 23:29:09 +00:00
var vDir = VirtualDirectory(app, fs, source: Directory('./public'));
2017-02-27 00:19:34 +00:00
// Send Cache-Control, ETag, etc. as well
2019-05-02 23:29:09 +00:00
var vDir = CachingVirtualDirectory(app, fs, source: Directory('./public'));
2017-09-23 21:57:54 +00:00
// Mount the VirtualDirectory's request handler
2018-11-13 21:25:17 +00:00
app.fallback(vDir.handleRequest);
2017-02-27 00:19:34 +00:00
2017-09-23 21:57:54 +00:00
// Start your server!!!
2024-10-13 02:17:24 +00:00
await ProtevusHttp(app).startServer();
2016-04-21 21:27:22 +00:00
}
```
2021-07-04 03:22:19 +00:00
## Push State
`VirtualDirectory` also exposes a `pushState` method that returns a request handler that serves the file at a given path as a fallback, unless the user is requesting that file. This can be very useful for SPA's.
2017-09-23 21:57:54 +00:00
2017-04-01 01:08:01 +00:00
```dart
2017-09-23 21:57:54 +00:00
// Create VirtualDirectory as well
2019-05-02 23:29:09 +00:00
var vDir = CachingVirtualDirectory(...);
2017-04-01 01:08:01 +00:00
2017-09-23 21:57:54 +00:00
// Mount it
2018-11-13 21:25:17 +00:00
app.fallback(vDir.handleRequest);
2017-09-23 21:57:54 +00:00
// Fallback to index.html on 404
2018-11-13 21:25:17 +00:00
app.fallback(vDir.pushState('index.html'));
2017-04-01 01:08:01 +00:00
```
2021-07-04 03:22:19 +00:00
## Options
2016-11-23 17:22:23 +00:00
The `VirtualDirectory` API accepts a few named parameters:
2021-07-04 03:22:19 +00:00
2024-10-12 10:35:14 +00:00
- **source**: A `Directory` containing the files to be served. If left null, then Protevus will serve either from `web` (in development) or
2016-06-24 22:23:32 +00:00
`build/web` (in production), depending on your `ANGEL_ENV` .
2016-11-23 17:24:04 +00:00
- **indexFileNames**: A `List<String>` of filenames that should be served as index pages. Default is `['index.html']` .
2016-11-23 17:22:23 +00:00
- **publicPath**: To serve index files, you need to specify the virtual path under which
2024-10-13 01:45:27 +00:00
protevus_static is serving your files. If you are not serving static files at the site root,
2016-05-02 23:11:25 +00:00
please include this.
2021-07-08 02:42:40 +00:00
- **callback**: Runs before sending a file to a client. Use this to set headers, etc. If it returns anything other than `null` or `true` , then the callback's result will be sent to the user, instead of the file contents.