@@ -246,4 +246,163 @@ 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 user_worker 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+ user_worker : [ "/api/*" ] ,
351+ } ,
352+ } ,
353+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
354+ USER_WORKER : {
355+ async fetch ( _ : Request ) : Promise < Response > {
356+ return new Response ( "hello from user worker" ) ;
357+ } ,
358+ } ,
359+ ASSET_WORKER : {
360+ async fetch ( _ : Request ) : Promise < Response > {
361+ return new Response ( "hello from asset worker" ) ;
362+ } ,
363+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
364+ return true ;
365+ } ,
366+ } ,
367+ } as Env ;
368+
369+ const response = await worker . fetch ( request , env , ctx ) ;
370+ expect ( response . status ) . toEqual ( 429 ) ;
371+ const text = await response . text ( ) ;
372+ expect ( text ) . not . toEqual ( "hello from user worker" ) ;
373+ expect ( text ) . toContain ( "This website has been temporarily rate limited" ) ;
374+ } ) ;
375+
376+ it ( "returns fetch from asset worker for asset_worker rules" , async ( ) => {
377+ const request = new Request ( "https://example.com/api/asset" ) ;
378+ const ctx = createExecutionContext ( ) ;
379+
380+ const env = {
381+ CONFIG : {
382+ has_user_worker : true ,
383+ static_routing : {
384+ user_worker : [ "/api/*" ] ,
385+ asset_worker : [ "/api/asset" ] ,
386+ } ,
387+ } ,
388+ EYEBALL_CONFIG : { limitedAssetsOnly : true } ,
389+ USER_WORKER : {
390+ async fetch ( _ : Request ) : Promise < Response > {
391+ return new Response ( "hello from user worker" ) ;
392+ } ,
393+ } ,
394+ ASSET_WORKER : {
395+ async fetch ( _ : Request ) : Promise < Response > {
396+ return new Response ( "hello from asset worker" ) ;
397+ } ,
398+ async unstable_canFetch ( _ : Request ) : Promise < boolean > {
399+ return true ;
400+ } ,
401+ } ,
402+ } as Env ;
403+
404+ const response = await worker . fetch ( request , env , ctx ) ;
405+ expect ( await response . text ( ) ) . toEqual ( "hello from asset worker" ) ;
406+ } ) ;
407+ } ) ;
249408} ) ;
0 commit comments