Documentation ¶
Index ¶
- Variables
- func NoopFilter(index string, data json.RawMessage) (json.RawMessage, error)
- func NoopHook(index string) error
- func StorageBatchSetTest(app *Server, t *testing.T, n int)
- func StorageGetNRangeTest(app *Server, t *testing.T, n int)
- func StorageGetNTest(app *Server, t *testing.T, n int)
- func StorageKeysRangeTest(app *Server, t *testing.T, n int)
- func StorageListTest(app *Server, t *testing.T)
- func StorageObjectTest(app *Server, t *testing.T)
- func StorageSetGetDelTest(db Database, b *testing.B)
- func StreamBroadcastFilterTest(t *testing.T, app *Server)
- func StreamBroadcastForcePatchTest(t *testing.T, app *Server)
- func StreamBroadcastNoPatchTest(t *testing.T, app *Server)
- func StreamBroadcastTest(t *testing.T, app *Server)
- func StreamConcurrentTest(t *testing.T, app *Server, n int)
- func StreamGlobBroadcastTest(t *testing.T, app *Server, n int)
- func StreamItemGlobBroadcastTest(t *testing.T, app *Server)
- func Time() string
- func WatchStorageNoop(dataStore Database)
- type Apply
- type ApplyDelete
- type Database
- type MemoryStorage
- func (db *MemoryStorage) Active() bool
- func (db *MemoryStorage) Clear()
- func (db *MemoryStorage) Close()
- func (db *MemoryStorage) Del(path string) error
- func (db *MemoryStorage) Get(path string) ([]byte, error)
- func (db *MemoryStorage) GetAndLock(path string) ([]byte, error)
- func (db *MemoryStorage) GetDescending(path string) ([]byte, error)
- func (db *MemoryStorage) GetN(path string, limit int) ([]meta.Object, error)
- func (db *MemoryStorage) GetNAscending(path string, limit int) ([]meta.Object, error)
- func (db *MemoryStorage) GetNRange(path string, limit int, from, to int64) ([]meta.Object, error)
- func (db *MemoryStorage) Keys() ([]byte, error)
- func (db *MemoryStorage) KeysRange(path string, from, to int64) ([]string, error)
- func (db *MemoryStorage) Patch(path string, data json.RawMessage) (string, error)
- func (db *MemoryStorage) Peek(key string, now int64) (int64, int64)
- func (db *MemoryStorage) Set(path string, data json.RawMessage) (string, error)
- func (db *MemoryStorage) SetAndUnlock(path string, data json.RawMessage) (string, error)
- func (db *MemoryStorage) SetWithMeta(path string, data json.RawMessage, created int64, updated int64) (string, error)
- func (db *MemoryStorage) Start(storageOpt StorageOpt) error
- func (db *MemoryStorage) Unlock(path string) error
- func (db *MemoryStorage) Watch() StorageChan
- type Notify
- type Server
- func (app *Server) Active() bool
- func (app *Server) AfterWrite(path string, apply Notify)
- func (app *Server) Close(sig os.Signal)
- func (app *Server) DeleteFilter(path string, apply ApplyDelete)
- func (app *Server) OpenFilter(name string)
- func (app *Server) ReadFilter(path string, apply Apply)
- func (app *Server) Start(address string)
- func (app *Server) WaitClose()
- func (app *Server) WriteFilter(path string, apply Apply)
- type Stats
- type Storage
- type StorageChan
- type StorageEvent
- type StorageOpt
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrInvalidPath = errors.New("ooo: invalid path") ErrNotFound = errors.New("ooo: not found") ErrNoop = errors.New("ooo: noop") )
var (
ErrNotAuthorized = errors.New("ooo: pathKeyError key is not valid")
)
var TEST_DATA = json.RawMessage(`{
"statuses": [
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Mon Sep 24 03:35:21 +0000 2012",
"id_str": "250075927172759552",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "freebandnames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Aggressive Ponytail #freebandnames",
"metadata": {
"iso_language_code": "en",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 250075927172759552,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "DDEEF6",
"profile_sidebar_border_color": "C0DEED",
"profile_background_tile": false,
"name": "Sean Cummings",
"profile_image_url": "http://a0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg",
"created_at": "Mon Apr 26 06:01:55 +0000 2010",
"location": "LA, CA",
"follow_request_sent": null,
"profile_link_color": "0084B4",
"is_translator": false,
"id_str": "137238150",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "",
"indices": [
0,
0
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": true,
"contributors_enabled": false,
"favourites_count": 0,
"url": null,
"profile_image_url_https": "https://si0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg",
"utc_offset": -28800,
"id": 137238150,
"profile_use_background_image": true,
"listed_count": 2,
"profile_text_color": "333333",
"lang": "en",
"followers_count": 70,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme1/bg.png",
"profile_background_color": "C0DEED",
"verified": false,
"geo_enabled": true,
"time_zone": "Pacific Time (US & Canada)",
"description": "Born 330 Live 310",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/images/themes/theme1/bg.png",
"statuses_count": 579,
"friends_count": 110,
"following": null,
"show_all_inline_media": false,
"screen_name": "sean_cummings"
},
"in_reply_to_screen_name": null,
"source": "<a href=\"//itunes.apple.com/us/app/twitter/id409789998?mt=12%5C%22\" rel=\"\\\"nofollow\\\"\">Twitter for Mac</a>",
"in_reply_to_status_id": null
},
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 23:40:54 +0000 2012",
"id_str": "249292149810667520",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "FreeBandNames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Thee Namaste Nerdz. #FreeBandNames",
"metadata": {
"iso_language_code": "pl",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249292149810667520,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "DDFFCC",
"profile_sidebar_border_color": "BDDCAD",
"profile_background_tile": true,
"name": "Chaz Martenstein",
"profile_image_url": "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"created_at": "Tue Apr 07 19:05:07 +0000 2009",
"location": "Durham, NC",
"follow_request_sent": null,
"profile_link_color": "0084B4",
"is_translator": false,
"id_str": "29516238",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "http://bullcityrecords.com/wnng/",
"indices": [
0,
32
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 8,
"url": "http://bullcityrecords.com/wnng/",
"profile_image_url_https": "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"utc_offset": -18000,
"id": 29516238,
"profile_use_background_image": true,
"listed_count": 118,
"profile_text_color": "333333",
"lang": "en",
"followers_count": 2052,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"profile_background_color": "9AE4E8",
"verified": false,
"geo_enabled": false,
"time_zone": "Eastern Time (US & Canada)",
"description": "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"statuses_count": 7579,
"friends_count": 348,
"following": null,
"show_all_inline_media": true,
"screen_name": "bullcityrecords"
},
"in_reply_to_screen_name": null,
"source": "web",
"in_reply_to_status_id": null
},
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 23:30:20 +0000 2012",
"id_str": "249289491129438208",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "freebandnames",
"indices": [
29,
43
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Mexican Heaven, Mexican Hell #freebandnames",
"metadata": {
"iso_language_code": "en",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249289491129438208,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "99CC33",
"profile_sidebar_border_color": "829D5E",
"profile_background_tile": false,
"name": "Thomas John Wakeman",
"profile_image_url": "http://a0.twimg.com/profile_images/2219333930/Froggystyle_normal.png",
"created_at": "Tue Sep 01 21:21:35 +0000 2009",
"location": "Kingston New York",
"follow_request_sent": null,
"profile_link_color": "D02B55",
"is_translator": false,
"id_str": "70789458",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "",
"indices": [
0,
0
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 19,
"url": null,
"profile_image_url_https": "https://si0.twimg.com/profile_images/2219333930/Froggystyle_normal.png",
"utc_offset": -18000,
"id": 70789458,
"profile_use_background_image": true,
"listed_count": 1,
"profile_text_color": "3E4415",
"lang": "en",
"followers_count": 63,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme5/bg.gif",
"profile_background_color": "352726",
"verified": false,
"geo_enabled": false,
"time_zone": "Eastern Time (US & Canada)",
"description": "Science Fiction Writer, sort of. Likes Superheroes, Mole People, Alt. Timelines.",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/images/themes/theme5/bg.gif",
"statuses_count": 1048,
"friends_count": 63,
"following": null,
"show_all_inline_media": false,
"screen_name": "MonkiesFist"
},
"in_reply_to_screen_name": null,
"source": "web",
"in_reply_to_status_id": null
},
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 22:51:18 +0000 2012",
"id_str": "249279667666817024",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "freebandnames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "The Foolish Mortals #freebandnames",
"metadata": {
"iso_language_code": "en",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249279667666817024,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "BFAC83",
"profile_sidebar_border_color": "615A44",
"profile_background_tile": true,
"name": "Marty Elmer",
"profile_image_url": "http://a0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png",
"created_at": "Mon May 04 00:05:00 +0000 2009",
"location": "Wisconsin, USA",
"follow_request_sent": null,
"profile_link_color": "3B2A26",
"is_translator": false,
"id_str": "37539828",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "http://www.omnitarian.me",
"indices": [
0,
24
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 647,
"url": "http://www.omnitarian.me",
"profile_image_url_https": "https://si0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png",
"utc_offset": -21600,
"id": 37539828,
"profile_use_background_image": true,
"listed_count": 52,
"profile_text_color": "000000",
"lang": "en",
"followers_count": 608,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/106455659/rect6056-9.png",
"profile_background_color": "EEE3C4",
"verified": false,
"geo_enabled": false,
"time_zone": "Central Time (US & Canada)",
"description": "Cartoonist, Illustrator, and T-Shirt connoisseur",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/106455659/rect6056-9.png",
"statuses_count": 3575,
"friends_count": 249,
"following": null,
"show_all_inline_media": true,
"screen_name": "Omnitarian"
},
"in_reply_to_screen_name": null,
"source": "<a href=\"//twitter.com/download/iphone%5C%22\" rel=\"\\\"nofollow\\\"\">Twitter for iPhone</a>",
"in_reply_to_status_id": null
}
],
"search_metadata": {
"max_id": 250126199840518145,
"since_id": 24012619984051000,
"refresh_url": "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1",
"next_results": "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed",
"count": 4,
"completed_in": 0.035,
"since_id_str": "24012619984051000",
"query": "%23freebandnames",
"max_id_str": "250126199840518145",
"something": "something 🧰"
}
}`)
https://gist.github.com/slaise/9b9d63e0d59e8c8923bbd9d53f5beb61 https://medium.com/geekculture/my-golang-json-evaluation-20a9ca6ef79c
var TEST_DATA_UPDATE = json.RawMessage(`{
"statuses": [
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Mon Sep 24 03:35:21 +0000 2012",
"id_str": "250075927172759552",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "freebandnames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Aggressive Ponytail #freebandnames",
"metadata": {
"iso_language_code": "en",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 250075927172759552,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "DDEEF6",
"profile_sidebar_border_color": "C0DEED",
"profile_background_tile": false,
"name": "Sean Cummings",
"profile_image_url": "http://a0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg",
"created_at": "Mon Apr 26 06:01:55 +0000 2010",
"location": "LA, CA",
"follow_request_sent": null,
"profile_link_color": "0084B4",
"is_translator": false,
"id_str": "137238150",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "",
"indices": [
0,
0
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": true,
"contributors_enabled": false,
"favourites_count": 0,
"url": null,
"profile_image_url_https": "https://si0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg",
"utc_offset": -28800,
"id": 137238150,
"profile_use_background_image": true,
"listed_count": 2,
"profile_text_color": "333333",
"lang": "en",
"followers_count": 70,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme1/bg.png",
"profile_background_color": "C0DEED",
"verified": false,
"geo_enabled": true,
"time_zone": "Pacific Time (US & Canada)",
"description": "Born 330 Live 310",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/images/themes/theme1/bg.png",
"statuses_count": 579,
"friends_count": 110,
"following": null,
"show_all_inline_media": false,
"screen_name": "sean_cummings"
},
"in_reply_to_screen_name": null,
"source": "<a href=\"//itunes.apple.com/us/app/twitter/id409789998?mt=12%5C%22\" rel=\"\\\"nofollow\\\"\">Twitter for Mac</a>",
"in_reply_to_status_id": null
},
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 23:40:54 +0000 2012",
"id_str": "249292149810667520",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "FreeBandNames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Thee Namaste Nerdz. #FreeBandNames",
"metadata": {
"iso_language_code": "pl",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249292149810667520,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "DDFFCC",
"profile_sidebar_border_color": "BDDCAD",
"profile_background_tile": true,
"name": "Chaz Martenstein",
"profile_image_url": "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"created_at": "Tue Apr 07 19:05:07 +0000 2009",
"location": "Durham, NC",
"follow_request_sent": null,
"profile_link_color": "0084B4",
"is_translator": false,
"id_str": "29516238",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "http://bullcityrecords.com/wnng/",
"indices": [
0,
32
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 8,
"url": "http://bullcityrecords.com/wnng/",
"profile_image_url_https": "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"utc_offset": -18000,
"id": 29516238,
"profile_use_background_image": true,
"listed_count": 118,
"profile_text_color": "333333",
"lang": "en",
"followers_count": 2052,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"profile_background_color": "9AE4E8",
"verified": false,
"geo_enabled": false,
"time_zone": "Eastern Time (US & Canada)",
"description": "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"statuses_count": 7579,
"friends_count": 348,
"following": null,
"show_all_inline_media": true,
"screen_name": "bullcityrecords"
},
"in_reply_to_screen_name": null,
"source": "web",
"in_reply_to_status_id": null
},
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 23:30:20 +0000 2012",
"id_str": "249289491129438208",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "freebandnames",
"indices": [
29,
43
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Mexican Heaven, Mexican Hell #freebandnames",
"metadata": {
"iso_language_code": "en",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249289491129438208,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "99CC33",
"profile_sidebar_border_color": "829D5E",
"profile_background_tile": false,
"name": "Thomas John Wakeman",
"profile_image_url": "http://a0.twimg.com/profile_images/2219333930/Froggystyle_normal.png",
"created_at": "Tue Sep 01 21:21:35 +0000 2009",
"location": "Kingston New York",
"follow_request_sent": null,
"profile_link_color": "D02B55",
"is_translator": false,
"id_str": "70789458",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "",
"indices": [
0,
0
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 19,
"url": null,
"profile_image_url_https": "https://si0.twimg.com/profile_images/2219333930/Froggystyle_normal.png",
"utc_offset": -18000,
"id": 70789458,
"profile_use_background_image": true,
"listed_count": 1,
"profile_text_color": "3E4415",
"lang": "en",
"followers_count": 63,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme5/bg.gif",
"profile_background_color": "352726",
"verified": false,
"geo_enabled": false,
"time_zone": "Eastern Time (US & Canada)",
"description": "Science Fiction Writer, sort of. Likes Superheroes, Mole People, Alt. Timelines.",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/images/themes/theme5/bg.gif",
"statuses_count": 1048,
"friends_count": 63,
"following": null,
"show_all_inline_media": false,
"screen_name": "MonkiesFist"
},
"in_reply_to_screen_name": null,
"source": "web",
"in_reply_to_status_id": null
},
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 22:51:18 +0000 2012",
"id_str": "249279667666817024",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "freebandnames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "The Foolish Mortals #freebandnames",
"metadata": {
"iso_language_code": "en",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249279667666817024,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user": {
"profile_sidebar_fill_color": "BFAC83",
"profile_sidebar_border_color": "615A44",
"profile_background_tile": true,
"name": "Marty Elmer",
"profile_image_url": "http://a0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png",
"created_at": "Mon May 04 00:05:00 +0000 2009",
"location": "Wisconsin, USA",
"follow_request_sent": null,
"profile_link_color": "3B2A26",
"is_translator": false,
"id_str": "37539828",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "http://www.omnitarian.me",
"indices": [
0,
24
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 647,
"url": "http://www.omnitarian.me",
"profile_image_url_https": "https://si0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png",
"utc_offset": -21600,
"id": 37539828,
"profile_use_background_image": true,
"listed_count": 52,
"profile_text_color": "000000",
"lang": "en",
"followers_count": 608,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/106455659/rect6056-9.png",
"profile_background_color": "EEE3C4",
"verified": false,
"geo_enabled": false,
"time_zone": "Central Time (US & Canada)",
"description": "Cartoonist, Illustrator, and T-Shirt connoisseur",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/106455659/rect6056-9.png",
"statuses_count": 3575,
"friends_count": 249,
"following": null,
"show_all_inline_media": true,
"screen_name": "Omnitarian"
},
"in_reply_to_screen_name": null,
"source": "<a href=\"//twitter.com/download/iphone%5C%22\" rel=\"\\\"nofollow\\\"\">Twitter for iPhone</a>",
"in_reply_to_status_id": null
}
],
"search_metadata": {
"max_id": 250126199840518145,
"since_id": 24012619984051000,
"refresh_url": "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1",
"next_results": "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed",
"count": 4,
"completed_in": 0.035,
"since_id_str": "24012619984051000",
"query": "%23freebandnames",
"max_id_str": "250126199840518145",
"something": "something else 🧰"
}
}`)
Functions ¶
func NoopFilter ¶
NoopFilter open noop filter
func StorageGetNRangeTest ¶
StorageGetNRangeTest testing storage GetN function
func StorageGetNTest ¶
StorageGetNTest testing storage GetN function
func StorageKeysRangeTest ¶
StorageKeysRangeTest testing storage GetN function
func StorageListTest ¶
StorageListTest testing storage function
func StorageObjectTest ¶
StorageObjectTest testing storage function
func StorageSetGetDelTest ¶
StorageSetGetDelTest testing storage function
func StreamBroadcastFilterTest ¶
StreamBroadcastFilterTest testing stream function
func StreamBroadcastForcePatchTest ¶
StreamBroadcastForcePatchTest testing stream function
func StreamBroadcastNoPatchTest ¶
StreamBroadcastNoPatchTest testing stream function
func StreamBroadcastTest ¶
StreamBroadcastTest testing stream function
func StreamGlobBroadcastTest ¶
StreamGlobBroadcastTest testing stream function
func StreamItemGlobBroadcastTest ¶
StreamItemGlobBroadcastTest testing stream function
func WatchStorageNoop ¶
func WatchStorageNoop(dataStore Database)
WatchStorageNoop a noop reader of the watch channel
Types ¶
type Apply ¶
Apply filter function type for functions will serve as filters key: the key to filter data: the data received or about to be sent returns data: to be stored or sent to the client error: will prevent data to pass the filter
type Database ¶
type Database interface { Active() bool Start(StorageOpt) error Close() Keys() ([]byte, error) KeysRange(path string, from, to int64) ([]string, error) Get(key string) ([]byte, error) GetDescending(key string) ([]byte, error) GetN(path string, limit int) ([]meta.Object, error) GetNAscending(path string, limit int) ([]meta.Object, error) GetNRange(path string, limit int, from, to int64) ([]meta.Object, error) Set(key string, data json.RawMessage) (string, error) Patch(key string, data json.RawMessage) (string, error) SetWithMeta(key string, data json.RawMessage, created, updated int64) (string, error) GetAndLock(key string) ([]byte, error) SetAndUnlock(key string, data json.RawMessage) (string, error) Unlock(key string) error Del(key string) error Clear() Watch() StorageChan }
Database interface to be implemented by storages
Active: returns a boolean with the state of the storage
Start: will attempt to start a storage client
Close: closes the storage client
Keys: returns a list with existing keys in the storage
Get(key): retrieve a value or list of values, the key can include a glob pattern (ascending created time order)
GetDescending(key): retrieve a value or list of values, the key can include a glob pattern (descending created time order)
GetN(path, N): retrieve N list of values matching a glob pattern (descending created time order)
GetNAscending(path, N): retrieve N list of values matching a glob pattern (ascending created time order)
GetNRange(path, N, from, to): retrieve N list of values matching a glob pattern path created in the time from-to time range (descending created time order)
Set(key, data): store data under the provided key, key cannot not include glob pattern
SetWithMeta(key, data, created, updated): store data by manually providing created/updated time values
GetAndLock(key): same as get but will lock the key mutex until SetAndUnlock is called for the same key (non glob key only)
SetAndUnlock(key, data): same as set but will unlock the key mutex (non glob key only)
Unlock(key): unlock key mutex
Del(key): Delete a key from the storage
Clear: will clear all data from the storage
Watch: returns a channel that will receive any set or del operation
type MemoryStorage ¶
type MemoryStorage struct {
// contains filtered or unexported fields
}
MemoryStorage composition of Database interface
func (*MemoryStorage) Active ¶
func (db *MemoryStorage) Active() bool
Active provides access to the status of the storage client
func (*MemoryStorage) Del ¶
func (db *MemoryStorage) Del(path string) error
Del a key/pattern value(s)
func (*MemoryStorage) Get ¶
func (db *MemoryStorage) Get(path string) ([]byte, error)
Get a key/pattern related value(s)
func (*MemoryStorage) GetAndLock ¶
func (db *MemoryStorage) GetAndLock(path string) ([]byte, error)
func (*MemoryStorage) GetDescending ¶
func (db *MemoryStorage) GetDescending(path string) ([]byte, error)
Get a key/pattern related value(s)
func (*MemoryStorage) GetNAscending ¶
GetN get last N elements of a path related value(s)
func (*MemoryStorage) Keys ¶
func (db *MemoryStorage) Keys() ([]byte, error)
Keys list all the keys in the storage
func (*MemoryStorage) KeysRange ¶
func (db *MemoryStorage) KeysRange(path string, from, to int64) ([]string, error)
KeysRange list keys in a path and time range
func (*MemoryStorage) Patch ¶
func (db *MemoryStorage) Patch(path string, data json.RawMessage) (string, error)
Set a value to matching keys
func (*MemoryStorage) Peek ¶
func (db *MemoryStorage) Peek(key string, now int64) (int64, int64)
Peek a value timestamps
func (*MemoryStorage) Set ¶
func (db *MemoryStorage) Set(path string, data json.RawMessage) (string, error)
Set a value
func (*MemoryStorage) SetAndUnlock ¶
func (db *MemoryStorage) SetAndUnlock(path string, data json.RawMessage) (string, error)
func (*MemoryStorage) SetWithMeta ¶
func (db *MemoryStorage) SetWithMeta(path string, data json.RawMessage, created int64, updated int64) (string, error)
SetWithMeta set entries with metadata created/updated values
func (*MemoryStorage) Start ¶
func (db *MemoryStorage) Start(storageOpt StorageOpt) error
Start the storage client
func (*MemoryStorage) Unlock ¶
func (db *MemoryStorage) Unlock(path string) error
func (*MemoryStorage) Watch ¶
func (db *MemoryStorage) Watch() StorageChan
Watch the storage set/del events
type Server ¶
type Server struct { Router *mux.Router Stream stream.Stream Pivot string NoBroadcastKeys []string DbOpt interface{} Audit audit Workers int ForcePatch bool NoPatch bool OnSubscribe stream.Subscribe OnUnsubscribe stream.Unsubscribe OnClose func() Deadline time.Duration AllowedOrigins []string AllowedMethods []string AllowedHeaders []string ExposedHeaders []string Storage Database Address string Silence bool Static bool Tick time.Duration Console *coat.Console Signal chan os.Signal Client *http.Client ReadTimeout time.Duration WriteTimeout time.Duration ReadHeaderTimeout time.Duration IdleTimeout time.Duration // contains filtered or unexported fields }
Server application
Router: can be predefined with routes and passed to be extended
NoBroadcastKeys: array of keys that should not broadcast on changes
DbOpt: options for storage
Audit: function to audit requests
Workers: number of workers to use as readers of the storage->broadcast channel
ForcePatch: flag to force patch operations even if the patch is bigger than the snapshot
OnSubscribe: function to monitor subscribe events
OnUnsubscribe: function to monitor unsubscribe events
OnClose: function that triggers before closing the application
Deadline: time duration of a request before timing out
AllowedOrigins: list of allowed origins for cross domain access, defaults to ["*"]
AllowedMethods: list of allowed methods for cross domain access, defaults to ["GET", "POST", "DELETE", "PUT"]
AllowedHeaders: list of allowed headers for cross domain access, defaults to ["Authorization", "Content-Type"]
ExposedHeaders: list of exposed headers for cross domain access, defaults to nil
Storage: database interdace implementation
Silence: output silence flag
Static: static routing flag
Tick: time interval between ticks on the clock subscription
Signal: os signal channel
Client: http client to make requests
Example ¶
package main import ( "github.com/benitogf/ooo" ) func main() { app := ooo.Server{} app.Start("localhost:8800") app.WaitClose() }
Output:
func (*Server) AfterWrite ¶
AfterWrite add a filter that triggers after a successful write
func (*Server) DeleteFilter ¶
func (app *Server) DeleteFilter(path string, apply ApplyDelete)
DeleteFilter add a filter that runs before sending a read result
func (*Server) OpenFilter ¶
OpenFilter open noop read and write filters
func (*Server) ReadFilter ¶
ReadFilter add a filter that runs before sending a read result
func (*Server) WaitClose ¶
func (app *Server) WaitClose()
WaitClose : Blocks waiting for SIGINT, SIGTERM, SIGKILL, SIGHUP
func (*Server) WriteFilter ¶
WriteFilter add a filter that triggers on write
type StorageEvent ¶
StorageEvent an operation event
type StorageOpt ¶
type StorageOpt struct { NoBroadcastKeys []string DbOpt interface{} }
StorageOpt options of the storage instance