@@ -246,4 +246,165 @@ describe("unit tests", async () => {
246246 const response = await worker . fetch ( request , env , ctx ) ;
247247 expect ( await response . text ( ) ) . toEqual ( "hello from user worker" ) ;
248248 } ) ;
249+
250+ describe ( "free tier limiting" , ( ) => {
251+ it ( "returns fetch from asset worker for assets" , async ( ) => {
252+ const request = new Request ( "https://example.com/asset" ) ;
253+ const ctx = createExecutionContext ( ) ;
254+
255+ const env = {
256+ CONFIG : {
257+ has_user_worker : true ,
258+ } ,
259+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
260+ USER_WORKER : {
261+ async fetch ( _ : Request ) : Promise < Response > {
262+ return new Response ( "hello from user worker" ) ;
263+ } ,
264+ } ,
265+ ASSET_WORKER : {
266+ async fetch ( _ : Request ) : Promise < Response > {
267+ return new Response ( "hello from asset worker" ) ;
268+ } ,
269+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
270+ return true ;
271+ } ,
272+ } ,
273+ } as Env ;
274+
275+ const response = await worker . fetch ( request , env , ctx ) ;
276+ expect ( await response . text ( ) ) . toEqual ( "hello from asset worker" ) ;
277+ } ) ;
278+
279+ it ( "returns error page instead of user worker when no asset found" , async ( ) => {
280+ const request = new Request ( "https://example.com/asset" ) ;
281+ const ctx = createExecutionContext ( ) ;
282+
283+ const env = {
284+ CONFIG : {
285+ has_user_worker : true ,
286+ } ,
287+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
288+ USER_WORKER : {
289+ async fetch ( _ : Request ) : Promise < Response > {
290+ return new Response ( "hello from user worker" ) ;
291+ } ,
292+ } ,
293+ ASSET_WORKER : {
294+ async fetch ( _ : Request ) : Promise < Response > {
295+ return new Response ( "hello from asset worker" ) ;
296+ } ,
297+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
298+ return false ;
299+ } ,
300+ } ,
301+ } as Env ;
302+
303+ const response = await worker . fetch ( request , env , ctx ) ;
304+ expect ( response . status ) . toEqual ( 429 ) ;
305+ const text = await response . text ( ) ;
306+ expect ( text ) . not . toEqual ( "hello from user worker" ) ;
307+ expect ( text ) . toContain ( "This website has been temporarily rate limited" ) ;
308+ } ) ;
309+
310+ it ( "returns error page instead of user worker for invoke_user_worker_ahead_of_assets" , async ( ) => {
311+ const request = new Request ( "https://example.com/asset" ) ;
312+ const ctx = createExecutionContext ( ) ;
313+
314+ const env = {
315+ CONFIG : {
316+ has_user_worker : true ,
317+ invoke_user_worker_ahead_of_assets : true ,
318+ } ,
319+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
320+ USER_WORKER : {
321+ async fetch ( _ : Request ) : Promise < Response > {
322+ return new Response ( "hello from user worker" ) ;
323+ } ,
324+ } ,
325+ ASSET_WORKER : {
326+ async fetch ( _ : Request ) : Promise < Response > {
327+ return new Response ( "hello from asset worker" ) ;
328+ } ,
329+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
330+ return true ;
331+ } ,
332+ } ,
333+ } as Env ;
334+
335+ const response = await worker . fetch ( request , env , ctx ) ;
336+ expect ( response . status ) . toEqual ( 429 ) ;
337+ const text = await response . text ( ) ;
338+ expect ( text ) . not . toEqual ( "hello from user worker" ) ;
339+ expect ( text ) . toContain ( "This website has been temporarily rate limited" ) ;
340+ } ) ;
341+
342+ it ( "returns error page instead of user worker for include rules" , async ( ) => {
343+ const request = new Request ( "https://example.com/api/asset" ) ;
344+ const ctx = createExecutionContext ( ) ;
345+
346+ const env = {
347+ CONFIG : {
348+ has_user_worker : true ,
349+ static_routing : {
350+ version : 1 ,
351+ include : [ "/api/*" ] ,
352+ } ,
353+ } ,
354+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
355+ USER_WORKER : {
356+ async fetch ( _ : Request ) : Promise < Response > {
357+ return new Response ( "hello from user worker" ) ;
358+ } ,
359+ } ,
360+ ASSET_WORKER : {
361+ async fetch ( _ : Request ) : Promise < Response > {
362+ return new Response ( "hello from asset worker" ) ;
363+ } ,
364+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
365+ return true ;
366+ } ,
367+ } ,
368+ } as Env ;
369+
370+ const response = await worker . fetch ( request , env , ctx ) ;
371+ expect ( response . status ) . toEqual ( 429 ) ;
372+ const text = await response . text ( ) ;
373+ expect ( text ) . not . toEqual ( "hello from user worker" ) ;
374+ expect ( text ) . toContain ( "This website has been temporarily rate limited" ) ;
375+ } ) ;
376+
377+ it ( "returns fetch from asset worker for exclude rules" , async ( ) => {
378+ const request = new Request ( "https://example.com/api/asset" ) ;
379+ const ctx = createExecutionContext ( ) ;
380+
381+ const env = {
382+ CONFIG : {
383+ has_user_worker : true ,
384+ static_routing : {
385+ version : 1 ,
386+ include : [ "/api/*" ] ,
387+ exclude : [ "/api/asset" ] ,
388+ } ,
389+ } ,
390+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
391+ USER_WORKER : {
392+ async fetch ( _ : Request ) : Promise < Response > {
393+ return new Response ( "hello from user worker" ) ;
394+ } ,
395+ } ,
396+ ASSET_WORKER : {
397+ async fetch ( _ : Request ) : Promise < Response > {
398+ return new Response ( "hello from asset worker" ) ;
399+ } ,
400+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
401+ return true ;
402+ } ,
403+ } ,
404+ } as Env ;
405+
406+ const response = await worker . fetch ( request , env , ctx ) ;
407+ expect ( await response . text ( ) ) . toEqual ( "hello from asset worker" ) ;
408+ } ) ;
409+ } ) ;
249410} ) ;
0 commit comments